经过进一步调查,我撤回了我的重复建议(说这是不可能的…)。在相当近期的Cython(v0.23.4)和Python
3.4.4版本中,它似乎可以正常工作。
import cythonimport inspectscope = 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最近才进行的改进(可能是此修复程序),因此,如果您使用的是Python
2,则可能不走运。
编辑: 如果使用
binding编译选项,您的示例将起作用:
import cython@cython.binding(True)def example(a, b=None): pass
我怀疑
inline会自动添加它(但是要执行的代码
inline非常复杂,以至于我找不到这两种方法的证明)。您也可以将其设置为文件级选项。



