308

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

4

4 に答える 4

438

@jonrsharpeがコメントで指摘したように、これは次の方法で実行できますtyping.Callable

from typing import AnyStr, Callable

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

問題は、Callableそれ自体が次のように翻訳さCallable[..., Any]れることです。

callable は任意の数/型の引数を取り、任意の型の値を返します。ほとんどの場合、ほとんどすべての関数を渡すことができるため、これは望ましくありません。関数のパラメーターと戻り値の型もヒントにする必要があります。

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

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

注釈は次のようになります。

Callable[[int, int], int]

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

Callable[[ParamType1, ParamType2, .., ParamTypeN], ReturnType]
于 2016-09-21T18:36:57.760 に答える
17

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

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

またはその形の何か

于 2017-10-07T22:24:51.697 に答える
2

最も簡単で派手な解決策は次のとおりです。

def f(my_function: type(lambda x: None)):
    return my_function()

これは、次の方法で証明できます。

def poww(num1, num2):
    return num1**num2
    
print(type(lambda x: None) == type(poww))

出力は次のようになります。 True

于 2021-03-29T20:43:45.907 に答える