• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

python如何让模块相互导入?

python 搞java代码 3年前 (2022-05-21) 29次浏览 已收录 0个评论

假设您有以下模块

foo.py:

<span class="kn">from</span> <span class="nn">bar</span> <span class="kn">import</span> <span class="n">bar_var</span>
<span class="n">foo_var</span> <span class="o">=</span> <span class="mi">1</span>

www#gaodaima.com来源gaodaima#com搞(代@码网搞代码

bar.py:

<span class="kn">from</span> <span class="nn">foo</span> <span class="kn">import</span> <span class="n">foo_var</span>
<span class="n">bar_var</span> <span class="o">=</span> <span class="mi">2</span>

问题是解释器将执行以下步骤:

  • 首先导入foo

  • 创建用于foo的空全局变量

  • foo被编译并开始执行

  • foo 导入 bar

  • 创建了用于bar 的空全局变量

  • bar被编译并开始执行

  • bar导入foo(这是一个空操作(no-op ),因为已经有一个名为foo的模块)

  • bar.foo_var = foo.foo_var

最后一步失败了,因为Python还没有解释foo,而foo的全局符号字典仍然是空的。

当你使用 import foo ,然后尝试在全局代码中访问 foo.foo_var 时,会发生同样的事情。

这个问题有(至少)三种可能的解决方法。

Guido van Rossum 建议避免使用 from <module> import ... ,并将所有代码放在函数中。全局变量和类变量的初始化只能使用常量或内置函数。这意味着导入模块中的所有内容都被引用为 <module>.<name>

Jim Roskind建议在每个模块中按以下顺序执行步骤:

  • 导出(全局变量,函数和不需要导入基类的类)

  • 导入 声明

  • 活动代码(包括从导入值初始化的全局变量)。

van Rossum不喜欢这种方法,因为导入出现在一个陌生的地方,但这种方法确实有效。

Matthias Urlichs建议重构代码,以便首先不需要递归导入。

这些解决方案并不相互排斥。

来源:搞代码网:原文地址:https://www.gaodaima.com


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:python如何让模块相互导入?

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址