下面是具有某些类型提示的函数的两个示例:
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 不会关心,但任何使用类型提示进行类型分析的内容都会将此视为错误。
更重要的是,你为什么要这样做?如果您希望像 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)]):
...