2012-11-02 6 views
5

Ich habe ein seltsames Verhalten im Dezimal-Modul gefunden. Die „Signatur“ der Klasse Dezimal ist:Instantiate Dezimalklasse

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

So, nahm ich an, dass ich so etwas wie zu tun: Decimal('3', None). Aber dieser Code löst eine Ausnahme von TypeError in python3.3 aus, aber nicht in python2.7.

In meinen Untersuchungen habe ich versucht, mit pdb debuggen: pdb.set_trace("Decimal('3', None)"), aber nichts passiert! Sobald ich s tippe, wird die gleiche Ausnahme ausgelöst.

Kann jemand die Gründe für dieses Verhalten erklären?

+0

Für was es wert ist, kann ich dies unter Python 3.2.3 nicht reproduzieren: 'import dezimal; decimal.Decimal ("3", None) 'liefert erfolgreich Decimal ('3')' zurück. –

+2

[Es ist ein Fehler] (http://bugs.python.org/issue15783) – SilentGhost

+0

@SilentGhost: Ich sehe in der Verbindung, dass es ein Fehler in der c-Accelerator-Version des Moduls ist (was auch immer das ist). Dies kann erklären, warum ich nichts von pdb bekomme. Kann ich aber angeben, dass ich die reine Python-Version haben möchte? –

Antwort

3

Ich kann das Verhalten für Python 3.3 bestätigen. Es erkennt irgendwie, dass Sie die None als Kontext übergeben haben und es nicht mag (obwohl es als Standardwert dokumentiert ist).

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

Update: Aber es funktioniert mit 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') 
>>> 

Update: Der Grund kann in der doc gefunden werden ...

What’s New In Python 3.3 sagt:

dezimal

Ausgabe 7652 - schnelle native Dezimalarithmetik integrieren. C-Modul und Libmpdec geschrieben von Stefan Krah.

Wenn die decimal.py Dateien zu vergleichen, können sie gleich auf den ersten Blick, aber die Python 3.3-Version enthält den folgenden Code fast am Ende:

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 * 

... während die ältere Python 3.2 tut nicht. Es besagt, dass wenn die binäre _decimal Implementierung importiert werden kann, die ältere Implementierung von decimal.py ignoriert wird. Und das Binärmodul kann nicht mit dem Python-Code-Debugger debuggt werden.

Die Frage ist, ob das beobachtete Verhalten nicht als Fehler angesehen werden sollte.

+0

wie ich schon sagte, ich möchte nur dieses Verhalten verstehen, und warum ich die Codeausführung mit pdb nicht sehen kann. In meinem Code verwende ich eine hässliche Problemumgehung (ich teste "Kontext" und rufe das entsprechende Formular auf). –

+0

@GTux: Sehen Sie die letzte Aktualisierung der Antwort. – pepr

+0

danke, jetzt verstehe ich. Über deine Frage, anscheinend ist der Bug bereits geöffnet, siehe SilentGhost-Kommentar. –