蟒蛇的inspectmodule 似乎无法检查“内置”函数的签名,其中包括 C 扩展模块中定义的函数,例如 Cython 定义的函数。有什么方法可以获取您在此类模块中定义的 Python 函数的签名,特别是在 Cython 中?我希望能够找到可用的关键字参数。
MWE:
# mwe.pyx
def example(a, b=None):
pass
and
import pyximport; pyximport.install()
import mwe
import inspect
inspect.signature(mwe.example)
yields:
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={})
中也提到文档是编译选项“binding"这显然使这个细节更容易理解(尽管我不需要它)。
我有一种感觉,这可能取决于以下方面的改进inspect
相对最近制作的(可能this fix)所以如果您使用的是 Python 2,您可能会不走运。
Edit:如果您使用的话,您的示例就有效binding
编译选项:
import cython
@cython.binding(True)
def example(a, b=None):
pass
我怀疑inline
自动添加它(但要做的代码inline
足够复杂,我无法找到任何证据)。您还可以将其设置为文件级选项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)