Liquidsのロゴ Liquids

型アノテーションで関数(引数,返り値)をバリデーション【Python】

Python
Pydantic

Pythonでは型アノテーションを使用して求められる型を明示することができますが、あくまでアノテーション(注釈)であって、沿わない型を与えてもエラーは発生しません。

例えば、以下のコードではstrが引数として与えられることを期待していますが、strでなくとも動作します。

def text_len(text: str) -> int:
    return len(text)

print(text_len(['this', 'is', 'text']))
# 3

意図していない動作を許容すると、バグが発生する可能性が出てきますが、これを回避するためにガード節を使用すると、2度手間になってしまいます。

関数の引数、返り値のバリデーションを行うことで、引数、返り値で求めているものを確実にできます。
バリデーションにはPydatnicのvalidate_callを用います。

Pydanticは標準モジュールではないので、インストールが必要です。

pip install pydantic

関数の引数、返り値の型をバリデーションするにはPydanticのvalidate_callを使用します。

validate_callはデコレーターとして利用し、誤った型を与えるとエラーを発生させてくれます。

from pydantic import validate_call

@validate_call
def text_len(text: str) -> int:
    return len(text)

print(text_len(['this', 'is', 'text']))

# pydantic_core._pydantic_core.ValidationError: 1 validation error for text_len
# 0
#   Input should be a valid string [type=string_type, input_value=['this', 'is', 'text'], input_type=list]
#     For further information visit https://errors.pydantic.dev/2.5/v/string_type

これで、関数の引き数をバリデーションできるようになりましたが、まだ返り値はバリデーションできていません。

関数の引数をバリデーションするにはvalidate_callを使用しました。
返り値をバリデーションするにはvalidate_callの引数のvalidate_returnTrueにします。
(validate_returnTrueにすると、引数および返り値がバリデーションされます。返り値だけではありません)

from pydantic import validate_call

@validate_call(validate_return=True)
def text_len(text: str) -> int:
    return text

text_len('abc')
# pydantic_core._pydantic_core.ValidationError: 1 validation error for text_len
#   Input should be a valid integer, unable to parse string as an integer [type=int_parsing, input_value='abc', input_type=str]
#     For further information visit https://errors.pydantic.dev/2.5/v/int_parsing

Liquidsのロゴ Liquids

Liquidsは誰でも投稿・編集ができる技術Wikiコミュニティ📝です。

あなたもLiquidsで技術Wikiを
書いてみませんか?