循环进口地狱

2024-02-08

Python 是一种极其优雅的语言。好吧,除了……除了进口。我仍然无法让它按照我认为自然的方式工作。

我有课MyObjectA这是在文件中mypackage/myobjecta.py。该对象使用一些实用函数,这些函数位于mypackage/utils.py。所以在我的第一行中myobjecta.py我写的:

from mypackage.utils import util_func1, util_func2

但是一些实用函数创建并返回新的实例MyObjectA。所以我需要写进去utils.py:

from mypackage.myobjecta import MyObjectA

好吧,不,我不能。这是循环导入,Python 将拒绝这样做。

关于这个问题有很多问题,但似乎没有一个给出令人满意的答案。从我在所有答案中可以读到的内容:

  1. 重新组织你的模块,你做错了!但是我不知道 即使在像我这样简单的情况下如何更好地组织我的模块 呈现。
  2. 尝试一下import ...而不是from ... import ...(我个人讨厌编写并可能重构所有完整的 名称限定符;我喜欢看看我到底导入了什么 来自外界的模块)。那会有帮助吗?我不知道, 仍然存在循环进口。
  3. 在使用其他模块中的某些内容之前,请进行一些黑客操作,例如在函数体的内部作用域中仅导入一行内容。

我仍然希望有第 4 号解决方案,从功能性、优雅性、简单性和工作性的意义上来说,它是 Pythonic 的。或者说没有?

注意:我主要是一名 C++ 程序员,上面的例子很容易通过包含相应的头文件来解决,我不敢相信这在 Python 中是不可能的。


在函数体中导入某些东西并没有什么黑客之处,它是一个绝对有效的模式:

def some_function():
    import logging
    do_some_logging()

Usually ImportErrors 只是因为方式而被提高import()调用时评估整个文件的顶级语句。

如果您没有logic循环依赖...,在Python中没有什么是不可能的......

如果您确实希望导入的内容排在首位,那么有一种解决方法:

来自 David Beazley 的精彩演讲模块和包:生死攸关! - PyCon 2015 https://www.youtube.com/watch?v=0oTh1CXRaQ0, 1:54:00,这里是Python中处理循环导入的一种方法:

try:
    from images.serializers import SimplifiedImageSerializer
except ImportError:
    import sys
    SimplifiedImageSerializer = sys.modules[__package__ + '.SimplifiedImageSerializer']

这尝试导入SimplifiedImageSerializer and if ImportError被引发(由于循环导入错误或它不存在),它将从导入缓存中提取它。

PS:您必须以 David Beazley 的声音阅读整篇文章。

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

循环进口地狱 的相关文章

随机推荐

  • 从对象中删除未在类型接口中声明的属性[重复]

    这个问题在这里已经有答案了 我想从对象中删除未在特定类型接口中声明的所有属性 例如 假设我有以下界面 export interface CreateCustomerUserInput fullname string email string
  • React-Router onChange 钩子

    我在让反应路由器中的 onChange 挂钩正常工作时遇到问题 这是我的路线文件 import React from react import Router Route browserHistory from react router im
  • 如何达到每行 8060 字节和每个 (varchar、nvarchar) 值 8000 个字节的限制?

    来自我的问题 8060 B 数据页 SQL Server 中有 8078 字节 https stackoverflow com questions 3778721 8078 bytes in 8060 b datapage ms sql s
  • 如何通过搜索和替换验证大量文件?

    我当前正在验证客户端的 HTML 源 但对于没有 Omittag 的图像和输入文件 我收到了很多验证错误 我会手动执行此操作 但该客户端实际上有数千个文件 其中很多情况下不是 该客户端已验证一些 img 标签 无论出于何种原因 只是想知道是
  • Android YouTube API“初始化 YouTube 播放器时发生错误”

    我有一个包含以下内容的片段YouTubePlayerSupportFragment https developers google com youtube android player reference com google androi
  • Django 从查询集中填充 form.ChoiceField 字段,并将选择关联回模型对象

    我有一个简单的表格 class SubmissionQuickReplyForm forms Form comment text forms CharField label required False widget forms Texta
  • 安装适用于 Mac 的 PHP 7.1(使用 Homebrew)时出错

    我正在尝试使用 Homebrew 安装 PHP 7 1 根据 Homebrew 网站我应该输入 brew install exolnet deprecated email protected cdn cgi l email protecti
  • AES GCM 解密绕过 JAVA 中的身份验证

    我有一些 AES GCM 加密数据并想解密它 我想绕过身份验证对其进行解密 因为数据不包含身份验证信息 数据由第三方应用程序加密 我尝试使用 javax crypto 包进行解密 但它总是抛出标签不匹配错误 有什么方法可以绕过此标签检查并解
  • Amazon S3 下载index.html 而不是提供服务

    我已设置 Amazon S3 来为我的静态站点提供服务 speakeasylinguistics com 所有 DNS 东西似乎都工作正常 因为dig recurse trace www speakeasylinguistics com输出
  • 如何将 content:// URI 转换为实际文件路径?

    如何获取 SD 卡上 content uri 指向图像的实际文件路径 我已经调整了 hooked82链接到的代码 protected String convertMediaUriToPath Uri uri String proj Medi
  • 在 HTML 中添加引导程序

    我要使用引导程序 http getbootstrap com 建立我的前端 我还使用 JSP 和 JSTL 我在互联网上的一些文章中读到的是添加外部 javascript 文件的正确方法应该写在正文结束标记之前 以便更好地优化页面 现在我正
  • Java 语言规范第三版勘误表

    我广泛使用 JLS 作为学习和教学资源 但我注意到其中存在一些错误 有一些简单的拼写错误 例如金龙5 1 4 http java sun com docs books jls third edition html conversions h
  • 负载均衡 Amazon EC2 上的节点 socket.io

    我有一个在 Amazon AWS 上运行的标准 LAMP EC2 实例设置 为了满足实时更新的需求 我还安装了 Node js socket io 和 Express 现在正处于应用程序负载平衡的阶段 这一切都有效 但我的套接字却不起作用
  • 删除非 ASCII 字符(使用 Microsoft.Office.Interop.Excel)

    我正在尝试从 excel csv 文件中删除所有非 ascii 字符 在线阅读和搜索后 我发现了一篇帖子 其中给了我代码xlWorksheet UsedRange Replace u0000 u007F 删除字符但每次但字符仍然存在于文件中
  • 如何在管道内使用“if”语句

    我正在尝试使用if管道内 我知道有where alias 过滤器 但是如果我想仅在满足特定条件时才激活过滤器怎么办 我的意思是 例如 get something someone eq somespecific format table 如何
  • 从 gtsummary 包中的 tbl_summary 对象获取 LaTex 输出的最佳方法[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我正在努力准备一份文档出版 并且正在 LaTeX 中完成所有工作 然而 我现在才注意到gtsummary尚不支持其表格的 LaTeX
  • 帧持续时间 - UIImage 数组到电影

    我已经通过此代码成功完成了 将 UIImage 数组导出为电影 部分 在导出的视频中 每个图像显示 1 秒 但我需要 每个图像将在导出的视频中显示 5 秒 我需要做的最小改变是什么 这是我的代码 var outputSize CGSize
  • java正则表达式模式分割逗号

    String line a 1 b 1 2 c d 1 e 1 11 String tokens line split for String t tokens System out println gt t System out print
  • 异常日志文件的最佳位置 (Windows)

    异常日志应该放在哪里的问题已经在这里讨论过一两次 或多次 其中一个建议是应用程序永远不应该写入安装文件夹 但是 如果我将日志放在 appdata 中的某个位置 这意味着每个用户都有自己的一组日志 我更喜欢将所有日志放在一个位置 在最新的 M
  • 循环进口地狱

    Python 是一种极其优雅的语言 好吧 除了 除了进口 我仍然无法让它按照我认为自然的方式工作 我有课MyObjectA这是在文件中mypackage myobjecta py 该对象使用一些实用函数 这些函数位于mypackage ut