如何获得 PyQt 方法的正确签名
How to get the correct signature of PyQt methods
我正在尝试使用 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(
显示以下工具提示:
和:
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 for code-completion and call-tips - but this issue 似乎表明 VSCode 可能不会这样做(还)。
至于 inspect.signature
:note 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'>
我正在尝试使用 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(
显示以下工具提示:
和:
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 for code-completion and call-tips - but this issue 似乎表明 VSCode 可能不会这样做(还)。
至于 inspect.signature
:note 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'>