如何处理既属于“公共接口”又属于“内部使用”的Python包内容?

2024-10-03 09:08:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将一些单文件Python模块重构为多文件包,并且反复遇到相同的问题模式:我有属于包的公共接口的对象,但包的子模块也必须在内部使用这些对象

mypackage/
    __init__.py  # <--- Contains object 'cssURL'
    views.py     # <--- Needs to use object 'cssURL'

在这种情况下,mypackage的客户机访问mypackage.cssURL是很重要的。但是,我的子模块views.py也需要它,但是无法访问__init__.py的内容。当然,我可以创建另一个子模块,如下所示:

mypackage/
    __init__.py
    views.py
    style.py     # <--- New home for 'cssURL'

但是,如果我每次都这样做,子模块的数目似乎会成倍增加。此外,客户机现在必须将mypackage.cssURL称为mypackage.style.cssURL,否则我必须在__init__.py中创建一个同义词,如下所示:

import style
cssURL = style.cssURL

我想我做错了什么。有没有更好的方法来处理同时属于公共接口内部使用的包成员


Tags: 模块文件对象py客户机objectinitstyle
3条回答

据我所知,首选的方法是在__init__.py中用“from .style import cssURL”创建一个“同义词”;参见the source for the ^{} module

我的结构如下:

/mypackage
    __init__.py
       from style import cssURL
       ...
    style.py
       cssURL = '...'  # or whatever
       ...
    views.py
       from .style import cssURL
       ...

如果同一个包中的其他模块需要它们,我不会在__init__.py中定义名称;只需在那里创建一个别名供外部使用者使用

您可以将当前包称为.

# views.py
from . import cssURL

有关详细信息,请参见here

相关问题 更多 >