在Python中,如何在脚本中使用十进制模块而不是解释器?

15

我正在使用Python 2.5.4,并尝试使用decimal模块。当我在解释器中使用它时,没有问题。例如,这个是可以工作的:

>>> from decimal import *
>>> Decimal('1.2')+ Decimal('2.3')
Decimal("3.5")

但是,当我放置以下代码时:

from decimal import *
print Decimal('1.2')+Decimal('2.3')

如果将以下代码放在单独的文件(decimal.py)中并以模块形式运行时,解释器会报错:

NameError: name 'Decimal' is not defined

我还尝试将这段代码放在一个单独的文件中:

import decimal
print decimal.Decimal('1.2')+decimal.Decimal('2.3') 

当我将它作为模块运行时,解释器会提示:

AttributeError:'module'对象没有属性'Decimal'

发生了什么?


你确定脚本运行的是与你的交互式解释器相同的Python版本吗?如果想要检查,请尝试输入 print sys.version - David Z
10
也许你创建了一个名为 decimal.py 的文件,它正在被导入而不是Python内置的那个。 - John La Rooy
我在我的脚本中尝试运行: import sys print sys.version是的,解释器确实说它是相同的版本。我想我只在我的电脑上安装了一个版本。 - jack
我猜你可以在 import decimal 后面加上 print dir(decimal),然后检查哪些函数被公开了。 - Douglas Leeder
1
它可以工作。@gnibbler:是的,我的脚本在一个名为decimal.py的文件中,这就是问题所在。为了解决这个问题,我将其“另存为”到我的文件中,并命名为不同的名称,然后删除编译的“decimal”文件和“decimal.py”。感谢大家的帮助! - jack
显示剩余4条评论
2个回答

21
你将你的脚本命名为decimal.py,由于该目录是模块查找路径中第一个被查找到并被导入的,因此你的脚本被找到并被导入。你的模块中没有任何名为Decimal的东西,这导致引发了这个异常。
要解决这个问题,只需简单地将脚本重命名,只要你只是玩玩,像foo.py、bar.py、baz.py、spam.py或eggs.py这样的名称都是不错的选择。

尽管楼主还没有回答,但我也认为是这个问题。这是一个经常发生的问题。 - tzot
1
感谢gnibbler和Daslch。 - jack

14

这对我来说在Python 2.5.2上完全可以正常工作。

from decimal import *
print Decimal('1.2')+Decimal('2.3')

我建议您明确指定要从decimal中使用的内容

from decimal import Decimal
print Decimal('1.2')+Decimal('2.3')

在你的另一个例子中,你应该使用

import decimal
print decimal.Decimal('1.2')+decimal.Decimal('2.3') 

1
感谢您指出我的笔误。我运行了以下代码: import decimal print decimal.Decimal('1.2')+decimal.Decimal('2.3') 但仍然出现了“AttributeError: 'module' object has no attribute 'Decimal'”的错误提示。 - jack
1
我已经编辑了我的帖子,原先写着"import decimal print decimal.Decimal('1.2')+Decimal('2.3')",现在改为:"import decimal print decimal.Decimal('1.2')+decimal.Decimal('2.3')"。 - jack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接