6

10進数モジュールで奇妙な動作を見つけました。クラスDecimalの「署名」は次のとおりです。

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

だから、私は次のようなことができると思いました:Decimal('3', None)。ただし、このコードはpython3.3ではTypeError例外を発生させますが、python2.7では発生しません。

調査では、pdb:を使用してデバッグを試みましpdb.set_trace("Decimal('3', None)")たが、何も起こりませんでした。入力するとすぐにs同じ例外が発生します。

誰かがこれらの行動の理由を説明できますか?

4

1 に答える 1

4

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

更新:理由はドキュメントで見つけることができます...

Python3.3の新機能は次のとおりです。

10進数

問題7652-高速ネイティブ10進演算を統合します。StefanKrahによって作成された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 *

...古いPython3.2はそうではありません。バイナリ_decimal実装をインポートできれば、fromの古い実装decimal.pyは無視されるということです。また、バイナリモジュールはPythonコードデバッガーを使用してデバッグすることはできません。

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

于 2012-11-02T15:24:59.527 に答える