我在十进制模块中发现了一个奇怪的行为。 Decimal类的“签名”是:
Decimal(value='0', context=None)
所以,我认为我可以这样做:Decimal('3', None)
。但是这段代码在python3.3中引发了一个TypeError异常,但在python2.7中却没有。
在我的调查中,我尝试使用pdb:pdb.set_trace("Decimal('3', None)")
进行调试,但没有任何反应!只要我输入s
,就会引发相同的异常。
有人可以解释这些行为的原因吗?
答案 0 :(得分: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')
>>>
更新:原因可以在doc ...
中找到小数
issue 7652 - 集成快速原生十进制算术。 C-module和libmpdec由Stefan Krah编写。
比较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代码调试器调试二进制模块。
问题是观察到的行为是否应该被视为错误。