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

2024-09-30 03:26:09 发布

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

目录结构如下:

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时,我得到了另一个AttributeError的名称module __apps has no attribute UserAdministrationApp

问题

我试着阅读python导入文档,但其中没有任何东西真正对我有用。 我感觉到这与试图导入自己的脚本有关。 但我仍然对这些问题感兴趣:

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

Tags: appspyimportselftxtappdocinit
1条回答
网友
1楼 · 发布于 2024-09-30 03:26:09

好吧,我找到了一个解决方案,虽然我觉得它有点脏,不是最好的风格,但它是有效的

首先

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

然后

在初始化主类时,从模块UserAdministrationAppimport在循环中跳过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__

在找到解决办法之后,我仍然想听听为什么这个错误首先是出于教育目的。 所以,如果任何人在任何时候看了这一点,并知道如何…你是非常欢迎的

相关问题 更多 >

    热门问题