2012-11-02 24 views
5

10進数モジュールで奇妙な動作が見つかりました。クラス進数の「署名」は次のとおりです。Decimal('3', None):だからDecimalクラスのインスタンス化

Decimal(value='0', context=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

[バグです](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は言う:

10進数

問題7652 - 高速ネイティブ10進算術を統合します。 CモジュールとlibmpdecがStefan Krahによって書かれました。古いPythonの3.2はないながら...

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 * 

decimal.pyファイルを比較する場合

、彼らは最初は同じように見えるかもしれませんが、Pythonの3.3バージョンは、ほぼ最後に次のコードが含まれていますない。バイナリ_decimalのインプリメンテーションをインポートできる場合、decimal.pyの古いインプリメンテーションは無視されます。バイナリモジュールは、Pythonコードデバッガを使用してデバッグすることはできません。

問題は、観察された動作をバグとみなすべきではないかどうかです。

+0

私は言ったように、私はこの動作を理解したい、なぜ私はpdbでコードの実行を見ることができません。私のコードでは、私は醜い回避策を使用します(私は 'context'をテストし、適切なフォームを呼び出します)。 –

+0

@GTux:答えの最終更新を参照してください。 – pepr

+0

ありがとう、今私は理解する。あなたの質問については、バグはすでに開いているようです。SilentGhostのコメントを参照してください。 –

関連する問題