web-dev-qa-db-ja.com

型ヒントで関数型を指定するにはどうすればよいですか?

現在のPython 3.5プロジェクトでタイプヒントを使用したい。私の関数は、関数をパラメーターとして受け取る必要があります。

型ヒントで型関数を指定するにはどうすればよいですか?

import typing

def my_function(name:typing.AnyStr, func: typing.Function) -> None:
    # However, typing.Function does not exist.
    # How can I specify the type function for the parameter `func`?

    # do some processing
    pass

PEP 48 をチェックしましたが、関数タイプのヒントが見つかりませんでした。

73
Jon

@ jonrsharpe がコメントに記載されているように、これは typing.Callable で実行できます。

from typing import AnyStr, Callable

def my_function(name: AnyStr, func: Callable) -> None:

問題は、それ自体がCallableCallable[..., Any]に変換されることです。

呼び出し可能オブジェクトは、任意の数/タイプの引数を取り、任意のタイプの値を返します。ほとんどの場合、ほとんどすべての関数を渡すことができるため、これは望みのものではありません。関数のパラメーターと戻り値の型もヒントにする必要があります。

typesの多くのtypingがオーバーロードされて、これらの追加の型を示すサブスクリプトをサポートする理由です。したがって、たとえば、2つのsumsを取り、intを返す関数intがある場合:

def sum(a: int, b: int) -> int: return a+b

あなたの注釈は次のようになります:

Callable[[int, int], int]

つまり、パラメーターは外部サブスクリプションのサブスクリプトであり、戻りサブスクリプションは外部サブスクリプションの2番目の要素になります。一般に:

Callable[[ParamType1, ParamType2, .., ParamTypeN], ReturnType]

もう1つの興味深い点は、組み込み関数type()を使用して、組み込み関数の型を取得し、それを使用できることです。だからあなたは持つことができる

def f(my_function: type(abs)) -> int:
    return my_function(100)

またはそのフォームの何か

3
Hallsville3