我想使用Jedi为我的pybind11模块提供代码完成。绝地为完成任务评估了可召唤的__signature__。有关详细信息,请参阅:Jedi struggles with pybind11 modules。但是pybind11目前还不能生成它们:Set the text_signature attribute of callables
在加载pybind11模块之后,有没有办法使用python解释器手动设置可调用代码(尤其是函数)的__signature__?如下所示:
pyModule.myFunc.__signature__ = *Do some magic here*
有没有一些工具可以生成python可调用的签名?有很多在运行时动态创建函数的包,这些包也创建签名。但这不是我的用例。
发布于 2019-08-26 17:20:55
我没有用绝地测试这一点,因为它看起来需要很多工作才能可靠地设置和复制,但也许下面的方法已经可以工作了。
检查可调用对象签名的规范方法是命名恰当的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__不是一个标准字段,它可能是由绝地生成的,他们在the ticket you linked中的问题描述也暗示了他们更喜欢直接利用inspect.signature。
https://stackoverflow.com/questions/57653513
复制相似问题