2013-07-18 37 views
2

我对Python的导入机制没有很清楚的理解。有一件令我困惑的事情是:当python导入模块时,它是否也会导入导入的名称。这里是代码:当python导入时,它是否在'import'语句中导入名字?

# A.py 
def A_func(): 
    pass; 

# B.py 
from A import *; 
def B_func(): 
    pass; 

# C.py 
from B import *; 
def C_func(): 
    # I can use B_func, OK, no problem. 
    # I can use A_func here, is import recursive? 

如果python递归导入,我的代码是不好的实践?如果我添加

from A import *; 

to C.py?它是否通过导入两次导致任何开销?或者我应该避免“从xx导入*”并只导入所需的名称?

谢谢!

+1

'import *'是(总是)一个不好的做法 – blablatros

回答

2

代码仅在第一次为模块调用import时执行。后续导入只复制名称和引用。

话虽如此,不要导入*

+0

如果在模块A中导入名称X,如果我将所有内容导入到A中,则可以访问该名称X,对吗? – NeoWang

+1

取决于“A .__ all__”中的内容。 –

-1

你只能在C.py中使用B_func。您将无法访问A_Func。如果您想使用A中的定义,您必须从A中导入。编辑:对不起,我的不好。我错误地理解了

+0

我曾经想过,但是...我可以在C中使用A_func,因为A_func是由B中的*导入的。这不符合我对进口的理解,因此这个问题。 – NeoWang

+0

@manish这是不正确的。如果'B.py'将'A.py'的东西输入到它的名称空间中,它就在名称空间中,并且可以从别处导入。尽管在大多数情况下这不是很好的风格。如果'C.py'需要'A.py'中的某个东西,它应该直接从那里导入它。 – glglgl