有人可以解释这个意外的Python导入行为吗?

时间:2009-10-27 00:27:08

标签: python import

我遇到了Python 2.6.1的一些我没想到的行为。以下是重现问题的一些简单代码:

---- ControlPointValue.py ------
class ControlPointValue:
   def __init__(self):
      pass

---- ControlPointValueSet.py ----
import ControlPointValue

---- main.py --------------------
from ControlPointValue import *
from ControlPointValueSet import *

val = ControlPointValue()

....这是我运行main.py时遇到的错误(在OS / X Snow Leopard下,如果重要的话):

jeremy-friesners-mac-pro-3:~ jaf$ python main.py 
Traceback (most recent call last):
  File "main.py", line 4, in <module>
    val = ControlPointValue()
TypeError: 'module' object is not callable

有人可以解释这里发生了什么吗? Python是否因为类名与文件名相同而感到困惑?如果是这样,解决问题的最佳方法是什么? (我更喜欢让我的python文件以它们中定义的类命名)

谢谢, 杰里米

2 个答案:

答案 0 :(得分:11)

我不认为这是出乎意料的。你基本上做的是:

1)main.py中的第一个导入将ControlPointValue模块的内容导入全局命名空间。这会生成一个绑定到该名称的类。

2)main.py中的第二个导入将ControlPointValueSet模块的内容导入全局命名空间。此模块导入ControlPointValue模块。这将覆盖全局命名空间中的绑定,将该名称的绑定从类替换为模块。

要解决这个问题,我建议你来导入*。始终保留最后一个模块前缀。例如,如果你有包含Frobniz类的foo / bar / baz / bruf.py,那么

from foo.bar.baz import bruf

然后使用bruf.Frobniz()

答案 1 :(得分:4)

除了有关星级导入的其他建议外,请不要将模块和类命名为相同。关注pep8's suggestions并为您的模块缩短所有小写名称并命名您的类LikeThis。 E.g。

---- controlpoints.py ------
class ControlPointValue:
   def __init__(self):
      pass

---- valuesets.py ----
from controlpoints import ControlPointValue

---- main.py --------------------
from controlpoints import ControlPointValue
from valuesets import *

val = ControlPointValue()