【问题标题】:Importing * in Python 3.7 Using __init__.py File在 Python 3.7 中使用 __init__.py 文件导入 *
【发布时间】:2019-02-27 11:41:06
【问题描述】:

首先是我的目录结构:

Root
   - models 
        car.py 
        __init__.py 
   hello.py 

在__init__.py里面我有以下内容:

__all__ = ["car"]

在hello.py 中,我尝试从模型文件夹中导入所有内容:

from models import *

car = Car()

这给了我错误:

Traceback (most recent call last):
  File "hello.py", line 4, in <module>
    car = Car()
NameError: name 'Car' is not defined

我做错了什么?

【问题讨论】:

  • FWIW 我通常建议避免导入*。从来没有必要,"explicit is better than implicit"。这也是PEP 8 给出的建议:“应避免通配符导入 (from &lt;module&gt; import *),因为它们会让人不清楚命名空间中存在哪些名称,从而使读者和许多自动化工具感到困惑。”

标签: python python-3.x package python-module python-3.7


【解决方案1】:

您必须指定要导入到 __init__.py 文件的属性 __all__ 中的类。看下面的例子:

from car import *
__all__ = ["Car"]

【讨论】:

  • 现在我得到以下信息: from models import * AttributeError: module 'models' has no attribute 'Car'
  • 这些行去哪儿了?我已经在 init.py 文件中有 all = ["Car"]。
【解决方案2】:

如果您希望在执行from models import * 之后在hello.py 中直接访问Car 类,请在__init__.py 文件中输入from models.car import Car。

__all__,另一方面,通常列出模块的名称,就像你上面的一样。您可以将hello.py 更改为如下所示,您当前的由__all__ = ["car"] 组成的__init__.py 将起作用:

from models import *
car_obj = car.Car() # Reference module.class instead of just the class

【讨论】:

    【解决方案3】:

    来自pythondocs:

    如果一个包的__init__.py 代码定义了一个名为__all__ 的列表,则它被视为遇到from package import * 时应导入的模块名称列表。

    这意味着您的 hello.py 刚刚将 car 模块导入其命名空间,不是 Car 类。因此这会起作用。

    from models import *
    auto = car.Car()
    

    【讨论】:

      【解决方案4】:

      你错过了一步。

      试试:

      from models import *
      
      car = car.Car()
      

      或者试试:

      from models.car import *
      
      car = Car()
      

      【讨论】:

        【解决方案5】:

        __all__ 只是控制在当前范围内使用* 将导出的内容。

        在您的情况下,Car 不在您的__init__.py 范围内。所以没有意义。

        要解决这个问题,你需要将Car导入__init__.py的作用域,仅此而已。

        我了解您认为仅使用__all__ 就可以直接访问car.py 中的类,但事实并非如此。 __all__ 除了控制当前范围内的导出之外什么都不做。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-09
          • 1970-01-01
          • 2013-04-21
          • 1970-01-01
          相关资源
          最近更新 更多