【发布时间】:2018-10-27 08:00:04
【问题描述】:
我正在使用 Python 3 类型注释进行验证和依赖注入的 Python Web 框架。
所以我正在寻找一种方法来从给定生成函数的参数中生成带有类型注释的函数:
def gen_fn(args: Dict[str, Any]) -> Callable:
def new_fn(???):
pass
return new_fn
这样
inspect.signature(gen_fn({'a': int}))
会回来
<Signature (a:int)>
有什么我可以代替 ??? 的东西来做我需要的事情。
我还查看了inspect 模块中的Signature.replace(),但没有找到将新签名附加到新函数或现有函数的方法。
我对使用ast 犹豫不决,因为:
抽象语法本身可能会随着每个 Python 版本而改变
所以我的问题是:基于传递给生成函数的dict,生成具有 Python 3 类型注释的函数的合理方法是什么(如果有)?
编辑:虽然@Aran-Fey 的solution 正确回答了我的问题,但看来我的假设是错误的。更改签名不允许使用新签名调用new_fn。那就是gen_fn({'a': int})(a=42) 引发了TypeError: ...`得到了一个意外的关键字参数'a'。
【问题讨论】:
-
我想实现这一点的一种方法是构建一个字符串和
eval()整个字符串来获取函数定义。但我认为这不是最好的方法。 -
MonkeyType 可以为某些函数生成类型注解,但需要在运行时检查类型。
标签: python metaprogramming type-hinting