是否可以使用返回布尔值的函数作为类型提示?

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

下面是具有某些类型提示的函数的两个示例:

def sum_dem_digits(digits:str) -> int:
    return sum(int(d) for d in digits)

def do_stuff(x:int):
    lizzard = ["eyes", "nose", "body", "tail"]
    return lizzard[x]

有没有办法将任意布尔返回函数设置为类型提示?

import string

def numeric_string(chs:str) -> bool:
    """
        BAD:  "ANACONDA, RATTLESNAKE, SIDEWINDER"
        BAD:  "WHAT I HAD FOR LUNCH"
        GOOD: "1234"
        GOOD: "99"
    """
    return all([ch in string.digits for ch in chs])

def sum_dem_digits(digits:numeric_string) -> int:
    return sum(int(d) for d in digits)

#######################################################################

def do_stuff_helper(x:int):
    return (0 <= x) and (x <= 3)

def do_stuff(x:do_stuff_helper):
    lizzard = ["eyes", "nose", "body", "tail"]
    return lizzard[x]
python error-handling python-typing
1个回答
1
投票

答案并不是很简单的是或否。

任意函数不是有效的静态类型。从技术上讲,它们是合法的注释,因为您可以使用任何对象作为注释,Python 不会关心,但任何使用类型提示进行类型分析的内容都会将此视为错误。

更重要的是,你为什么要这样做?如果您希望像 mypy 这样的工具能够检查输入是否通过您的函数,那么这是没有希望的。 mypy 是一个静态工具,运行你的函数将是一个运行时的事情。 mypy 无法看到运行时参数值,也无法弄清楚在这些值上运行

do_stuff_helper
会做什么。

如果您想构建自己的自己的工具,根据作为类型注释提供的约束函数执行运行时约束检查,那么当然,您可以这样做。理想情况下,您可以使用

typing.Annotated
以不干扰类型提示的方式提供约束函数:

class Constraint:
    def __init__(self, constraint_function):
        self.constraint_function = constraint_function

@some_checker_decorator_you_write
def do_stuff(x: Annotated[int, Constraint(do_stuff_helper)]):
    ...
© www.soinside.com 2019 - 2024. All rights reserved.