我是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。但是,模块1已经由模块2导入。我只是想知道这是不是一个好的编码方式?这有效吗?我应该这样做吗?或者我应该避免这样做,为什么?你知道吗
非常感谢。我只是个初学者,所以如果我问了一些愚蠢的问题,请原谅我。谢谢您!!你知道吗
如果避免循环导入,就不会有问题,也就是说,永远不会导入本身导入当前导入模块的模块。你知道吗
模块看不到导入程序命名空间,因此导入程序代码中的导入不会成为导入模块的全局变量。你知道吗
此外,模块顶层代码将仅在第一次导入时运行。你知道吗
编辑1:
我在这里回答菲利佩的评论,因为这更容易。你知道吗
“如果避免循环导入就不会有问题”->;这是不正确的,python在大多数情况下都可以使用循环导入
事实上,你感觉到了我的一些误解,并不意味着那句话是错误的。这是正确的,也是很好的建议。你知道吗
(说大部分时间都很好看起来有点像说大部分时间都会很好……)
我明白你的意思。我避免了太多,我甚至认为你的第一个例子会马上给出一个错误(事实并非如此)。你的意思是没有必要避免它,因为大多数时候(实际上给定了某些条件)Python都会很好地处理它。我也确信,在有些情况下,循环进口将是最简单的解决办法。但这并不意味着如果我们有选择的话就应该使用它们。这将促进使用糟糕的体系结构,其中每个模块都依赖于其他模块。你知道吗
这也意味着编码者必须意识到警告。你知道吗
我在SO中发现的这个链接here说明了一些关于循环导入的担忧。你知道吗
前面的链接有点旧,所以更新的Python版本可能会过时,但是import confusion更旧,仍然适用于3.6.2。你知道吗
您给出的示例运行得很好,因为相关或初始化模块代码包装在函数中,在导入时不会运行。使用
if __name__ == "__main__":
保护代码也会使其在导入时无法运行。你知道吗像这样简单的事情(与effbot.org网站)行不通(记得OP说他是个初学者):
在你的第二条评论中,你说: “这也是不正确的。导入的模块将成为命名空间的一部分“
是的。但我没有提到,也没有相反。我只是说导入的模块代码不知道进行导入的代码的名称空间。你知道吗
为了消除歧义,我的意思是:
运行
z.py
会给出声明的错误。我就是这个意思。你知道吗现在更进一步,为了得到我们想要的通道,我们循环。。。你知道吗
…并且我们保护一些代码不与导入一起运行:
通过运行
z.py
,我们确认对象是不同的(对于不可变的对象,它们可以是相同的,但这是python内核-内部优化,或者实现细节-在工作中):最后,我同意你的第三点意见,那就是对进口要明确。你知道吗
不管怎样,我感谢你的评论。事实上,正是因为这些原因,我才提高了对问题的理解(我们并不是通过回避而学到很多东西)。你知道吗
相关问题 更多 >
编程相关推荐