有沒有辦法讓這個工作成功from typing import Literaldef foo(bar: Literal["bar"]) -> Literal["foo"]: foo = "foo" return foobar = "bar"foo(bar)這是錯誤foo.py:4: error: Incompatible return value type (got "str", expected "Literal['foo']")foo.py:8: error: Argument 1 to "foo" has incompatible type "str"; expected "Literal['bar']"很明顯,foo變量 和bar是文字,因為它們被分配給文字,所以這是安全的,但 mypy 似乎沒有跟蹤這一點。我有什么遺漏的嗎?
1 回答

呼如林
TA貢獻1798條經驗 獲得超3個贊
MyPy 將文字推斷為它們的內置類型,而不是Literal
它們的值。
mypy文檔 ? 文字類型
您必須顯式向變量添加注釋以聲明它具有文字類型。[..] 沒有此注釋的變量不被假定為文字。
為了允許推斷Literal
值,請將變量注釋為Final
:
from typing import Final
from typing_extensions import Final
bar: Final = "bar"
reveal_type(bar)? # Revealed type is 'Literal['bar']?'
將變量注釋為Final表示其值不會被類似類型的值替換。這使得將類型推斷為特定Literal值而不僅僅是一般類型是正確的。
Literal請注意,此推斷是上下文相關的:對于所有需要 a 的情況都會推斷出類型Literal。對于需要類型的情況,無論是文字類型、基本類型還是 TypeVar,該類型都會被推斷為通用類型。
reveal_type([bar])? # Revealed type is 'builtins.list[builtins.str*]'
添加回答
舉報
0/150
提交
取消