首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何自省Cython C扩展模块中定义的函数

如何自省Cython C扩展模块中定义的函数
EN

Stack Overflow用户
提问于 2017-09-04 08:39:24
回答 2查看 5.3K关注 0票数 8

Python的inspect模块似乎无法检查“内置”函数的签名,这些函数包括在C扩展模块中定义的函数,比如由Cython定义的函数。有没有任何方法可以获得您在这样一个模块中定义的Python函数的签名,特别是在Cython中?我希望能够找到可用的关键字参数。

MWE:

代码语言:javascript
复制
# mwe.pyx
def example(a, b=None):                                                                                                                                                       
    pass       

代码语言:javascript
复制
import pyximport; pyximport.install()                                                                                                                                         
import mwe                                                                                                                                                                    
import inspect                                                                                                                                                                

inspect.signature(mwe.example)   

产量:

代码语言:javascript
复制
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中

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-04 16:58:28

我收回了我重复的建议(说这不可能.)经过进一步的调查。对于Cython (v0.23.4)和Python3.4.4的最新版本,它似乎运行得很好。

代码语言:javascript
复制
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编译选项,则示例工作:

代码语言:javascript
复制
import cython
@cython.binding(True)
def example(a, b=None):                                                                                                                                                       
    pass

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

票数 9
EN

Stack Overflow用户

发布于 2019-06-26 16:42:44

以上使用绑定装饰器的答案在运行已被cython化的代码时对我有效。但是,当我在Django 2.2应用程序中运行相同的代码时,应用程序一开始就会失败,因为cython没有属性“binding”。为了避免这种情况,我在文件的顶部添加了这个“特殊的cythonized”,其中包含有文档化的这里函数,以实现同样的结果。

代码语言:javascript
复制
# cython: binding=True

def example(a, b=None):                                                                                                                                                       
    pass
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46033277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档