IT技術で仕事を減らしたい!

ITエンジニアのメモ+α

Python TypingのLiteral型を使ってみる

どうも、nippa です。

最近 python で type annotation を使ってコード作成をしています。

Typescript では literal type をよく使うので、python でも Literal 型を扱うことが できます。

今回は typing の Laiteral についてまとめます。

環境

Typing の Literal 型

一般的な Literal 型の使い方は以下のようになります。

from typing import Literal

Fruit = Literal["apple", "banana"]

def fruit_choice(fruit: Fruit) -> None:
    print(f"You chose {fruit}.")

関数の引数に Literal 型で指定した文字列以外を指定すると、mypy でのチェックでエラ ー扱いになります。

実行時には、エラーにならず、そのまま実行されてしまいますので、注意が必要です。

Literal の結合

Literal で定義した、変数に値を追加することはできません。

typing の Uion を利用して、Literal を結合することは可能です。

from typing import Literal, Union

Fruit = Literal["apple", "banana"]
Meet = Literal["beef", "pork"]

Food = Union[Fruit, Meet]

def food_choice(food: Food) -> None:
    print(f"You chose {food}.")

このようにして、Literal 型を結合することができます。

Literal 型の list 型への変換

変数の Validation に Literal 型を使おうとするとそのままでは実行時にエラーになり ます。

get_argsを使って、引数を取得して、list 化する必要があります。

以下のような形であれば、friut か meet を判断することが

from typing import Literal, Union, get_args

Fruit = Literal["apple", "banana"]
Meet = Literal["beef", "pork"]

Food = Union[Fruit, Meet]


def food_choice(food: Food) -> None:
    if food in list(get_args(Fruit)):
        print("You chose fruit.")
    elif food in list(get_args(Meet)):
        print("You chose meet.")
    else:
        print("You cannot choose it")

Literal 型で定義した変数はこの形で Validation できます。

感想

今回、簡単な Literal 型の使い方についてまとめました。

python で literal 型を使うと開発やデバッグのコストが低下するので、必要に合わせて 使えるとよいと思っています。

ではでは、また次回。