导入中的python导入

导入中的python导入,python,import,Python,Import,我试图在模块中导入一个模块,然后从顶部访问较低级别的模块,但该模块不可用。这是正常的行为吗 # caller.py import first print second.some_var # first.py import second # second.py some_var = 1 运行caller.py会出现错误 NameError: name 'second' is not defined 我是否必须在caller.py中导入第二个?这似乎与我的直觉相反。您可以使用 import

我试图在模块中导入一个模块,然后从顶部访问较低级别的模块,但该模块不可用。这是正常的行为吗

# caller.py
import first
print second.some_var

# first.py
import second

# second.py
some_var = 1
运行
caller.py
会出现错误

NameError: name 'second' is not defined
我是否必须在
caller.py
中导入第二个
?这似乎与我的直觉相反。

您可以使用

import first
print first.second.some_var
仅通过导入
第一个
就让
第二个
自动出现在命名空间中,这将导致大量冲突

这也会起作用

from first import second
print second.some_var
通配符的使用

from first import *
不鼓励这样做,因为如果有人首先向
添加额外的属性/函数
,如果他们碰巧选择了您可以使用的相同名称,他们可能会覆盖您在本地使用的属性

import first
print first.second.some_var
仅通过导入
第一个
就让
第二个
自动出现在命名空间中,这将导致大量冲突

这也会起作用

from first import second
print second.some_var
通配符的使用

from first import *

不鼓励这样做,因为如果有人向
first
添加额外的属性/函数,如果他们碰巧选择了相同的名称,他们可能会覆盖您在本地使用的属性
import first
会将名称
first
导入全局命名空间,但它不会将所有内容从
首先导入到名称空间中。因此,您可以执行以下操作之一:

  • 通过
    第一次访问
    第二次

    import first
    print first.second.some_var
    
  • second
    直接导入caller.py的命名空间:

    from first import second
    print second.some_var
    

请注意,您可以使用
from first import*
first
中的所有名称导入命名空间,但通常不建议这样做。

import first
将名称
first
导入全局命名空间,但它不会将
first
中的所有内容导入命名空间。因此,您可以执行以下操作之一:

  • 通过
    第一次访问
    第二次

    import first
    print first.second.some_var
    
  • second
    直接导入caller.py的命名空间:

    from first import second
    print second.some_var
    
请注意,您可以使用
from first import*
first
中的所有名称导入命名空间,但通常不建议这样做。

请改用:

from first import second
print first.second.some_var
它也被压缩了很多。你为什么要这样做?

改用:

from first import second
print first.second.some_var

它也被压缩了很多。你为什么要这样做?

感谢你解释为什么不鼓励使用通配符感谢你解释为什么不鼓励使用通配符循环导入可能会导致恼人的问题,因此最好避免这种导入模式。如果
第一个
第二个
都需要访问
一些变量
,您可以创建
第三个
模块并将
一些变量
放在其中。循环导入可能会导致恼人的问题,因此最好避免这种导入模式。如果
first
second
都需要访问
some_var
,您可以创建
third
模块,并将
some_var
放在其中。基本上,我在许多项目中使用公共库文件(在本例中,许多文件的角色为“second”)然后,每个项目都有更高级别的库文件(即在本例中有许多“first”角色的文件)。所以每个项目只需要知道“第一”,而“第一”只需要知道“第二”。我知道第一个扩展第二个的类结构是理想的,但我只是想看看我是否可以使用模块和避免类…基本上我有很多项目中使用的公共库文件(在本例中,许多文件的角色是“second”),然后每个项目都有更高级别的库文件(即在本例中有许多扮演“第一”角色的文件)。因此每个项目只需要知道“第一”,而“第一”只需要知道“第二”。我知道一个带有
first extends second
的类结构是理想的,但我只是想看看是否可以使用模块和避免类。。。