两个 Python 模块需要彼此的内容 - 这可以吗?

2023-11-25

我有一个 Bottle 网络服务器模块,其中包含以下行:

from foobar.formtools import auto_process_form_insert

And the foobar.formtools模块包含这一行:

from foobar.webserver import redirect, redirect_back

当然,两者都会导致以下错误(分别):

导入错误:无法导入名称 auto_process_form_insert
导入错误:无法导入名称重定向

在Python中,两个模块不能相互导入并且所有模块导入本质上必须是分层的,这是否只是一个事实,或者我做错了什么?或者,除了将所有这些不错的功能放入新模块之外,是否有解决方法?


Modules can周期性地相互导入,但有一个问题。在简单的情况下,它应该通过移动import声明到文件底部或不使用from syntax.

这就是为什么它有效:

当你导入一个模块时,Python 首先检查sys.modules。如果它在那里,它就从那里导入。如果不存在,它会尝试以正常方式导入它;基本上,它找到该文件并运行其中的内容。

运行模块会填充模块的内容。例如,假设我们有这个模块,创造性地命名为example_opener:

import webbrowser

def open_example():
    webbrowser.open('http://www.example.com/')

开始时,模块是空的。然后Python执行:

import webbrowser

之后,该模块仅包含webbrowser。然后Python执行这个:

def open_example():
    webbrowser.open('http://www.example.com/')

Python 创建open_example。现在该模块包含webbrowser and open_example.

Say webbrowser包含这段代码:

from example_opener import open_example

def open(url):
    print url

Say example_opener首先导入。执行此代码:

import webbrowser

webbrowser尚未导入,因此 Python 执行的内容webbrowser:

from example_opener import open_example

example_opener has已导入,但尚未完全执行。 Python 不在乎。 Python将模块拉出sys.modules。在此刻,example_opener仍然是空的。还没有定义open_example然而,甚至还没有完成导入webbrowser。 Python找不到open_example in example_opener,所以失败了。

如果我们导入怎么办open_example从年底开始webbrowser and webbrowser从年底开始example_opener? Python 将首先执行以下代码:

def open_example():
    webbrowser.open('http://www.example.com/')

webbrowser尚不存在,但直到open_example叫做。现在example_opener仅包含open_example。然后它执行:

import webbrowser

还没有导入,所以Python执行webbrowser。开始:

def open(url):
    print url

它定义了open。然后它执行:

from example_opener import open_example

example_opener is in sys.modules,所以它使用它。example_opener包含open_example,所以成功了。 Python完成导入webbrowser。导入完毕webbrowser from example_opener。这是最后一件事example_opener,所以导入example_opener完成,也成功。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两个 Python 模块需要彼此的内容 - 这可以吗? 的相关文章

随机推荐

  • 注入应用程序配置的最佳方式

    好吧 我正在尝试进入这个奇妙的网站 并提出一个有关将配置设置注入应用程序组件的正确方法的问题 所以 概述是 我有一个用 C Net 3 5 编写的应用程序 它由 3 个组件组成 核心 数据和服务 数据和服务程序集需要从 app config
  • UserControl 中不允许出现文字内容

    如何允许我的控件在其标签内包含文本
  • 打开一个大的 JSON 文件

    当我尝试使用以下命令打开时 我有一个 1 7 GB JSON 文件json load 然后它给出内存错误 如何在Python中读取JSON文件 我的 JSON 文件是一个包含特定键的对象的大数组 Edit 当然 如果 最外面的 数组中的每个
  • Bootstrap 4 卡组,其列数基于视口

    我正在尝试在 Bootstrap 4 中实现卡片组功能 以使所有卡片具有相同的高度 Bootstrap 提供的示例显示了 4 张漂亮的卡片 但无论视口如何 这都是 4 张卡片排成一行 查看代码here 这对我来说没有意义 因为我认为您希望卡
  • JFreeChart 的放大和缩小功能行为异常?

    我观察到 放大 和 缩小 的功能实现方式与预期完全不同 例如 当我执行一步 缩小 然后在退一步 缩放 后 再次执行 放大 和 缩小 功能 在 我再也看不到原始图表了 我没有看到 JFreechart 的 放大 和 缩小 功能同步 publi
  • SceneKit 水就像 Badger 示例中的那样

    有谁知道如何创建水材料 就像苹果公司的獾例子一样 scene scn 中有一个 geotherm 01 对象 该对象获得材质 1 terrasses orange water 和 1 terrasses eau 它用看起来逼真的慢速动画创建
  • 使用 Java 在 Google App Engine 中进行分页

    我需要创建简单的对象分页 但是当我阅读手册时 我发现 query setRange 5 10 即使只需要 5 个对象 也会获取 10 个对象 有没有办法获取刚需要的对象 编辑 我开始了赏金 所以你可以向我展示可以运行的简单 Java 示例代
  • 使用通用存储库和存储过程

    我正在开发一个首先使用通用 Repo 模式和 EF6 数据库的现有应用程序 我正在调用一个存储过程 它返回一个复杂类型 该类型不是我的实体模型中的现有实体 因此我不确定要给出什么类型 这就是从我的服务层调用我的 sp 的方式 unitOfW
  • 如何将自定义证书颁发机构(CA)添加到nodejs

    我正在使用 CLI 工具构建混合移动应用程序 该应用程序具有很酷的上传功能 因此我可以在设备上测试该应用程序 而无需通过应用程序商店 它是 ionic cli 然而 在我的公司中 像许多其他公司一样 TLS 请求是使用公司自己的自定义 CA
  • C++中如何访问类变量

    在c 中是否可以在不创建对象的情况下访问其他类中的类变量 我尝试使用静态 但另一个类无法识别我的变量 我有3节课 其中两个应该使用 sae 变量 在第三堂课中我正在改变价值观 如果您能提供帮助 我将不胜感激 也许你有一个例子 class M
  • 页面滚动后,jQuery 可拖动在错误的位置显示帮助程序

    我正在使用 jQuery可拖动的 and 可丢弃的对于我正在开发的工作计划系统 用户将作业拖到不同的日期或用户 然后使用 ajax 调用更新数据 一切工作正常 除了当我向下滚动主页时 工作出现在超出浏览器窗口底部的大型周计划表上 如果我尝试
  • 基于视图的 NSOutlineView 没有 NIB?

    NSOutlineView是一个子类NSTableView 而目前 NSTableView支持两种实现 基于细胞 基于视图 制作 OSX 10 8 Finder 风格的侧边栏 具有自动灰色图标样式 需要使用基于视图的表视图和源列表突出显示样
  • 如何从路径中提取每个文件夹名称?

    我的路径是 server folderName1 another name something another folder 如果我不知道路径中有多少个文件夹并且不知道文件夹名称 如何将每个文件夹名称提取到字符串中 非常感谢 string
  • 无法在 __init__.py django 1.9.4 中导入模型

    我的目录结构是 Mypack gt init py gt admin py gt apps py gt foo py gt models py 在 apps py 中 我有 AppConfig 我在 foo py 中有一些方法 它们使用从
  • EscapeUriString 和 EscapeDataString 有什么区别?

    如果只处理url编码 我应该使用转义Uri字符串 我对现有的答案不满意 所以我决定更深入地挖掘来解决这个问题 令人惊讶的是 答案非常简单 有 几乎 没有正当理由使用Uri EscapeUriString 如果您需要对字符串进行百分比编码 请
  • 使用 Google Cloud Key Management Service 签署 JSON Web 令牌

    编辑 我找到了答案 滚动到这个问题的底部 我正在开发 NodeJS 身份验证服务器 我想使用 google 签名来签署 JSON Web 令牌 JWT 我正在使用 Google Cloud 密钥管理服务 KMS 并创建了一个密钥环和一个非对
  • C# - 如何知道 Windows 启动后何时“稳定”?

    我正在编写一个应用程序 该应用程序可以选择在 Windows 启动时运行 我无法忍受应用程序在我的电脑真正稳定下来之前就陷入困境 而且这是一个非关键应用程序 我希望我的应用程序礼貌地等待所有其他启动项完成并解决 以便用户的电脑在开始执行任何
  • 使用 ASP.NET MVC 区域路由找不到错误 404

    我在 MVC 5 中遇到区域路由问题 当我浏览到 Evernote EvernoteAuth 时 出现 404 找不到资源错误 我的区域看起来像这样 Areas Evernote Controllers EvernoteAuthContro
  • nodejs hapi 单页

    我有一个应用程序站点 NodeJS 我想从 Express 迁移到 Hapi 我通常做的是提供静态文件并将其他所有内容路由到包含 angularjs 应用程序和 Angular 路由配置的单个页面 Express routing first
  • 两个 Python 模块需要彼此的内容 - 这可以吗?

    我有一个 Bottle 网络服务器模块 其中包含以下行 from foobar formtools import auto process form insert And the foobar formtools模块包含这一行 from f