首页 > 解决方案 > 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")

标签: pythonimportmodulepyside2

解决方案


你可以这样做:

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'>

推荐阅读