“import pkg.a as a”和“from pkg import a”有什么区别?

2024-04-28

我有两个模块在包下形成循环导入

/test
  __init__.py
  a.py
  b.py

a.py

import test.b
def a():
  print("a")

b.py

import test.a
def b():
  print("b")

但是当我从 python 交互式解释器中执行“import test.a”时,它会抛出 AttributeError: module 'test' has no attribute 'a'

>>> import test.a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "test/a.py", line 2, in <module>
    import test.b as b
  File "test/b.py", line 1, in <module>
    import test.a as a
AttributeError: module 'test' has no attribute 'a'

但是当我将其更改为from test import a and from test import b,效果很好。

那么区别是什么呢?

我使用的是python3.5


Edit 1:

正如@Davis Herring 所问,python2 的行为有所不同。 使用时import test.a as a格式没有抛出错误。

Python 2.7.12 (default, Dec  4 2017, 14:50:18)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test.a

然而,当使用from test import a它抛出错误

Python 2.7.12 (default, Dec  4 2017, 14:50:18)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test.a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "test/a.py", line 2, in <module>
    from test import b
  File "test/b.py", line 1, in <module>
    from test import a
ImportError: cannot import name a

import做了三件事:

  1. 查找并加载尚未存在的模块(通常从磁盘)sys.modules.
  2. After每个新加载的模块完成执行,将其分配为其包含包(如果有)上的属性。
  3. 在范围内分配一个变量import允许访问指定的模块。

有很多技巧:

  1. import a.b分配一个变量a,这样你就可以写a.b就像在进口中一样。
  2. import a.b as c分配c成为模块a.b, not a像之前一样。
  3. from a import b可以选择一个模块或任何其他属性 of a.
  4. 循环导入的步骤 #1 立即“成功”,因为相关条目sys.modules导入时创建begins.

第 2 点和第 4 点用圆形解释了失败import a.b as b:循环导入直接进入步骤 #3,但随后导入尝试从步骤 #2 加载属性outer尚未发生的导入。

The from歧义用来引起 https://stackoverflow.com/q/6351805/8586227同样的麻烦,但是特殊后备 https://bugs.python.org/issue17636看看sys.modules在 3.5 中添加来支持这种情况。同样的方法可能适用于import a.b as b,但这还没有发生。

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

“import pkg.a as a”和“from pkg import a”有什么区别? 的相关文章

随机推荐

  • C: (int)x 和 Floor(x) 之间的区别?

    在C语言中 这两者有什么区别 float myF 5 6 printf i n int myF gives me 5 printf ld n floor myF also 5 什么时候其中一种比另一种更可取 一个很大的区别是负数 如果你改变
  • 如何在 Excel 中创建时间范围图表

    Can anyone help me create graph of time ranges of all elements in Excel My data looks like this 连接时间和断开连接时间数据值采用 24 小时格式
  • 一次性渲染阴影

    考虑到阴影投射的成本 我想知道对于动态定位的静态对象 例如 程序城市 是否有一个功能或可能 实验性的方法可以在 Three js 中仅渲染一次阴影贴图 甚至在 webgl 中 因此 结果可以在静态对象的下一帧中免费使用 仅当物体移动时才会进
  • 无法使用 LISTAGG

    SELECT deptno LISTAGG ename WITHIN GROUP ORDER BY ename AS employees FROM emp GROUP BY deptno Error ORA 00923 FROM keywo
  • 使用 LINQ XML 绑定组合框

    请原谅我的英语不好 那不是我的母语 我是 WPF 和 LINQ 的初学者 从 3 天开始 也是 C 的临时用户 昨天 我一整天都在尝试解决我的问题并阅读了一些文档 但我的代码中的错误仍然存 在 我将 XElement 传递给绑定其内容的控件
  • postgresql中插入语句中的加密密码抛出错误(需要添加显式类型转换)

    刚接触 postgresql 这可能很简单 但我不明白 我在 mysql 中有这个 insert into APP USERS VALUES 1 admin adminemailid System Administrator SysAdmi
  • 委托会导致内存泄漏吗?

    委托会导致内存泄漏吗 我的意思是 例如如果一个班级A包含一个ADelegate后者指向BMethod of Bclass 这是否可以阻止 GC 收集 A 类或 B 类 如果是这样 我们如何 释放 代表 设置ADeletate Nothing
  • ReactJS - 反应表中的复选框列不起作用

    我添加了一个可编辑的反应表 https codesandbox io s github tannerlinsley react table tree master examples kitchen sink https codesandbo
  • Django 管理、静态和媒体文件中的混乱

    我对 Django 1 4 比较陌生 并且很难理解静态 媒体和管理文件背后的原理 每个教程的项目结构都不同 Webfaction 的结构也不同 我将在其中托管我的应用程序 我想知道在将其部署到 Webfaction 时组织它的最佳方式是什么
  • 使用 feign 相对于 RestTemplate 有何优缺点

    我知道 Feign 是声明性的 因此它为开发人员抽象出了很多东西 但是 什么时候应该选择其中一种而不是另一种呢 虽然 feign 是声明性的 但它与 oAuth 存在严重问题 使用 RestTemplate 而非 Feign 有哪些注意事项
  • GIT: /.git/index.lock': 文件存在

    我的 git 存储库一直存在问题 我不断收到以下错误 fatal Unable to create v path to files git index lock File exists If no other git process is
  • 第一次播放声音时 AVAudioPlayer 启动缓慢

    我试图消除通过 iPhone 上的 AVAudioPlayer 播放 非常短 不到 2 秒 音频文件时的启动延迟 首先 代码 NSString audioFile NSString stringWithFormat caf NSBundle
  • 如何向 Flash Player 10.1 发出启动 flv 或 swf 的意图?

    我有一堆FLV视频文件存储在媒体服务器 我正在尝试让它们在 Flash 播放器中启动 一直在四处寻找但没有找到太多帮助 我已将 flv 文件下载到临时存储中 并尝试使用intent 这就是我的代码的样子 来自我在网上看到的 try URL
  • 当我尝试创建 SignalR hubConnection 时,System.Net.Http.HttpRequestException 被捕获

    请帮助我 当我尝试建立 hubConnection 时 我不断收到 System Net Http HttpRequestException 我已经浏览了很多教程并下载了示例代码 但似乎没有任何效果 我也尝试过在线搜索配置计算机的方法 但很
  • 使用 numpy 计算文本文档之间的 Kullback-Leibler (KL) 距离

    我的目标是计算以下文本文档之间的 KL 距离 1 The boy is having a lad relationship 2 The boy is having a boy relationship 3 It is a lovely da
  • 无法获取额外属性的compileSdkVersion属性?

    我在 Windows 上使用反应本机应用程序 当我做react native run android我收到错误compileSdkVersion on extra properties请参见下面的屏幕截图 1 为了解决 android 文件
  • 在 Celery 工作线程中捕获 Heroku SIGTERM 以优雅地关闭工作线程

    我对此进行了大量研究 令我惊讶的是我还没有在任何地方找到一个好的答案 我正在 Heroku 上运行一个大型应用程序 并且我有某些运行很长时间处理的 celery 任务 并在任务结束时保存结果 每次我在 Heroku 上重新部署时 它都会发送
  • pyodbc 返回的行不可 JSON 序列化

    我正在尝试使用 Python 中的 pyodbc 库检索表的行 我能够成功检索表和表的字段 现在我有一个名为 apx roomtypes 的表 其数据如下 但是 当我将 pyodbc 行附加到列表 然后尝试将列表转储到 JSON 时 出现错
  • 在elasticsearch中过滤facet

    我有一个如下查询 query query query string query s q filter ids values list ids facets destination terms field destination en hot
  • “import pkg.a as a”和“from pkg import a”有什么区别?

    我有两个模块在包下形成循环导入 test init py a py b py a py import test b def a print a b py import test a def b print b 但是当我从 python 交互