2012-11-02 16 views
5

Znalazłem dziwne zachowanie w module dziesiętnym. „Podpis” po przecinku wynosi:Wywoływanie klasy dziesiętnej

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

Tak, mam, że mogę zrobić coś takiego: Decimal('3', None). Ale ten kod wywołuje wyjątek TypeError w python3.3, ale nie w python2.7.

Podczas moich badań próbowałem debugowania za pomocą pdb: pdb.set_trace("Decimal('3', None)"), ale nic się nie stało! Po wpisaniu s zostanie zgłoszony ten sam wyjątek.

Czy ktoś może wyjaśnić przyczyny tych zachowań?

+0

Co jest warte, nie mogę tego odtworzyć w Pythonie 3.2.3: 'import dziesiętny; decimal.Decimal ("3", None) 'z powodzeniem zwraca' Decimal ('3') '. –

+2

[To błąd] (http://bugs.python.org/issue15783) – SilentGhost

+0

@SilentGhost: Widzę w linku, że to błąd w wersji c akceleratora modułu (cokolwiek to jest). To może wyjaśnić, dlaczego nic nie otrzymuję z pdb. Ale czy mogę określić, że chcę czystej wersji Pythona? –

Odpowiedz

3

Potrafię potwierdzić zachowanie Pythona 3.3. W jakiś sposób wykrywa, że ​​przekazałeś None jako kontekst i to się nie podoba (nawet jeśli jest to udokumentowane jako wartość domyślna).

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') 

Aktualizacja: ale działa z 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') 
>>> 

Aktualizacja: Powodem można znaleźć w dok ...

What’s New In Python 3.3 mówi:

dziesiętna

wydanie 7652 - zintegruj szybką natywną arytmetykę dziesiętną. Moduł C i libmpdec napisane przez Stefana Kraha.

Porównując decimal.py pliki, mogą one wyglądać tak samo na początku, ale wersja Pythona 3.3 zawiera następujący kod niemal na końcu:

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 * 

... natomiast starsze Python 3.2 robi nie. Mówi, że jeśli implementacja binarna może zostać zaimportowana, starsza implementacja z decimal.py jest ignorowana. I nie można debugować modułu binarnego za pomocą debuggera kodu Python.

Pytanie brzmi, czy zaobserwowane zachowanie nie powinno być uważane za błąd.

+0

jak powiedziałem, chcę tylko zrozumieć to zachowanie i dlaczego nie widzę wykonywania kodu z pdb. W moim kodzie używam brzydkiego obejścia (testuję 'context' i wywołuje odpowiedni formularz). –

+0

@GTux: Zobacz ostatnią aktualizację odpowiedzi. – pepr

+0

dzięki, teraz rozumiem. O twoim pytaniu, najwyraźniej błąd jest już otwarty, zobacz komentarz SilentGhost. –

Powiązane problemy