Python的inspect模块似乎无法检查“内置”函数的签名,这些函数包括在C扩展模块中定义的函数,比如由Cython定义的函数。有没有任何方法可以获得您在这样一个模块中定义的Python函数的签名,特别是在Cython中?我希望能够找到可用的关键字参数。
MWE:
# mwe.pyx
def example(a, b=None):
pass 和
import pyximport; pyximport.install()
import mwe
import inspect
inspect.signature(mwe.example) 产量:
Traceback (most recent call last):
File "mwe_py.py", line 5, in <module>
inspect.signature(mwe.example)
File "/nix/store/134l79vxb91w8mhxxkj6kb5llf7dmwpm-python3-3.4.5/lib/python3.4/inspect.py", line 2063, in signature
return _signature_internal(obj)
File "/nix/store/134l79vxb91w8mhxxkj6kb5llf7dmwpm-python3-3.4.5/lib/python3.4/inspect.py", line 1965, in _signature_internal
skip_bound_arg=skip_bound_arg)
File "/nix/store/134l79vxb91w8mhxxkj6kb5llf7dmwpm-python3-3.4.5/lib/python3.4/inspect.py", line 1890, in _signature_from_builtin
raise ValueError("no signature found for builtin {!r}".format(func))
ValueError: no signature found for builtin <built-in function example> 在Python 3.4.5和Cython 0.24.1中
发布于 2017-09-04 16:58:28
我收回了我重复的建议(说这不可能.)经过进一步的调查。对于Cython (v0.23.4)和Python3.4.4的最新版本,它似乎运行得很好。
import cython
import inspect
scope = cython.inline("""def f(a,*args,b=False): pass """)
print(inspect.getfullargspec(scope['f']))给出输出
FullArgSpec(args=['a'], varargs='args', varkw=None, defaults=None, kwonlyargs=['b'], kwonlydefaults={'b': False}, annotations={})
在“中也提到了这一点,这显然使这个细节更容易访问(尽管我不需要它)。
我有一种感觉,这可能取决于最近对inspect的改进(可能是这个修复),所以如果您正在使用Python2,那么您可能运气不佳。
编辑:如果使用binding编译选项,则示例工作:
import cython
@cython.binding(True)
def example(a, b=None):
pass我怀疑inline是自动添加的(但是执行inline的代码非常复杂,因此我无法找到任何一种方法的证据)。您还可以将其设置为文件级选项。
发布于 2019-06-26 16:42:44
以上使用绑定装饰器的答案在运行已被cython化的代码时对我有效。但是,当我在Django 2.2应用程序中运行相同的代码时,应用程序一开始就会失败,因为cython没有属性“binding”。为了避免这种情况,我在文件的顶部添加了这个“特殊的cythonized”,其中包含有文档化的这里函数,以实现同样的结果。
# cython: binding=True
def example(a, b=None):
passhttps://stackoverflow.com/questions/46033277
复制相似问题