装饰器更改返回类型时的键入功能



如何正确编写返回类型被装饰器修改的函数的类型?

简单的例子:

def example_decorator(fn):
def wrapper(data):
res = fn(data)
return ', '.join(res)
return wrapper

@example_decorator
def func(data: list):  # -> ???? str ? list ?
new_data = data
new_data.append('XYZ')
return new_data

# When we type func -> list
def test() -> str:
result = func(['ABC', 'EFG'])
print(type(result))  # <class 'str'>
return result  # Incompatible return type [7]: Expected str but got list.

test()

可能是类型检查器问题。解决方案如下。 有了mypy,它还可以,但pycharm柴堆检查正在抱怨。

from typing import *
def example_decorator(
fn: Callable[[List[str]], List[str]]
) -> Callable[[List[str]], str]:
def wrapper(data: List[str]) -> str:
res = fn(data)
return ', '.join(res)
return wrapper

@example_decorator
def func(data: List[str]) -> List[str]:  
data.append('XYZ')
return data

def test() -> str:
result = func(['ABC', 'EFG'])
print(type(result))  # <class 'str'>
return result

test()

该函数返回一个列表,如下所示:

@example_decorator
def func(data: list) -> list:
new_data = data
new_data.append('XYZ')
return new_data