6

我在十进制模块中发现了一个奇怪的行为。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

我可以确认 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')
>>>

更新:原因可以在文档中找到...

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 代码调试器进行调试。

问题是观察到的行为是否不应该被视为错误。

于 2012-11-02T15:24:59.527 回答