0

我想使用Jedi为我的 pybind11 模块提供代码完成。Jedi 评估__signature__可调用对象的完成情况。有关更多信息,请参阅:Jedi 与 pybind11 模块的斗争。但是 pybind11 目前无法生成它们:设置 callables 的 text_signature 属性

__signature__在加载 pybind11 模块后,有没有办法使用 python 解释器手动设置可调用对象(尤其是函数)?像这样的东西:

pyModule.myFunc.__signature__ = *Do some magic here*

是否有一些工具可以生成 python 可调用对象的签名?有很多用于在运行时动态创建函数的包,这些包也创建了签名。但这不是我的用例。

4

1 回答 1

1

我没有用 Jedi 测试这个,因为可靠的设置和重现看起来需要做很多工作,但也许以下内容已经可以工作了。

检查可调用的签名的规范方法是恰当命名的inspect.signature函数。它依赖于__annotations__可以在运行时修改的魔法属性:

>>> from inspect import signature
>>> def foo(bar):
...     return True
... 
>>> signature(foo)
<Signature (bar)>  # empty signature
>>> import typing
>>> foo.__annotations__ = {'bar': typing.Union[bool, None], 'return': bool}
>>> signature(foo)
<Signature (bar: Union[bool, NoneType]) -> bool>   # now contains the info we added

由于__signature__不是标准字段,它可能由 Jedi 生成,您链接的票证中的问题描述也暗示他们更愿意inspect.signature直接利用。

于 2019-08-26T09:20:54.547 回答