gpt4 book ai didi

python - 在 python 中,有关导入导入另一个模块的模块的问题?

转载 作者:太空宇宙 更新时间:2023-11-04 02:27:42 25 4
gpt4 key购买 nike

我是 python 初学者,目前正在学习 python 中的导入模块。所以我的问题是:假设我目前有三个python文件,分别是module1.py、module2.py和module3.py;

在 module1.py 中:

def function1():
print('Hello')

在 module2.py 中,为了使用 module1.py 中的那些函数:

import module1

#Also, I have some other public functions in this .py file
def function2():
print('Goodbye')

#Use the function in module1.py
if __name__ == '__main__':
module1.function1();
function2();

在 module3.py 中,我想同时使用 module1.py 和 module2.py 中的函数。

import module1
import module2

def function3():
print('Nice yo meet you');

if __name__ == '__main__':
module1.function1()
function3()
module2.function2()

看起来好像有效。但是我的问题主要是关于module3.py。原因是在module3.py中,我同时导入了module1和module2。但是,module1 已经被 module2 导入了。我只是想知道这是否是一种好的编码方式?这有效吗?我应该这样做吗?或者我应该避免这样做吗?为什么?

非常感谢。我只是一个初学者,所以如果我提出愚蠢的问题,请原谅我。谢谢!!

最佳答案

如果你避免循环导入就不会有问题,也就是说你永远不会导入一个本身会导入当前导入模块的模块。

模块看不到导入器命名空间,因此导入器代码中的导入不会成为导入模块的全局变量。

此外,模块顶层代码将仅在首次导入时运行。


编辑 1:

我在这里回答 Filipe 的评论,因为它更容易。

“如果避免循环导入就不会有问题”-> 这是不正确的,python 在大多数情况下都可以使用循环导入。”

事实上,您察觉到我的一些误解,但这并不意味着该特定陈述是不正确的。这是正确的,也是很好的建议。

(说它在大多数情况下都很好看起来有点像在说某事在大多数时间都可以正常运行...)

我明白你的意思了。我非常避免它,我什至认为你的第一个例子会立即给出错误(它没有)。你的意思是没有必要避免它,因为大多数时候(实际上在特定条件下)Python 会很好地处理它。我也确信在某些情况下循环导入是最简单的解决方案。这并不意味着我们应该在有选择的情况下使用它们。这会促进不良架构的使用,其中每个模块开始时都相互依赖。

这也意味着编码人员必须了解警告。

我找到的这个链接here在 SO 中陈述了对循环导入的一些担忧。

之前的链接有些旧,因此信息可能会被较新的 Python 版本过时,但是 import confusion甚至更老,仍然适用于 3.6.2。

您提供的示例运行良好,因为相关或初始化模块代码包装在一个函数中,不会在导入时运行。使用 if __name__ == "__main__": 保护代码也会在导入时将其从运行中移除。

像这样简单的东西(来自 effbot.org 的同一个例子)是行不通的(记住 OP 说他是初学者):

# file y.py
import x

x.func1()


# file x.py
import y

def func1():
print('printing from x.func1')

在您的第二条评论中,您说:“这也是不正确的。导入的模块将成为命名空间的一部分”

是的。但我没有提到这一点,也没有相反。我刚刚说过导入的模块代码不知道进行导入的代码的命名空间。

为了消除歧义,我的意思是这样的:

# w.py
def funcw():
print(z_var)

# z.py
import w

z_var = 'foo'
w.funcw() # error: z_var undefined in w module namespace

运行 z.py 会给出所述错误。这就是我的意思。

现在更进一步,为了获得我们想要的访问权限,我们进行循环...

# w.py
import z # go circular

def funcw():
'''Notice that we gain access not to the z module that imported
us but to the z module we import (yes its the same thing but
carries a different namespace). So the reference we obtain
points to a different object, because it really is in a
different namespace.'''

print(z.z_var, id(z.z_var))

...我们保护一些代码不与导入一起运行:

# z.py
import w

z_var = ['foo']

if __name__ == '__main__':
print(z_var, id(z_var))
w.funcw()

通过运行 z.py,我们确认对象是不同的(它们可以与不可变对象(immutable对象)相同,但这是 python 字距调整 - 内部优化或实现细节 - 在起作用):

['foo'] 139791984046856
['foo'] 139791984046536

最后,我同意您关于明确导入的第三条评论。

无论如何,我感谢您的评论。因为他们,我实际上提高了对问题的理解(我们不会通过避免它来学到很多东西)。

关于python - 在 python 中,有关导入导入另一个模块的模块的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49960786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com