python - 如何内省(introspection) Cython C 扩展模块中定义的函数

标签 python cython introspection python-c-extension

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 中

最佳答案

在进一步调查后,我撤回了重复的建议(说这是不可能的……)。它似乎适用于相当新的 Cython (v0.23.4) 和 Python 3.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={})


the documentation is the compilation option "binding" 中也提到了这显然使这个细节更容易访问(尽管我不需要它)。


我觉得这可能取决于最近对 inspect 所做的改进(可能是 this fix ),所以如果您使用的是 Python 2,您可能就不走运了。


编辑:如果您使用binding 编译选项,您的示例将有效:

import cython
@cython.binding(True)
def example(a, b=None):                                                                                                                                                       
    pass

我怀疑 inline 会自动添加它(但是执行 inline 的代码非常复杂,我无法找到任何一种方式的证据)。您也可以将其设置为文件级选项。

关于python - 如何内省(introspection) Cython C 扩展模块中定义的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46033277/

相关文章:

python - Tkinter 中的文本输入

python - View 中的 Django asyncio 调用不起作用

python - 在 cython 中声明 numpy 数组和 c 指针

python - 列出内置函数和方法 (Python)

java - 有没有办法在java中检查变量的标签?

尝试将 pytorch 模块添加到循环中的顺序模块时,Python 执行挂起

python - 在分析 Cython 代码时,什么是 `stringsource` ?

enums - 将 c++ 头文件中的枚举包含到 cython 中

python - Python 方法可以检查它是否已从自身内部调用吗?

python - 在 Python 中使用变量作为类名?