2012-11-02 24 views
5

मुझे दशमलव मॉड्यूल में एक अजीब व्यवहार मिला है। वर्ग दशमलव के "हस्ताक्षर" है:इंस्टेंटियेट डेसिमल क्लास

Decimal(value='0', context=None) 

तो, मैं माना जाता है कि मैं कुछ ऐसा कर सकते हैं: Decimal('3', None)। लेकिन यह कोड python3.3 में टाइप एरर अपवाद उठाता है लेकिन पायथन 2.7 में नहीं।

मेरी जांच में, मैंने पीडीबी के साथ डीबगिंग करने की कोशिश की: pdb.set_trace("Decimal('3', None)"), लेकिन कुछ भी नहीं हुआ! जैसे ही मैं s टाइप करता हूं, वही अपवाद उठाया जाता है।

क्या कोई इन व्यवहारों के कारणों को समझा सकता है?

+0

इसके लायक होने के लिए, मैं इसे पायथन 3.2.3 के तहत पुन: उत्पन्न करने में असमर्थ हूं: 'दशमलव आयात करें; दशमलव। दशमलव ("3", कोई नहीं) 'सफलतापूर्वक 'दशमलव (' 3 ')' लौटाता है। –

+2

[यह एक बग है] (http://bugs.python.org/issue15783) – SilentGhost

+0

@SilentGost: मैं इस लिंक में देखता हूं कि यह मॉड्यूल के सी त्वरक संस्करण (जो कुछ भी है) में एक बग है। यह समझा सकता है कि मुझे पीडीबी से कुछ क्यों नहीं मिलता है। लेकिन क्या मैं निर्दिष्ट कर सकता हूं कि मुझे शुद्ध पायथन संस्करण चाहिए? –

उत्तर

3

मैं पायथन 3.3 के व्यवहार की पुष्टि कर सकता हूं। यह किसी भी तरह से पता लगाता है कि आपने संदर्भ के रूप में None पारित किया है और इसे पसंद नहीं है (भले ही इसे डिफ़ॉल्ट मान के रूप में दस्तावेज किया गया हो)।

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import decimal 
>>> decimal.Decimal('3', None) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: optional argument must be a context 
>>> decimal.Decimal('3') 
Decimal('3') 

अद्यतन: लेकिन इसके साथ 3.2.3

Python 3.2.3 (default, Apr 11 2012, 07:12:16) [MSC v.1500 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import decimal 
>>> decimal.Decimal('3', None) 
Decimal('3') 
>>> 

अद्यतन काम करता है: कारण दस्तावेज़ में पाया जा सकता है ...

What’s New In Python 3.3 का कहना है:

दशमलव

अंक 7652 - तेजी से देशी दशमलव अंकगणित एकीकृत करें। सी-मॉड्यूल और libmpdec Stefan Krah द्वारा लिखित।

जब decimal.py फ़ाइलों की तुलना, वे पहली बार में एक ही लग सकता है, लेकिन अजगर 3.3 संस्करण लगभग अंत में निम्नलिखित कोड शामिल हैं:

try: 
    import _decimal 
except ImportError: 
    pass 
else: 
    s1 = set(dir()) 
    s2 = set(dir(_decimal)) 
    for name in s1 - s2: 
     del globals()[name] 
    del s1, s2, name 
    from _decimal import * 

... जबकि बड़े अजगर 3.2 करता है नहीं। यह कहता है कि यदि बाइनरी _decimal कार्यान्वयन आयात किया जा सकता है, तो decimal.py से पुराने कार्यान्वयन को अनदेखा किया जाता है। और पाइथन-कोड डीबगर का उपयोग करके बाइनरी मॉड्यूल को डीबग नहीं किया जा सकता है।

सवाल यह है कि क्या देखा गया व्यवहार एक बग नहीं माना जाना चाहिए।

+0

जैसा कि मैंने कहा, मैं बस इस व्यवहार को समझना चाहता हूं, और मैं पीडीबी के साथ कोड निष्पादन क्यों नहीं देख सकता। मेरे कोड में, मैं एक बदसूरत कामकाज का उपयोग करता हूं (मैं 'संदर्भ' का परीक्षण करता हूं और उचित रूप कहता हूं)। –

+0

@GTux: उत्तर का अंतिम अपडेट देखें। – pepr

+0

धन्यवाद, अब मैं समझता हूं। आपके प्रश्न के बारे में, स्पष्ट रूप से बग पहले से ही खुला है, SilentGost टिप्पणी देखें। –