繁体   English   中英

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

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

问题

我尝试阅读python import docs,但其中的任何内容都没有对我说什么。 我感觉到它与试图导入自身的脚本有关。 但是我仍然对这些问题感兴趣:

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

好的,我找到了一个解决方案,尽管我认为它有点脏而且不是最佳样式,但是它可以工作。

第一

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__

找到解决方案后,我仍然想听听为什么出于教育目的首先出现错误。 因此,如果任何人在任何时候都对此有所了解并知道如何...,我们将非常欢迎。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM