如何避免导入自身、包内关系

how to avoid importing self, intra-package relationships

目录结构如下:

AppCenter/
main.pyw
|
|
_apps/
    __init__.py
    TabularApp.py
    UserAdministrationApp.py
    RegisterApp.py
    FnAdminApp.py
    PyUi/

__init__.py的内容:

import sys
sys.path.insert(1, '.')


__all__ = ['TabularApp',
           'UserAdministrationApp',
           'RegisterApp',
           'FnAdminApp']

弹出的问题:

当 main.pyw 尝试 from _apps import * 时。 在 UserAdministrationApp.py 中,我正在尝试向某些 QListWidget 项目动态添加工具提示,如下所示:

for app in self.__APPS__:

    app_icon = str(os.path.join(app_icons, f"{app}.png")).replace('\', '/')
    icon = QIcon(app_icon)
    if app != self.__class__:
        ttip_txt = eval(f'_apps.{app}.__doc__')
    else:
        ttip_txt = self.__doc__

    item = QListWidgetItem(icon, app)
    item.setText(app)
    item.setToolTip(ttip_txt)
    wdg.addItem(item)

self.__APPS__ 只是 _apps.__all__ 的副本。 我遇到的第一个问题是我会在 ttip_txt = eval(f'_apps.{app}.__doc__') 中得到一个 AttributeErrormodule x has no attribute y 我通过 UserAdministrationApp 模块中的 from _apps import * 解决了这个问题。此时我已经为测试目的重命名了这个模块并且一切正常,但是当我将名称改回 UserAdministrationApp.py 时我得到另一个 AttributeErrormodule __apps has no attribute UserAdministrationApp.

问题

我尝试阅读 python 导入文档,但其中没有任何内容真正对我有用。 我感觉它与试图导入自身的脚本有关。 但我仍然对这些问题很感兴趣:

好的,我找到了一个解决方案,虽然我认为它有点脏而且不是最好的风格,但它有效。

第一个

删除 from _apps import *from _apps import __all__.

然后

在从模块 UserAdministrationApp import 的主 class 初始化中在一个循环中跳过 self.__class_.__name__

    self.__APPS__ = _apps.__all__
    self.class_name = self.__class__.__name__
    for app in self.__APPS__:
        if self.class_name != app:
            exec(f'import _apps.{app}')

终于

    for app in self.__APPS__:

        app_icon = str(os.path.join(app_icons, f"{app}.png")).replace('\', '/')
        icon = QIcon(app_icon)
        if app != self.class_name:
            ttip_txt = eval(f'_apps.{app}.__doc__')
        else:
            ttip_txt = self.__doc__

找到解决方案后,出于教育目的,我仍然想首先了解错误的原因。 因此,如果任何人在任何时候浏览此内容并知道如何...非常欢迎您。