如何键入函数参数作为本机函数

时间:2018-03-26 19:38:16

标签: python-3.6 typing mypy type-annotation

我有一个在python repl中使用的辅助函数将变量移动到全局以便于调试。但是有一个mypy错误:

class stepin(object):  # pylint: disable=R0903
    def __init__(self, func: Callable) -> None:
        self.func = func
        self.args = func.__code__.co_varnames
        if hasattr(func, "__defaults__") and func.__defaults__:
            self.defaults = dict(zip(reversed(self.args), reversed(func.__defaults__)))
        else:
            self.defaults = None

    def __call__(self, *args, **kwargs):
        result_dict = {x: None for x in self.args}
        if self.defaults:
            result_dict.update(self.defaults)
        result_dict.update(dict(zip(self.args, args)))
        result_dict.update(kwargs)
        for x in result_dict.keys():
            if result_dict[x] is None:
                raise ValueError('Missing args: ', self.func.__qualname__, x)
        globals().update(result_dict)

现在,行

if hasattr(func, "__defaults__") and func.__defaults__:
    self.defaults = dict(zip(reversed(self.args), reversed(func.__defaults__)))

引发一个mypy错误,说func没有__defaults__ 现在我明白BDFL已经说他鄙视“hasattr”检查所以它可能不会在mypy中解决;那么我的问题是,有没有办法改变__init__输入签名以摆脱错误?

我尝试了什么:Callable不起作用,可以理解:并非所有Callables都有__defaults__。 但是“功能”类型在哪里?如果我键入()函数,它说“函数”,但“函数”不在序言或“打字”。我看到有些人提到“FunctionType”,但它也没有“打字”。

1 个答案:

答案 0 :(得分:1)

函数的类型为types.FunctionType(在types模块中)。

如果将func的注释从Callable修改为types.FunctionType,则mypy不再抱怨__defaults__