2012-11-02 63 views
5

我在小數模塊中發現了一個奇怪的行爲。本類十進制的「簽名」是:實例化十進制類

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

所以,我認爲,我可以這樣做:Decimal('3', None)。但是這段代碼在python3.3中引發了一個TypeError異常,但在python2.7中卻沒有。

在我的調查中,我嘗試過使用pdb:pdb.set_trace("Decimal('3', None)")進行調試,但沒有發生任何事情!只要我鍵入s就會引發同樣的異常。

有人可以解釋這些行爲的原因嗎?

+0

對於它的價值,我無法在Python 3.2.3下重現這一點:'import decimal; decimal.Decimal(「3」,None)'成功返回'Decimal('3')'。 –

+2

[這是一個bug](http://bugs.python.org/issue15783) – SilentGhost

+0

@SilentGhost:我在鏈接中看到,它是模塊c加速器版本中的一個錯誤(無論這是什麼)。這可以解釋爲什麼我從pdb中得不到任何東西。但是,我可以指定我想要純粹的Python版本嗎? –

回答

3

我可以確認Python 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 - 整合快速原生十進制算術。 由Stefan Krah編寫的C模塊和libmpdec。

當比較decimal.py文件,它們可能看起來是一樣的在第一,但Python的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 * 

...而老的Python 3.2呢不。它說,如果可以導入二進制_decimal實現,則忽略來自decimal.py的較早實現。而二進制模塊不能使用Python代碼調試器進行調試。

問題是觀察到的行爲是否應該被視爲錯誤。

+0

就像我說的,我只是想了解這種行爲,以及爲什麼我看不到用pdb執行代碼。在我的代碼中,我使用了一個醜陋的解決方法(我測試'context'並調用適當的表單)。 –

+0

@GTux:查看答案的最新更新。 – pepr

+0

謝謝,現在我明白了。關於你的問題,顯然這個bug已經打開了,請參閱SilentGhost評論。 –