2012-11-02 10 views
5

Ho trovato uno strano comportamento nel modulo decimale. La "firma" del Decimale classe è:Instantiate Classe decimale

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

Così, ho supposto che posso fare qualcosa di simile: Decimal('3', None). Ma questo codice solleva un'eccezione TypeError in python3.3 ma non in python2.7.

Nelle mie ricerche, ho provato il debug con pdb: pdb.set_trace("Decimal('3', None)"), ma non è successo niente! Non appena digito lo s viene sollevata la stessa eccezione.

Qualcuno può spiegare le ragioni di questi comportamenti?

+0

Per quello che vale, non riesco a riprodurlo in Python 3.2.3: 'import decimal; decimal.Decimal ("3", None) 'restituisce con successo' Decimal ('3') '. –

+2

[È un bug] (http://bugs.python.org/issue15783) – SilentGhost

+0

@SilentGhost: Vedo nel collegamento che si tratta di un bug nella versione acceleratore c del modulo (qualunque esso sia). Questo può spiegare perché non ottengo nulla da pdb. Ma posso specificare che voglio la versione Python pura? –

risposta

3

Posso confermare il comportamento per Python 3.3. In qualche modo rileva che hai passato il None come contesto e non gli piace (anche se è documentato come il valore predefinito).

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

Aggiornamento: Ma funziona con 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: La ragione può essere trovata nel doc ...

What’s New In Python 3.3 dice:

decimale

numero 7652 - integrare l'aritmetica decimale nativa veloce. C-module e libmpdec scritto da Stefan Krah.

Quando si confrontano i file decimal.py, possono sembrare lo stesso in un primo momento, ma la versione di Python 3.3 contiene il seguente codice quasi alla fine:

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 * 

... mentre i più anziani Python 3.2 fa non. Si dice che se è possibile importare l'implementazione binario _decimal, l'implementazione precedente da decimal.py viene ignorata. E il modulo binario non può essere debugato usando il debugger del codice Python.

La domanda è se il comportamento osservato non deve essere considerato un bug.

+0

come ho detto, voglio solo capire questo comportamento e perché non riesco a vedere l'esecuzione del codice con pdb. Nel mio codice, uso una brutta soluzione (provo 'context' e chiamo il modulo appropriato). –

+0

@GTux: vedere l'ultimo aggiornamento della risposta. – pepr

+0

grazie, ora capisco. Riguardo la tua domanda, apparentemente il bug è già aperto, vedi il commento di SilentGhost. –

Problemi correlati