如何避免导入自我,包内关系

时间:2017-03-19 16:36:14

标签: python exec python-import python-3.6

目录结构如下:

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__的副本。 我遇到的第一个问题是我会在AttributeErrormodule x has no attribute yttip_txt = eval(f'_apps.{app}.__doc__')我在UserAdministrationApp模块中通过from _apps import *解决了这个问题。此时我已经重命名了这个模块用于测试目的并且一切正常,但是当我将名称更改回UserAdministrationApp.py时,我得到另一个AttributeErrormodule __apps has no attribute UserAdministrationApp

问题

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

  • 为什么导入在第一种情况下失败,当我有import _apps
  • 为什么在第二种情况下,它至少看不到自己然后产生ImportError而不是AtributeError
  • 处理这些类型情况的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

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

第一

删除from _apps import *,只删除from _apps import __all__

然后

在跳过UserAdministrationApp

的循环中,从模块import 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__

找到解决方案之后,我仍然希望听到为什么错误是出于教育目的。 因此,如果有人在任何时候浏览了这一点并且知道如何......你非常欢迎。