如何获得PyQt方法的正确签名

问题描述

我正在尝试使用 inspect 模块来确定方法Signature,但我遇到了 PyQt 小部件的问题。小部件报告包含 *args**kwargs 的签名,但不能使用任意关键字参数调用

>>> from PyQt5.QtWidgets import QWidget,QApplication
>>> from inspect import signature
>>> signature(QWidget.__init__)
<Signature (self,/,*args,**kwargs)>
>>> app = QApplication([])
>>> QWidget(c=10)
TypeError: 'c' is an unkNown keyword argument

然而,VSCode 似乎能够判断方法的实际签名是什么,因为它正确地自动填充调用或覆盖:

QWidget(

显示以下工具提示

enter image description here

和:

class MyWidget(QWidget):
    def __init__

自动完成覆盖的 __init__ 方法以:

def __init__(self,parent:,flags:,) -> None:
    super().__init__(parent=parent,flags=flags)

有没有办法在我的代码中真正获得 PyQt5 小部件方法的正确签名?

解决方法

看起来最简单的方法是使用文档字符串:

>>> QWidget.__doc__
'QWidget(parent: QWidget = None,flags: Union[Qt.WindowFlags,Qt.WindowType] = Qt.WindowFlags())'
>>>
>>> QWidget.windowTitle.__doc__
'windowTitle(self) -> str'

我不确定 VSCode 的签名是从哪里获得的。一些 IDE(如 PyCharm)使用 typehint stub files 来完成代码和调用提示 - 但 this issue 似乎暗示 VSCode 可能不会这样做(目前)。

至于 inspect.signaturenote in the docs 强烈暗示这并不总是适用于扩展模块。它甚至不能与 python 内置程序一致地工作:

>>> inspect.signature(list)
<Signature (iterable=(),/)>   
>>>
>>> inspect.signature(dict)
Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
  File "/usr/lib/python3.9/inspect.py",line 3130,in signature
    return Signature.from_callable(obj,follow_wrapped=follow_wrapped)
  File "/usr/lib/python3.9/inspect.py",line 2879,in from_callable
    return _signature_from_callable(obj,sigcls=cls,File "/usr/lib/python3.9/inspect.py",line 2410,in _signature_from_callable
    raise ValueError(
ValueError: no signature found for builtin type <class 'dict'>