2009-10-27 21 views
0

我從Python 2.6.1中遇到了一些我沒想到的行爲。下面是一些瑣碎的代碼來重現問題:有人可以解釋這種意想不到的Python導入行爲嗎?

---- 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雪豹,如果它事項)我得到的錯誤:

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文件)

感謝, 傑里米

回答

11

我不認爲這是意想不到的。你基本上做的是:

1)main.py中的第一個導入將ControlPointValue模塊的內容導入到全局名稱空間中。這會產生一個綁定到該名稱的類。

2)main.py中的第二個導入將ControlPointValueSet模塊的內容導入到全局名稱空間中。該模塊導入ControlPointValue模塊。這將覆蓋全局名稱空間中的綁定,將該名稱的綁定從類中替換爲模塊。

爲了解決,我建議你不是導入*,永遠。始終保留最後一個模塊前綴。舉例來說,如果你有富/酒吧/巴茲/含類Frobniz bruf.py,做

from foo.bar.baz import bruf 

,然後使用bruf.Frobniz()

+0

這對我來說是意外的...... :)感謝您的解釋,這是有道理的。 – 2009-10-27 00:38:53

+0

我的意思是,這不是一個錯誤。這是一個功能。 – 2009-10-27 00:40:07

+0

是的。然而,「導入*」有時是合理的:「從數學導入*」這樣做是有道理的,例如,當你有很多公式時。 – EOL 2009-10-27 09:56:55

4

除了有關明星進口的其他建議,不要說你的模塊和你的班級是一樣的。按照pep8's suggestions的規定,給你的模塊簡寫所有的小寫名字並命名你的類LikeThis。例如。

---- 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() 
相關問題