【Python】関数の引数や戻り値に複数の型ヒントを指定する方法

この記事では、Pythonの関数の引数や戻り値に複数の型ヒントを指定する方法について解説します。

具体的には、Union型ヒント、Tuple型ヒント、Any型ヒントの使い方を紹介します。

目次から探す

関数の引数に複数の型ヒントを指定する方法

関数の引数に複数の型ヒントを指定することは、Pythonの静的型チェックの効果を高めるために役立ちます。

以下では、Union型ヒント、Tuple型ヒント、Any型ヒントの3つの方法を紹介します。

Union型ヒントを使用する方法

Union型ヒントを使用すると、引数に複数の型を指定することができます。

具体的なコード例を見てみましょう。

from typing import Union

def greet(name: Union[str, list[str]]) -> str:
    if isinstance(name, str):
        return f"Hello, {name}!"
    elif isinstance(name, list):
        return f"Hello, {', '.join(name)}!"
    else:
        return None
print(greet("World"))
print(greet(["Alice", "Bob"]))
print(greet(42)) 
Hello, World!
Hello, Alice, Bob!
None

上記の例では、nameという引数には、str型またはList[str]型のいずれかを指定することができます。

isinstance()関数を使用して、引数の型を判定し、適切な処理を行っています。

Tuple型ヒントを使用する方法

Tuple型ヒントを使用すると、引数に複数の型をタプルで指定することができます。

以下に例を示します。

def calculate_average(numbers: tuple[int, float]) -> float:
    return sum(numbers) / len(numbers)

print(calculate_average((1, 2, 3, 4, 5)))
print(calculate_average((1.1, 2.2, 3.3, 4.4, 5.5)))

# TypeError: unsupported operand type(s) for +: 'int' and 'str'
# print(calculate_average(('a', 'b', 'c', 'd', 'e'))) 
3.0
3.3

上記の例では、numbersという引数には、int型float型の要素を持つタプルを指定することができます。

sum()関数を使用して要素の合計を計算し、len()関数を使用して要素の数で割って平均値を求めています。

Any型ヒントを使用する方法

Any型ヒントを使用すると、引数にどんな型でも指定することができます。

以下に例を示します。

def print_value(value: Any) -> None:
    print(value)

上記の例では、valueという引数には、どんな型でも指定することができます。

print()関数を使用して、引数の値を出力しています。

以上が関数の引数に複数の型ヒントを指定する方法の紹介です。

適切な型ヒントを使用することで、コードの可読性や保守性を向上させることができます。

関数の戻り値に複数の型ヒントを指定する方法

関数の戻り値に複数の型ヒントを指定することもできます。

これにより、関数が返す値の型を明示的に指定することができます。

以下では、Union型ヒント、Tuple型ヒント、Any型ヒントの3つの方法を紹介します。

Union型ヒントを使用する方法

Union型ヒントを使用すると、関数の戻り値が指定した複数の型のいずれかであることを示すことができます。

Union型ヒントは、typingモジュールのUnionクラスを使用して指定します。

from typing import Union
def add(a: int, b: int) -> Union[int, float]:
    return a + b
result = add(3, 4)
print(result)
result = add(2, 3.5)
print(result)
7
5.5

上記の例では、add関数の戻り値の型ヒントとしてUnion[int, float]を指定しています。

これにより、関数は整数型または浮動小数点型のいずれかを返すことができます。

Tuple型ヒントを使用する方法

Tuple型ヒントを使用すると、関数の戻り値が指定した複数の型の要素を持つタプルであることを示すことができます。

Tuple型ヒントは、typingモジュールのTupleクラスを使用して指定します。

from typing import Tuple
def divide(a: int, b: int) -> Tuple[int, float]:
    quotient = a // b
    remainder = a % b
    return quotient, remainder
result = divide(10, 3)
print(result)
(3, 1)

上記の例では、divide関数の戻り値の型ヒントとしてTuple[int, float]を指定しています。

これにより、関数は整数型と浮動小数点型の要素を持つタプルを返すことができます。

Any型ヒントを使用する方法

Any型ヒントを使用すると、関数の戻り値の型を特定の型に制約せず、任意の型であることを示すことができます。

Any型ヒントは、typingモジュールのAnyクラスを使用して指定します。

from typing import Any
def get_value() -> Any:
    return 10
result = get_value()
print(result)
result = get_value() + 5
print(result)
10
15

上記の例では、get_value関数の戻り値の型ヒントとしてAnyを指定しています。

これにより、関数は任意の型の値を返すことができます。

これらの方法を使うことで、関数の戻り値に複数の型ヒントを指定することができます。

適切な型ヒントを使用することで、コードの可読性を向上させることができます。

型ヒントの組み合わせ

型ヒントを使用する際には、引数や戻り値に複数の型を指定することも可能です。

ここでは、引数と戻り値に複数の型ヒントを指定する方法と、その際の注意点について解説します。

引数と戻り値に複数の型ヒントを指定する方法

Pythonでは、Union型ヒントを使用することで、引数や戻り値に複数の型を指定することができます。

Union型ヒントは、複数の型を縦棒(|)で区切って指定します。

以下は、引数に複数の型ヒントを指定する例です。

from typing import Union

def greet(name: Union[str, list[str]]) -> str:
    if isinstance(name, str):
        return f"Hello, {name}!"
    elif isinstance(name, list):
        return f"Hello, {', '.join(name)}!"
print(greet("World"))
print(greet(["World", "Python"]))
print(greet(42))
Hello, World!
Hello, World, Python!
None

この例では、引数nameには文字列型または文字列のリスト型を指定することができます。

isinstance()関数を使用して、引数の型を判定し、適切な処理を行っています。

また、戻り値に複数の型ヒントを指定する例もあります。

def divide(a: int, b: int) -> Union[int, float]:
    if b != 0:
        return a / b
    else:
        return 0

この例では、引数abは整数型を指定し、戻り値は整数型または浮動小数点型を指定しています。

bが0でない場合は、整数型の結果を返し、0である場合は0を返します。

型ヒントの組み合わせの注意点

型ヒントを組み合わせる際には、いくつかの注意点があります。

まず、Union型ヒントを使用する場合、指定する型の順序に注意が必要です。

例えば、Union[int, str]Union[str, int]は同じ意味ですが、型ヒントの順序が異なるため、コードの可読性や予測性に影響を与える可能性があります。

一貫性を保つために、プロジェクト内で統一された型ヒントの順序を定めることが重要です。

適切な型ヒントの組み合わせを使用することで、より明確なコードを書くことができます。

目次から探す