العمل حول علة Python في إصدارات مختلفة
-
01-10-2019 - |
سؤال
لقد صادفت خطأ في بيثون (على الأقل في 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 الذي يتم استخدامه بشكل خاطئ.
فهل هناك طريقة أفضل للترويج حول هذا النوع من المشكلات بحيث ستعمل على جميع الإصدارات ، ويفضل أن يكون ذلك دون إبطاءها في الثعبان العاملة؟
المحلول
بالنسبة لحالات كهذه ، من الجيد أن نتذكر أن أ 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 بشكل صريح!
لا يزال الخطأ نفسه (ويبدو أنه بالتأكيد واحد) موجودًا في بيثون 2.6.5 ، لكنني لم أجد أي ذكر لها في bugs.python.org, ، لذلك ربما تم إصلاحه عن طريق الصدفة في 2.7! يبدو وكأنه ميزة Python 3 المنبثقة التي لم يتم اختبارها بشكل صحيح في 2.6.
نصائح أخرى
يمكنك أيضًا إنشاء وظيفتك الخاصة للقيام بالعمل ، مشروطة بما تحتاجه:
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 أو آلات الاستثناء.