【发布时间】:2020-01-26 04:39:56
【问题描述】:
在编写 Python 包时,我遇到了一些奇怪的行为。这是我的目录布局:
my_package/
__init.py__
client.py
events.py
utils.py
在__init__.py 中有一些from ... 导入可以导入各种名称:
__all__ = ['Client', 'get_websocket_url', 'format_cookies']
from .client import ChatSession as Client
from .utils import get_websocket_url, format_cookies
当我导入my_package 并运行dir(my_package) 时,似乎client.py、events.py 和utils.py 都包含为属性:
['Client', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'client', 'events', 'format_cookies', 'get_websocket_url', 'utils']
发生这种情况的原因是什么?我可以通过deleting 在__init__.py 中删除这些属性,但这看起来不太好。导入任何内容的唯一其他文件是client.py:
from .events import Event
from .utils import get_websocket_url
...
但这并没有将任何模块作为一个整体导入,所以这让我很困惑。有什么想法吗?
【问题讨论】:
-
导入模块后,它成为其包的属性。这是预期和指定的行为。您对此的实际问题是什么?
-
@KlausD。好吧,我希望能够阻止将三个 src 文件作为属性添加到模块中。似乎大多数软件包都没有表现出这样的行为 - 我做的事情是否不正确?也请原谅我,因为我对包装系统还很陌生。
-
好吧,如果您不希望模块包含在包中,那么您不要将源文件放在那里。为什么要在包中包含模块而不在包中?
-
那么,如何在不作为属性的情况下将它们与它们一起导入?导入语法将它们合二为一,即使这在相对导入中更难看到,并且如果尚未导入,则将在导入时创建属性。
-
因为这就是 Python 的工作方式,它是如何指定和记录的。他们(?)仍然没有解释:这会导致什么问题? Stack Overflow 不是抱怨 Python 语言设计决策的好地方。
标签: python python-3.x class package