【问题标题】:After setup.py, module must be explicitly imported from package在 setup.py 之后,必须从包中显式导入模块
【发布时间】:2013-04-22 14:33:47
【问题描述】:

我刚刚使用安装脚本制作了我的第一个 Python 包,我想知道这种行为是否正常。它由一个包含我想访问的类的模块组成。项目结构是这样的:

.
|
+ -- __init__.py
+ -- setup.py
my_package
    |
    + __init__.py
    + my_class.py

__init__.py 始终为空。

当我安装它时,这是我期望的行为:

>>> import my_package
>>> my_class.MyClass()
A new object is born!

相反,我只能这样做:

>>> from my_package import my_class
>>> my_class.MyClass()
A new object is born!

如果相关的话,我的包和我的类文件的名称相同。这是一个糟糕的包装设计案例吗?我发现我可以通过将from my_class import * 放入__init__.py 来解决这个问题,但我讨厌使用这样的语句,即使它们保留在导入命名空间中。

【问题讨论】:

  • 如果你导入my_package,为什么你会期待my_class神奇地出现?
  • 你说得对,我知道导入必须更明确。我只是不确定为了让my_class 神奇地出现的最佳做法是什么;)
  • 这实际上不是一个打包问题,只是一个熟悉 Python 导入的问题。

标签: python installation distutils setup.py


【解决方案1】:

import my_package 将导入my_package/__init__.py 中定义的内容,因此这种行为是完全正常的。您不能使用my_class,因为您没有对该模块的任何引用。

我不知道你的包设计是还是,但是如果你想在导入my_package时使用MyClass,就移动这个类到脚本my_package/__init__.py

【讨论】:

  • 在这种情况下最佳做法是什么?如果我使用from my_package import * 它很丑,但至少它会留在my_package 的命名空间中,所以我可以追踪它的来源。还是有更好的方法?
  • @DanielLee from my_package.my_class import MyClassfrom my_package import my_class 都很好。一般来说,避免像from my_package import * 这样的导入语句。您也可以在documentation FAQ 中找到更多信息。
猜你喜欢
  • 2019-05-08
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 2022-09-26
  • 2016-12-26
  • 2018-07-08
  • 2019-12-05
  • 2019-03-24
相关资源
最近更新 更多