とにかくこれを機能させるためにありますか
from typing import Literal
def foo(bar: Literal["bar"]) -> Literal["foo"]:
foo = "foo"
return foo
bar = "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はこれを追跡しないようです。私が見逃しているものはありますか?
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*]'
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加