2009-06-16 6 views
12

पायथन 2.6 (और पहले) hex() और oct() अंतर्निहित कार्यों को __hex__ और __oct__ विशेष कार्यों को परिभाषित करके कक्षा में ओवरलोड किया जा सकता है। हालांकि पाइथन 2.6 के नए bin() अंतर्निहित फ़ंक्शन के व्यवहार को ओवरलोड करने के लिए __bin__ विशेष फ़ंक्शन नहीं है।पाइथन 2.6 में oct() और हेक्स() जैसे बिन() को ओवरलोड किया जा सकता है?

मैं जानना चाहता हूं कि bin() को लचीला रूप से ओवरलोड करने का कोई तरीका है, और यदि नहीं, तो मैं सोच रहा था कि असंगत इंटरफ़ेस क्यों?

मुझे पता है कि __index__ विशेष फ़ंक्शन का उपयोग किया जा सकता है, लेकिन यह लचीला नहीं है क्योंकि यह केवल एक पूर्णांक लौटा सकता है। मेरे विशेष उपयोग के मामले bitstring मॉड्यूल, जहां आगे शून्य बिट्स महत्वपूर्ण समझे जाते हैं से है:

>>> a = BitString(length=12)  # Twelve zero bits 
>>> hex(a) 
'0x000' 
>>> oct(a) 
'0o0000' 
>>> bin(a) 
'0b0' <------ I want it to output '0b000000000000' 

मुझे लगता है इस को प्राप्त करने का कोई तरीका नहीं है कि वहाँ है, लेकिन मैंने सोचा कि यह पूछने के लिए चोट नहीं होता!

उत्तर

4

मुझे लगता है कि संक्षिप्त उत्तर 'नहीं, bin()oct() और hex() जैसे अधिभारित नहीं किया जा सकता है।'

क्यों, इस सवाल का जवाब hex(), oct() और bin(), ओवरलोड अजगर 3.0 है, जो __index__ का उपयोग करता है के साथ होनी चाहिए और पूरी तरह __oct__ और __hex__ विशेष कार्य हटा दिया गया है के रूप में।

तो पायथन 2.6 bin() ऐसा लगता है कि यह वास्तव में एक पायथन 3.0 फीचर है जो बिना किसी विचार के बैक-पोर्ट किया गया है कि यह पुराने पायथन 2 तरीके के बजाय नए पायथन 3 तरीके से काम कर रहा है। मुझे यह भी लगता है कि यह तय करने की संभावना नहीं है, भले ही इसे एक बग माना जाता है।

1

बिन फ़ंक्शन ऑब्जेक्ट के __index__ फ़ंक्शन से इसका मान प्राप्त करता है। तो किसी ऑब्जेक्ट के लिए, आप बाइनरी में परिवर्तित मान को परिभाषित कर सकते हैं, लेकिन आप स्ट्रिंग के प्रारूप को परिभाषित नहीं कर सकते हैं।

0

आप उस वस्तु पारित किया जा रहा पर बिन कॉल करने का प्रयास और मानक बिन करने के लिए वापस गिर गया हेक्स के लिए और अक्टूबर अधिभावी/अपने स्वयं के कार्यान्वयन के साथ बिन में बनाया() फ़ंक्शन की जगह के रूप में ही व्यवहार को प्राप्त कर सकता है () फ़ंक्शन अगर ऑब्जेक्ट बिन प्रदान नहीं करता है। हालांकि, इस आधार पर स्पष्ट रूप से स्पष्ट है कि बिन() के कस्टम संस्करण पर निर्भर होने के लिए आपके आवेदन को कोड करना संभवतः एक अच्छा विचार नहीं है, इसलिए शायद फ़ंक्शन को एक अलग नाम दें।

def mybin(n): 
    try: 
     return n.__bin__() 
    except AttributeError: 
     return bin(n) 

इंटरफ़ेस में असंगतता के कारण, मुझे यकीन नहीं है। शायद ऐसा इसलिए है क्योंकि बिन() को हाल ही में जोड़ा गया था, इसलिए यह मामूली निगरानी है?

11

जैसा कि आप पहले से ही खोज चुके हैं, आप bin() को ओवरराइड नहीं कर सकते हैं, लेकिन ऐसा लगता है कि आपको ऐसा करने की आवश्यकता नहीं है। आप बस 0-गद्दीदार बाइनरी मान चाहते हैं। दुर्भाग्यवश पाइथन 2.5 और पिछले में, आप बाइनरी इंगित करने के लिए "% b" का उपयोग नहीं कर सके, इसलिए आप इच्छित परिणाम प्राप्त करने के लिए "%" स्ट्रिंग स्वरूपण ऑपरेटर का उपयोग नहीं कर सकते।

सौभाग्य से python 2.6 नई str.format() विधि के रूप में आप जो चाहते हैं उसे पेश करता है। मेरा मानना ​​है कि लाइन शोर के इस विशेष बिट के लिए आप क्या देख रहे हैं यह है कि:

>>> '{0:010b}'.format(19) 
'0000010011' 

इस छोटे-भाषा के लिए वाक्य रचना "format specification mini-language" डॉक्स में चल रहा है। आप कुछ समय बचाने के लिए, मैं स्ट्रिंग है कि मैं उपयोग कर रहा हूँ समझाएंगे:

  1. पैरामीटर शून्य (यानी 19) प्रारूप में होना चाहिए,
  2. एक जादू "0" संकेत मिलता है कि मैं 0- चाहते का उपयोग कर
  3. बाइनरी प्रारूप में, गद्देदार, दाएं संरेखित संख्या के साथ।

आप इस वाक्यविन्यास का उपयोग संरेखण और पैडिंग के विभिन्न रचनात्मक संस्करणों को प्राप्त करने के लिए कर सकते हैं।

+0

धन्यवाद, यह जानना उपयोगी है। हालांकि मैंने पहले से ही फॉर्म में आउटपुट प्राप्त करने में कामयाब रहा है, मैं बस इसे वापस लौटने के लिए बिन फ़ंक्शन नहीं मिला। आपकी str.format विधि हालांकि मैंने उपयोग की गई विधि से काफी संक्षिप्त है! –

+0

यह भी देखें http://stackoverflow.com/questions/3258330/converting-from-hex-to-binary-without-losing-leading-0s-python – endolith

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

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