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


135

現在の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 483を確認しましたが、関数タイプのヒントが見つかりませんでした。


20
関数はCallable
次のとおり

3
python.org/dev/peps/pep-0483/#fundamental-building-blocks、「追加する可能性がある」前の最後の箇条書き。

回答:


171

以下のよう@jonrsharpeはコメントで述べたように、これはで行うことができますtyping.Callable

from typing import AnyStr, Callable

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

問題は、Callableそれ自体で翻訳さCallable[..., Any]れます:

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

そのため、これらの追加の型を示すサブスクリプトをサポートするために、多くがオーバーロードさtypestypingています。したがって、たとえば、sum2つintのs を取り、int:を返す関数があるとします。

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

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

Callable[[int, int], int]

つまり、パラメーターは、外部サブスクリプションの2番目の要素として戻り値の型を持つ外部サブスクリプションで添え字付きです。一般に:

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

25
これtypingにより、Python言語全体が1段上がります。
javadba

1
@javadba -ああ、はい、私はところで...その文字盤にはわからないんだけど、まだ-について何Callable[[Arg, Types, Here], ...]のために*args**kwargsキーワードのみの引数と位置のみ引数?呼び出し可能オブジェクトの型シグネチャの呼び出し規約について考えていませんか?;)
Tomasz Gandor

10

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

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

またはその形の何か


型ヒントは何でもかまいませんが、常に遅延評価されているわけではありません。また、あなたの関数は本当にbuiltin_function_or_methodとしてのみかかりmy_functionますか?lambda仕事になりませんか?ユーザー定義関数またはバインドされたメソッド?
Tomasz Gandor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.