【问题标题】:Import submodules all at once一次性导入所有子模块
【发布时间】:2020-12-05 01:00:32
【问题描述】:

我是 Python 的新手,但我对其他编程语言很有经验。

我有这行代码:

import module as m

如果我尝试访问它的功能:

m.spam.foo()
m.eggs.bar()

我收到以下错误:

AttributeError: module 'module' has no attribute 'spam'
AttributeError: module 'module' has no attribute 'eggs'

另一方面,如果我写:

import module.spam, module.eggs

然后:

module.spam.foo()
module.eggs.bar()

它工作正常。


如果我写也一样:

from module import spam, eggs

和:

spam.foo()
eggs.bar()

正常工作。


我更喜欢第一种方法,因为在使用它之前我不必手动import 每个子模块...

那么,这种方法有什么问题?有没有办法让它工作(我不喜欢from module import * 方法,因为它们可能与我的全局变量混淆)

我在参考资料中到处搜索,但找不到任何东西。

【问题讨论】:

  • 在开头导入所有模块是PEP 8 - Style Guide for Python Code 中推荐的技术——当然也有例外。
  • 谢谢...我不知道!无论如何,它并不能解决我必须手动导入每个子模块的事实
  • 如果您的问题是关于 Python 包中的子模块,您可以在包的 __init__.py 文件中的子模块中 import 东西。通常这将需要显式导入所有内容。但是,有一些方法可以自动执行此操作(如果您有兴趣,我已经回答了其他问题,展示了如何执行此操作)。
  • @martineau 这个文件__init__.py 是自动包含在每个第三方库中还是应该手动创建?
  • 随包一起提供,因为它是使它们成为一个包的重要组成部分。我认为您应该在文档(或其他 Python 资源)中查找“包”。另请参阅我对How to import members of all modules within a package?的回答

标签: python function import module compiler-errors


【解决方案1】:

我不知道这如何解决你的问题,因为这段代码实际上比from module import spam, eggs 方法长,但this question 可能会解决你的问题。基本上,您将使用__init__ 函数来加载所有子模块。

【讨论】:

  • 没有,因为我的模块是第三方库 (matplotlib) 所以我认为编辑它不是一个好主意...
  • 对不起。最好的。
  • @Foxel:如果第三方包没有提供和__iinit__.py,你不应该尝试创建一个。您可以创建自己的 module 并将其他模块和包中的一堆东西导入 it,然后使用 from my_module import * 并访问所有这些。您还可以通过在模块代码中定义一个名为 __all__ 的列表及其名称来明确声明 … import * 应包含的内容。
  • @martineau 我尝试导入它并且文件确实存在,问题是我仍然遇到相同的错误
猜你喜欢
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
相关资源
最近更新 更多