1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python `typing.Callable`を使って関数の型を定義する

Posted at

はじめに

Pythonは動的型付け言語ですが、型ヒントを使用することで、コードの可読性を向上させ、潜在的なバグを早期に発見することができます。特に関数を扱う際、typing.Callableを使用して関数の型を定義することは非常に有用です。この記事では、typing.Callableの基本的な使い方から、より複雑なケースまでを解説します。

typing.Callableとは

typing.Callableは、関数の型を表現するためのジェネリック型です。これを使用することで、関数の引数の型と戻り値の型を指定できます。

image.png

基本的な使い方

最も単純な形式は以下のとおりです:

from typing import Callable

def apply_function(func: Callable[[int], int], value: int) -> int:
    return func(value)

def double(x: int) -> int:
    return x * 2

result = apply_function(double, 5)
print(result)  # 出力: 10

出力:

10

この例では、Callable[[int], int]は「整数を1つ受け取り、整数を返す関数」を表しています。

複数の引数を持つ関数

複数の引数を持つ関数の型も簡単に定義できます:

from typing import Callable

def operate(func: Callable[[int, int], int], a: int, b: int) -> int:
    return func(a, b)

def add(x: int, y: int) -> int:
    return x + y

result = operate(add, 3, 4)
print(result)  # 出力: 7

出力:

7

ここでは、Callable[[int, int], int]が「2つの整数を受け取り、整数を返す関数」を表しています。

任意の数の引数を持つ関数

*args**kwargsを使用する関数の型も定義できます:

from typing import Callable, Any

def execute(func: Callable[..., int], *args: Any) -> int:
    return func(*args)

def sum_all(*numbers: int) -> int:
    return sum(numbers)

result = execute(sum_all, 1, 2, 3, 4, 5)
print(result)  # 出力: 15

出力:

15

Callable[..., int]は「任意の引数を受け取り、整数を返す関数」を表します。

ジェネリック型との組み合わせ

TypeVarを使用して、より柔軟な型定義も可能です:

from typing import Callable, TypeVar, List

T = TypeVar('T')

def map_list(func: Callable[[T], T], items: List[T]) -> List[T]:
    return [func(item) for item in items]

def square(x: int) -> int:
    return x ** 2

numbers = [1, 2, 3, 4, 5]
result = map_list(square, numbers)
print(result)  # 出力: [1, 4, 9, 16, 25]

出力:

[1, 4, 9, 16, 25]

この例では、Callable[[T], T]が「任意の型Tを受け取り、同じ型Tを返す関数」を表しています。

まとめ

image.png

typing.Callableを使用することで、関数の型を明確に定義し、コードの品質と可読性を向上させることができます。これは特に大規模なプロジェクトや、複数の開発者が関わるプロジェクトで非常に有用です。

Pythonの型ヒントは、コードの実行時には無視されますが、静的型チェッカー(例:mypy)を使用することで、潜在的なバグを早期に発見することができます。

typing.Callableを適切に使用することで、より堅牢で保守性の高いPythonコードを書くことができるでしょう。

公式ドキュメント参照

より詳細な情報や高度な使用方法については、Pythonの公式ドキュメントを参照することをお勧めします:

これらの公式ドキュメントでは、typingモジュールの詳細な使用方法や、型ヒントシステムの背景にある設計思想について説明されています。特に、Callableに関する高度な使用方法や、他の型ヒント機能との組み合わせ方などについて、より深く理解することができます。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?