2010-09-08 6 views
5

मैं bytearray.fromhex फ़ंक्शन के लिए पाइथन (कम से कम 2.6.1) में एक बग में आया हूं।विभिन्न संस्करणों में पायथन बग के आसपास काम करना

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

यह उदाहरण पायथन 2.7 में ठीक काम करता है, और मैं समस्या को हल कोडिंग के लिए सबसे अच्छा तरीका जानना चाहता हूँ: अगर आप docstring से उदाहरण की कोशिश क्या होता है। मैं हमेशा यूनिकोड में कनवर्ट नहीं करना चाहता क्योंकि यह एक प्रदर्शन हिट है, और परीक्षण जो पाइथन संस्करण का उपयोग किया जा रहा है, गलत लगता है।

तो क्या इस तरह की समस्या के आसपास कोड करने का एक बेहतर तरीका है ताकि यह सभी संस्करणों के लिए काम करेगा, अधिमानतः काम करने वाले पायथन के लिए इसे धीमा किए बिना?

उत्तर

8

इस तरह के मामलों के लिए यह याद रखना अच्छा है कि try ब्लॉक कोई सस्ता नहीं होने पर बहुत सस्ता है। इसलिए मैं का उपयोग करेंगे:

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

यह एक छोटा प्रदर्शन हिट के साथ देता है अजगर 2.6 काम है, लेकिन 2.7 बिल्कुल पीड़ित नहीं होना चाहिए। निश्चित रूप से पायथन संस्करण की जांच करना बेहतर है!

बग स्वयं (और यह निश्चित रूप से एक प्रतीत होता है) अभी भी पायथन 2.6.5 में मौजूद है, लेकिन मुझे bugs.python.org पर इसका कोई उल्लेख नहीं मिला, तो शायद यह 2.7 में दुर्घटना से तय हो गया था! यह बैक-पोर्टेड पायथन 3 फीचर की तरह दिखता है जिसे 2.6 में ठीक से परीक्षण नहीं किया गया था।

3

तुम भी काम करते हैं, आपको क्या चाहिए पर conditionalized करने के लिए अपने स्वयं के समारोह बना सकते हैं:

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 का उपयोग करें। इस तरह, अपवाद केवल एक बार होता है, और आपके रनटाइम के दौरान, सही फ़ंक्शन का उपयोग अतिरिक्त यूनिकोड कास्टिंग या अपवाद मशीनरी के बिना किया जाता है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^