解决不同版本的Python bug

时间:2010-09-08 18:30:26

标签: python python-2.7 python-2.6

我在bytearray.fromhex函数中遇到了Python(至少在2.6.1中)的错误。如果您尝试使用docstring中的示例,则会发生这种情况:

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

这个例子在Python 2.7中运行良好,我想知道编码问题的最佳方法。我不想总是转换为unicode,因为它会影响性能,并且测试使用哪个Python版本会感觉不对。

那么有没有更好的方法来编码这类问题,以便它适用于所有版本,最好不要为工作的Pythons减慢速度?

2 个答案:

答案 0 :(得分:8)

对于这样的情况,记住如果没有抛出异常,try块非常便宜是很好的。所以我会用:

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

这使得Python 2.6的性能受到很小影响,但2.7应该不会受到影响。当然最好明确检查Python版本!

错误本身(它似乎确实是一个)仍然存在于Python 2.6.5中,但我在bugs.python.org找不到任何提及它,所以它可能是偶然修复的2.7!它看起来像是一个后端移植的Python 3功能,在2.6中没有正确测试。

答案 1 :(得分:3)

您还可以根据需要创建自己的功能来完成工作:

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

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

然后在代码中使用my_fromhex。这样,异常只发生一次,并且在运行时,使用正确的函数而没有多余的unicode强制转换或异常机制。