4

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

简单的例子:

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()
4

2 回答 2

2

可能是类型检查器问题。下面的解决方案。使用mypy可以,但pycharmpyre-check抱怨。

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()
于 2019-08-08T11:21:30.090 回答
0

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

@example_decorator
def func(data: list) -> list:
    new_data = data
    new_data.append('XYZ')
    return new_data
于 2019-08-08T09:34:40.283 回答