Python 导入机制

2024-03-20

我有两个相关的 Python“导入”问题。它们很容易测试,但我想要语言定义的答案而不是特定于实现的答案,而且我也对样式/约定感兴趣,所以我在这里问。

1)

如果模块 A 导入模块 B,模块 B 导入模块 C,模块 A 中的代码是否可以在不显式导入的情况下引用模块 C?如果是这样,我认为这是不好的做法是否正确?

2)

如果我导入模块 A.B.C,是否也会导入模块 A 和 A.B?如果是这样,按照惯例,是否最好明确地import A; import A.B; import A.B.C?


您应该知道的第一件事是 Python 语言不是 ISO 标准。这与 C/C++ 有很大不同,这意味着没有“正确”的方式来定义语言行为 - CPython 可能会因为以这种方式编码而执行某些操作,而 Jython 可能会执行相反的操作。

关于您的问题,请记住“导入”模块是一个由两部分组成的操作:首先加载模块 - 如果从未加载过,例如如果它在 sys.modules 中不可用,则名称将绑定到本地命名空间中的该模块。

hence:

1)是的,您可以通过提供适当的命名空间来引用模块 a 中您想要的任何内容,例如你必须做类似的事情

BC 名称 =“某事”

我认为这在 Python 程序中很少这样做,并且可能被认为是不好的做法,因为它强制了“传递依赖” - 如果某些模块 B 实现被重构并且不再依赖于 C,它应该继续提供 C 模块为了满足 A 部门的要求。

当然,设置 __ all __ 可以防止这种情况,一个好的做法可能是将 __ all __ 放在所有模块中,然后导出just您希望真正公开的符号。

2)是和否。正在做

import a.b.c.d 

执行first在所有模块上导入阶段(加载),但第二个阶段仅在 a 上(以及递归地在 b 中相对于 c 等),但链中的所有模块必须由完整名称空间引用;在这样的导入之后,你可以做

a.something
a.b.something
a.b.c.something

但你不能这样做

c.something
b.something

我必须承认这种用法也很少见;我通常更喜欢“从模块导入某些东西”的导入方式,通常你只需要询问你需要什么 - 这种嵌套在库中既不常见,它的用法也不常见。

很多时候,存在“外部包”,仅用于组织,其中包含带有类的模块。上面的a、b、c很可能只是包,而d是一个真正包含类、函数和其他对象的模块。所以正确的用法是:

from a.b.c.d import name1, name2, name3

我希望这能满足您的好奇心。

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

Python 导入机制 的相关文章

随机推荐

  • 检索刚刚删除的文档

    我删除了一个文档 但我仍然可以在其中看到它 changes 这样我就可以看到最后一个有效的 rev 已删除 因此获取带有 id 和最后修订版本的文档只会返回 id 25efa4ec8489d8b89b34c5cad6000059 rev 3
  • SceneBuilder 2:控制器类是否必须与视图 FXML 文件位于同一文件夹中?

    我喜欢 JavaFX 和 SceneBuilder 但是当它们不在同一个文件夹中时 我就是不知道如何让 SceneBuilder 将我的 FXML 视图与其 Java 控制器链接起来 我只想有这个文件夹结构 package model vi
  • Google 地图 API v3 - 鼠标移动和单击事件组合

    如果我将一个单击事件连接到我的地图 然后我连接了一个鼠标移动事件 则单击事件将不再起作用 我想没有人知道这件事吧 顺便说一句 这是 3 4 版本中的 举个简单的例子 var map function initialize var myLat
  • 当 RichTextBox 刚刚加载/为空时,WPF EditingCommands 不起作用?

    这是一个非常简单的代码示例
  • 迁移到.Net Core 3后JsonPatchDocument为空

    我有一个包含多个补丁操作的 AspNetCore WebApi Project 它在 Core 2 2 上运行良好 迁移到 Core 3 后 FromBody JsonPatchDocument
  • 3路快速排序(C实现)

    我试着实施 https github com p1v0t Sort一些算法是使用 C 的纯通用算法 我坚持使用 3 路快速排序 但不知何故 实现没有给出正确的输出 输出几乎已排序 但某些键不在应有的位置 代码如下 提前致谢 include
  • SQL Server:表中的最大行数[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我开发的软件在其数据库表之一 SQL Server 版本 8 9 或 10 中存储大量数据 每天大约有 100 000 条记录插入到该表中
  • Ruby 1.9.2 和 Rails 3 无法打开 Rails 控制台

    gkaykck main myApplication rails console usr local lib ruby 1 9 1 irb completion rb 9 in require no such file to load re
  • Java Mail MimeUtility 编码文本 UnsupportedEncodingException BASE64

    作为我的一部分J2EE应用程序的电子邮件服务 我编码成BASE64 body MimeUtility encodeText orig mail body UTF 8 BASE64 但在某些情况下它会抛出异常 java io Unsuppor
  • Powershell替换存储在多个文件夹中的多个文件中的文本

    我想替换多个文件和文件夹中的文本 文件夹名称发生变化 但文件名始终为 config xml fileName Get ChildItem C config app config xml Recurse Get Content fileNam
  • 如何通过 Cloud DNS api 将自定义域映射到应用程序引擎应用?

    是否有任何文档解释如何仅通过 Cloud DNS API 或任何其他 Google Cloud API 将自定义域映射到 App Engine 上托管的应用 我已经为 www my domain com 添加了 CNAME 记录 指向 gh
  • 如何在asp.net中删除.aspx .asmx后缀

    我们的大部分应用程序都是基于asp net 所以所有的 url 都会有后缀 如 aspx 或 asmx 我想知道是否有什么想法可以删除它们 查看以下教程之一 URL路由 ASP Net 4 0 及更高版本 使用 ASP NET 4 Web
  • 使用java下载zip文件?

    我正在使用 Java 从 Web 服务器下载 zip 文件 但不知何故我在每个文件中丢失了大约 2kb 我不知道为什么 因为相同的代码可以很好地处理其他格式 例如文本 mp3 等 任何帮助表示赞赏 这是我的代码 public void do
  • 如何折叠区域中的空白?

    假设我有这个列表文本文件 field1 variable length field variable length field aaaaaa aaaa aaaaaaaaa bbbbbb bbbbbbbbbbbbbbbbbbbb bbbb 我
  • 如何按顺序执行多个方法?

    强制方法按顺序执行的最佳方法是什么 我有三个方法 但我希望方法1在方法2之前完成 然后当方法2完成时 执行方法3 Example void Method1 void Method2 void Method3 self Method1 sel
  • 通话中状态栏如何影响 ViewController 视图大小?

    我试图理解如何view关联到一个UITabBarController UINavigationController or UIViewController当通话状态栏切换时做出反应 我的问题是它们的行为似乎不同 这会给我带来副作用 我制作了
  • 错误:无法启动新线程

    我有一个使用以下配置运行的网站 Django mod wsgi 阿帕奇 在一个用户的请求中 我向另一个服务发送另一个HTTP请求 并通过python的httplib库解决了这个问题 但有时此服务得不到答复的时间太长 并且 httplib 的
  • 通过 URL 自动登录用户

    我每周向网站的注册会员发送一封邮件 其中包含该网站上私人页面的 URL 出于可用性目的 我不希望用户在单击 URL 后必须提供凭据 我正在使用 ASP NET 会员提供程序模型 Question 我如何实现这一点 以便用户可以通过单击专门的
  • 使用传递的参数附加方法后分离事件处理程序

    我需要将参数 在 C 中 传递给事件处理程序 然后能够分离事件处理程序 我附加事件处理程序并传递参数 map MouseLeftButtonUp sender e gt map MouseLeftButtonUp2 sender e sho
  • Python 导入机制

    我有两个相关的 Python 导入 问题 它们很容易测试 但我想要语言定义的答案而不是特定于实现的答案 而且我也对样式 约定感兴趣 所以我在这里问 1 如果模块 A 导入模块 B 模块 B 导入模块 C 模块 A 中的代码是否可以在不显式导