python - python中根据类名快速查找要导入的模块
问题描述
我正在学习和玩 Python 和 Pyside2(QT5 的包装器)。
我在问 PySide2,但可能的答案可以帮助我处理每个包。
基本上,我正在关注一个教程,其中我阅读了我在这里报告的部分代码:
app = QApplication(sys.argv)
pixmap = QPixmap(":/splash.png")
splash = QSplashScreen(pixmap)
splash.show()
app.processEvents()
window = QMainWindow()
window.show()
splash.finish(window)
由于我是初学者并且教程没有提到我必须导入哪个模块才能使用 QSplashScreen,所以我经常浪费时间询问 Google 我必须导入哪个模块才能使用某些方法或类,在本例中为 QSplashScreen。
例如,为了在我的代码中使用 QLabel,我必须输入
from PySide2.QtWidgets import QLabel
我的理解是 QLabel 是“内部”QtWidgets,而 QtWidgets 又是“内部”PySide2。
现在我的问题是Python中是否存在我可以做的事情(在REPL中)
import magic
magic.findInTheFollowingPackage("PySide2").somethingINeed("QLabel")
>>> PySide2.QtWidgets # output
然后我可以得到答案
magic.findInThisPackage("PySide2").somethingINeed("QSplashScreen")
解决方案
你可以这样做:
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtGui import *
def get_import_of(cls):
print('from', cls.__module__, 'import', cls.__name__)
打印任何类的导入语句。
>>> get_import_of(QSplashScreen)
from PySide2.QtWidgets import QSplashScreen
>>> get_import_of(QPixmap)
from PySide2.QtGui import QPixmap
可以扩展函数以支持多个参数:
def get_import_of(*args):
d = {cls.__module__: [] for cls in args}
for cls in args:
d[cls.__module__].append(cls.__name__)
print('\n'.join(f'from {k} import ' + ', '.join(v) for k, v in d.items()))
>>> get_import_of(QSplashScreen, QPixmap, QLabel, QTimer)
from PySide2.QtWidgets import QSplashScreen, QLabel
from PySide2.QtGui import QPixmap
from PySide2.QtCore import QTimer
或者只是在交互式 shell 中输入类名。
>>> QSplashScreen
<class 'PySide2.QtWidgets.QSplashScreen'>
推荐阅读
- python - 如果我有来自一个函数的两个输出值,我可以将输出用作数组的参数(类型 int)吗?
- javascript - 通过 Javascript 提取 Apple 播客评论
- javascript - 在组件加载之前更新上下文状态
- python - 将情节 html 上传到 azure blob:将字符串更改为字节
- c - 为什么要先执行睡眠功能?
- macos - 使用 MacOS/iTerm2/ZSH 连接到 AWS EC2 服务器时,“setlocale: LC_CTYPE: cannot change locale (UTF-8)”
- powershell - 循环并添加到变量,直到没有更多的值
- systemd - 用于 systemd 单元的 setsockopt - 错误:“不允许操作”
- r - 使用 delta 方法估计风险差异
- rust - 选择菜单项时无法显示组