2016-06-15 8 views
18

現在の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をチェックしますが、そこに関数型のヒントを見つけることができませんでした。

+8

関数である[ 'Callable'](https://www.python.org/dev/peps/pep-0483/#fundamental-ビルディングブロック) – jonrsharpe

+1

https://www.python.org/dev/peps/pep-0483/#fundamental-building-blocks、「追加するかもしれない」前の最後の箇条書きポイント。 – Evert

+1

ああ、素晴らしい:)ありがとう! 短い投稿を書いてください - 私は答えを確認するつもりです。 – Jon

答えて

18

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

from typing import AnyStr, Callable 

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

問題は、それ自身の上Callableを意味しているCallable[..., Any]に翻訳されている:

呼び出し可能ではの任意の数をとります/引数の型を返し、任意の型の値を返します。ほとんどの場合、これはあなたが望むものではありません。なぜなら、ほとんどすべての関数を渡すことができるからです。関数のパラメータと戻り値の型もヒントにする必要があります。

だからこそ、typingの多くのtypesがこれらの余分なタイプを示すサブスクリプトをサポートするためにオーバーロードされています。

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

それのためのあなたの注釈は、次のようになります:

ある
Callable[[int, int], int] 

、パラメータはサブですので、もし、例えば、あなたは秒を取り、返す関数sumを持っていました戻り値の型を外部サブスクリプションの2番目の要素として使用して、外部サブスクリプションでスクリプト化します。一般的には:

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

注意すべきもう一つの興味深い点は、あなたが機能に建てられたの種類を取得し、それを使用するために機能type()に建て使用できるということです。 ですから、

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

か、そのフォームの何かを持っている可能性が

関連する問題