[英]Is it possible to use a boolean-returning function as a type hint?
以下是具有一些類型提示的函數的兩個示例:
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)]):
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.