如何将函数参数输入为本机函数

问题描述 投票:0回答:1

我有一个辅助函数可以在 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 不起作用,可以理解:并非所有 Callable 都有 __defaults__。 但是“函数”类型在哪里呢?如果我输入()一个函数,它会说“函数”,但“函数”不在序言或“打字”中。我看到有些人提到“FunctionType”,但它也不在“打字”中。

python python-typing mypy
1个回答
1
投票

函数的类型是

types.FunctionType
(在
types
模块中)。

如果将

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

© www.soinside.com 2019 - 2024. All rights reserved.