如何避免导入自身、包内关系
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__
的副本。
我遇到的第一个问题是我会在 ttip_txt = eval(f'_apps.{app}.__doc__')
中得到一个 AttributeError
说 module x has no attribute y
我通过 UserAdministrationApp 模块中的 from _apps import *
解决了这个问题。此时我已经为测试目的重命名了这个模块并且一切正常,但是当我将名称改回 UserAdministrationApp.py
时我得到另一个 AttributeError
说 module __apps has no attribute UserAdministrationApp
.
问题
我尝试阅读 python 导入文档,但其中没有任何内容真正对我有用。
我感觉它与试图导入自身的脚本有关。
但我仍然对这些问题很感兴趣:
- 当我有
import _apps
时,为什么在第一种情况下导入失败?
- 为什么在第二种情况下它至少不看到自己然后产生一个
ImportError
而不是 AtributeError
?
- 处理这类情况的最佳方法是什么?
好的,我找到了一个解决方案,虽然我认为它有点脏而且不是最好的风格,但它有效。
第一个
删除 from _apps import *
和 from _apps import __all__
.
然后
在从模块 UserAdministrationApp
import
的主 class 初始化中在一个循环中跳过 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__
找到解决方案后,出于教育目的,我仍然想首先了解错误的原因。
因此,如果任何人在任何时候浏览此内容并知道如何...非常欢迎您。
目录结构如下:
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__')
中得到一个 AttributeError
说 module x has no attribute y
我通过 UserAdministrationApp 模块中的 from _apps import *
解决了这个问题。此时我已经为测试目的重命名了这个模块并且一切正常,但是当我将名称改回 UserAdministrationApp.py
时我得到另一个 AttributeError
说 module __apps has no attribute UserAdministrationApp
.
问题
我尝试阅读 python 导入文档,但其中没有任何内容真正对我有用。 我感觉它与试图导入自身的脚本有关。 但我仍然对这些问题很感兴趣:
- 当我有
import _apps
时,为什么在第一种情况下导入失败? - 为什么在第二种情况下它至少不看到自己然后产生一个
ImportError
而不是AtributeError
? - 处理这类情况的最佳方法是什么?
好的,我找到了一个解决方案,虽然我认为它有点脏而且不是最好的风格,但它有效。
第一个
删除 from _apps import *
和 from _apps import __all__
.
然后
在从模块 UserAdministrationApp
import
的主 class 初始化中在一个循环中跳过 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__
找到解决方案后,出于教育目的,我仍然想首先了解错误的原因。 因此,如果任何人在任何时候浏览此内容并知道如何...非常欢迎您。