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

2024-04-19 14:33:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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导入。我只是想知道这是不是一个好的编码方式?这有效吗?我应该这样做吗?或者我应该避免这样做,为什么?你知道吗

非常感谢。我只是个初学者,所以如果我问了一些愚蠢的问题,请原谅我。谢谢您!!你知道吗


Tags: 模块函数nameinpyimportifmain
1条回答
网友
1楼 · 发布于 2024-04-19 14:33:17

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

模块看不到导入程序命名空间,因此导入程序代码中的导入不会成为导入模块的全局变量。你知道吗

此外,模块顶层代码将仅在第一次导入时运行。你知道吗


编辑1:

我在这里回答菲利佩的评论,因为这更容易。你知道吗

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

事实上,你感觉到了我的一些误解,并不意味着那句话是错误的。这是正确的,也是很好的建议。你知道吗

(说大部分时间都很好看起来有点像说大部分时间都会很好……)

我明白你的意思。我避免了太多,我甚至认为你的第一个例子会马上给出一个错误(事实并非如此)。你的意思是没有必要避免它,因为大多数时候(实际上给定了某些条件)Python都会很好地处理它。我也确信,在有些情况下,循环进口将是最简单的解决办法。但这并不意味着如果我们有选择的话就应该使用它们。这将促进使用糟糕的体系结构,其中每个模块都依赖于其他模块。你知道吗

这也意味着编码者必须意识到警告。你知道吗

我在SO中发现的这个链接here说明了一些关于循环导入的担忧。你知道吗

前面的链接有点旧,所以更新的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,我们确认对象是不同的(对于不可变的对象,它们可以是相同的,但这是python内核-内部优化,或者实现细节-在工作中):

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

最后,我同意你的第三点意见,那就是对进口要明确。你知道吗

不管怎样,我感谢你的评论。事实上,正是因为这些原因,我才提高了对问题的理解(我们并不是通过回避而学到很多东西)。你知道吗

相关问题 更多 >