2010-09-08 27 views
5

Tôi đã gặp lỗi trong Python (ít nhất là trong 2.6.1) cho hàm bytearray.fromhex. Đây là điều xảy ra nếu bạn thử ví dụ từ docstring:Làm việc xung quanh lỗi Python trong các phiên bản khác nhau

>>> bytearray.fromhex('B9 01EF') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: fromhex() argument 1 must be unicode, not str 

Ví dụ này hoạt động tốt trong Python 2.7 và tôi muốn biết cách tốt nhất để viết mã xung quanh vấn đề. Tôi không muốn luôn luôn chuyển đổi sang unicode vì nó là một hit hiệu suất, và thử nghiệm phiên bản Python nào đang được sử dụng cảm thấy sai.

Vì vậy, có cách nào tốt hơn để mã xung quanh loại vấn đề này để nó sẽ hoạt động cho tất cả các phiên bản, tốt nhất là không làm chậm nó xuống cho các Pythons làm việc?

Trả lời

8

Đối với các trường hợp như vậy, bạn nên nhớ rằng khối try rất rẻ nếu không có ngoại lệ. Vì vậy, tôi muốn sử dụng:

try: 
    x = bytearray.fromhex(some_str) 
except TypeError: 
    # Work-around for Python 2.6 bug 
    x = bytearray.fromhex(unicode(some_str)) 

Điều này cho phép Python 2.6 hoạt động với hiệu suất nhỏ, nhưng 2.7 không bị ảnh hưởng gì cả. Nó chắc chắn là thích hợp hơn để kiểm tra phiên bản Python một cách rõ ràng!

Bản thân lỗi (và chắc chắn nó có vẻ là một) vẫn tồn tại trong Python 2.6.5, nhưng tôi không thể tìm thấy bất kỳ đề cập nào về nó tại bugs.python.org, vì vậy có thể nó đã được cố định một cách tình cờ trong 2.7! Nó trông giống như một tính năng Python 3 được chuyển đổi ngược lại không được kiểm tra đúng trong 2.6.

3

Bạn cũng có thể tạo chức năng của riêng bạn để làm công việc, conditionalized vào những gì bạn cần:

def my_fromhex(s): 
    return bytearray.fromhex(s) 

try: 
    my_fromhex('hello') 
except TypeError: 
    def my_fromhex(s): 
     return bytearray.fromhex(unicode(s)) 

và sau đó sử dụng my_fromhex trong mã của bạn. Bằng cách này, ngoại lệ chỉ xảy ra một lần và trong thời gian chạy của bạn, chức năng chính xác được sử dụng mà không cần máy đúc hoặc máy ngoại lệ dư thừa.

Các vấn đề liên quan