さまざまなバージョンのPythonバグを中心に作業しています
-
01-10-2019 - |
質問
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で正常に動作します。問題の周りでコーディングする最良の方法を知りたいと思います。パフォーマンスのヒットであるため、常にUnicodeに変換したくありません。使用されているPythonバージョンのテストは間違っていると感じます。
それで、この種の問題についてコーディングするより良い方法はあります。そうすれば、すべてのバージョンで機能することは、できれば作業用のPythonのために減速することなく機能しますか?
解決
このような場合は、それを覚えておくのは良いことです 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機能のように見えます。
他のヒント
また、必要なものを条件付けて、作業を行うために独自の関数を作成することもできます。
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
あなたのコードで。このようにして、例外は一度しか起こりません。ランタイム中に、過剰なユニコード鋳造または例外機械なしで正しい関数が使用されます。