如何将函数参数键入为本机函数
How can I type a function argument as native function
我有一个辅助函数可以在 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__。
但是类型 "function" 在哪里?如果我输入()一个函数,它说 "function" 但 "function" 不在序言或 "typing" 中。我看到有人提到 "FunctionType" 但它也不在 "typing" 中。
函数的类型是types.FunctionType
(在types
模块中)。
如果将 func
的注释从 Callable
修改为 types.FunctionType
,mypy 将不再抱怨 __defaults__
。
我有一个辅助函数可以在 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__。 但是类型 "function" 在哪里?如果我输入()一个函数,它说 "function" 但 "function" 不在序言或 "typing" 中。我看到有人提到 "FunctionType" 但它也不在 "typing" 中。
函数的类型是types.FunctionType
(在types
模块中)。
如果将 func
的注释从 Callable
修改为 types.FunctionType
,mypy 将不再抱怨 __defaults__
。