5

関数に関する Python (少なくとも 2.6.1) のバグに遭遇しましたbytearray.fromhex。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 で問題なく動作します。この問題を回避するための最適なコーディング方法を知りたいです。パフォーマンスが低下するため、常にユニコードに変換したくはありません。また、使用されている Python のバージョンをテストするのは間違っていると感じています。

では、この種の問題を回避して、すべてのバージョンで機能するように、できれば動作中の Python の速度を落とさずにコーディングするより良い方法はありますか?

4

2 に答える 2

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 のバージョンを明示的にチェックするよりも確かに望ましいです!

バグ自体 (確かに 1 つのようです) は Python 2.6.5 にまだ存在しますが、bugs.python.orgでそれについての言及を見つけることができなかったので、2.7 で偶然修正されたのかもしれません! これは、2.6 で適切にテストされていないバックポートされた Python 3 機能のようです。

于 2010-09-08T18:31:54.553 に答える
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、コードで使用します。このように、例外は1回だけ発生し、実行時に、過剰なUnicodeキャストや例外機構なしで正しい関数が使用されます。

于 2010-09-08T19:40:38.347 に答える