[英]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__
的副本。 我遇到的第一個問題是,我將收到AttributeError
說module x has no attribute y
在ttip_txt = eval(f'_apps.{app}.__doc__')
module x has no attribute y
,這是通過UserAdministrationApp模塊中的from _apps import *
解決的。 此時,我已經重命名了該模塊以進行測試,並且一切正常,但是當我將名稱更改回UserAdministrationApp.py
我又遇到了一個AttributeError
說module __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.