簡體   English   中英

是否可以使用布爾返回函數作為類型提示?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM