簡體   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