【问题标题】:python, validate custom return typepython,验证自定义返回类型
【发布时间】:2021-02-25 23:51:55
【问题描述】:

如何在 python 中验证方法的返回类型? 假设myfunc 返回一个元组列表,我想要这样的东西:

def myfunc() :
    return [(1,2), (3,4)]

我尝试使用typingTypeVal

from typing import TypeVar, Type
def myfunc() -> list[tuple]:
   ...

或类似的东西:

list_tup = list[tuple]
def myfunc(t: Type[T]) -> list_tup :
    ...

回溯(最近一次调用最后一次):文件“”,第 1 行,在 TypeError 中:'type' 对象不可下标

什么是正确的语法或如何验证自定义返回类型?

【问题讨论】:

    标签: python validation return-type typing


    【解决方案1】:

    Python 的 typing 包提供了您正在寻找的内容,请参阅 here 了解有关集合的详细信息。但你正在寻找这样的东西:

    from typing import Tuple, List
    
    def myfunc() -> List[Tuple[int]]:
      ...
    

    话虽如此,python 的类型注释并不能完全“验证”任何东西,它的实现是为了允许 IDE 执行更好的语法突出显示并帮助使 python 代码更具可读性。来自pep 484

    在这些目标中,静态分析是最重要的。这包括对离线类型检查器(如 mypy)的支持,以及提供可供 IDE 用于代码完成和重构的标准符号。

    例如下面的 sn-p 是有效的,即使标记的返回类型和实际的返回类型不同:

    def fn() -> str:
      return 5
    

    如果你真的想要严格验证返回类型,你可以在最后放置一些条件:

    def myfunc():
      val = list()
    
      if not isinstance(list, val):
        ...
    

    但是,这实际上并不是最有用的方法,因为如果输入正确,您应该始终生成相同的类型。因此,如果要进行任何类型验证,则任何类型验证都应该在函数开始时对参数进行。

    【讨论】:

    • 值得注意的是,从 Python 3.9 开始,问题中列出的代码实际上可以工作。
    【解决方案2】:

    listtuple 在 Python 3.9 之前不能以这种方式使用。试试:

    from typing import List, Tuple
    def myfunc() -> List[Tuple]:
       ...
    

    【讨论】:

    • 感谢@Kemp,这行得通。我的导入不包括 List 和 Tuple!
    【解决方案3】:
    from valdec.decorators import validate
    from typing import List, Tuple
    
    
    @validate("return")
    def myfunc(arg) -> List[Tuple[int, ...]]:
        return arg
    
    
    arg = [(1, 2), (3, 4)]
    myfunc(arg)  # Ok
    

    错误:

    arg = (1, 2)
    myfunc(arg)  # valdec.errors.ValidationReturnError...
    
    arg = "1234"
    myfunc(arg)  # valdec.errors.ValidationReturnError...
    
    ...
    

    valdec:https://github.com/EvgeniyBurdin/valdec

    【讨论】:

      猜你喜欢
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      • 2019-02-18
      • 1970-01-01
      • 2019-02-02
      • 1970-01-01
      相关资源
      最近更新 更多