繁体   English   中英

模块命名空间中提供的Python Import Statement和Recursion-need函数

[英]Python Import Statement and Recursion- need function available in module namespace

我在main.py中有函数foo()。 在main.py中,我导入create.py。 但是create.py中有一个函数需要来自main的foo()。 我无法将main.py导入到create.py中,因为main.py出错...我认为这是某种竞争条件。

如何在create.py命名空间中使foo()可用? 将foo()作为模块并由main.py和create.py导入仅用于一个函数似乎效率低下。

简单的答案是将foo()移动到foo.py并从那里导入或将其移动到create.py并将其从那里导入main.py - 如果main.py中有东西它也需要移动。 您的另一个选择是将foo从main传递到create作为需要它的函数参数。

只是一个简单的黑客,但这在一般情况下无济于事。

在main.py进口create.py当它通过导入调用。

# in main.py
if __name__ == '__main__':
    from create import *

因此,当你通过python main.py将导入create并且将导入create并且它将再次导入main,但这次,它将看到它被导入,因此__name__ == '__main__'将返回False 因此循环的进口链将停止。

请记住,当您尝试在其他脚本中导入main.py时, 它将无法工作 ,因为create.py将不会导入。

所以要使这个东西工作,你必须执行main.py,你不能导入它。

导入模块时,Python的import机制会执行该模块的代码来填充它,但只能执行一次。 如果多次导入同一模块,则会从sys.modules缓存中获取它。 没有办法结束无限导入循环。

但是,Python在为其执行代码之前将模块添加到sys.modules ,因此在整个模块执行之前,它不会完全填充。 因此,如果模块A导入模块B,模块B再次导入模块A,它将看到部分初始化的模块。 这似乎是在这里发生的事情; main导入在完全填充之前create ,因此当create尝试访问main某些内容时,它还不存在。

一些解决方案

  1. 如上所述,将共享代码移动到单独的模块。 导入只进行一次,Python在PYC文件中缓存已编译的字节代码,因此实际上并不是那么昂贵。
  2. 将所有代码移动到函数中,并在任何地方使用import name (不from name import ),并从脚本底部调用main函数。 这样,在执行任何其他操作之前,所有模块都将完成导入。
  3. import create语句向下移动到您需要访问的函数下方,因此在执行create.py的代码之前定义它(这有点傻,但可以作为最后的手段使用)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM