2016-04-19 13 views
1

私は実際には関数の注釈が好きです。なぜなら、それらは自分のコードをもっとはっきりさせるからです。 しかし、私は質問があります:別の関数を引数として取る関数にどのように注釈をつけますか?または1つを返しますか?関数の注釈

def x(f: 'function') -> 'function': 
    def wrapper(*args, **kwargs): 
     print("{}({}) has been called".format(f.__name__, ", ".join([repr(i) for i in args] + ["{}={}".format(key, value) for key, value in kwargs]))) 
     return f(*args, **kwargs) 
    return wrapper 

そして私は、注釈でそれを使用するFunction = type(lambda: None)を行うにはしたくありません。

+0

Python 3.5を使用していますか? –

+0

はい、あります。私は新しい "非同期def"構文が好きです。 (コメント内の最小文字数は?本当ですか?) – CodenameLambda

答えて

3

Python 3.5に新しいtyping type hinting supportが追加されました。

from typing import Callable, Any 

def x(f: Callable[..., Any]) -> Callable[..., Any]: 
    def wrapper(*args, **kwargs): 
     print("{}({}) has been called".format(f.__name__, ", ".join([repr(i) for i in args] + ["{}={}".format(key, value) for key, value in kwargs]))) 
     return f(*args, **kwargs) 
    return wrapper 

あなたxは、任意の引数を受け付け呼び出し可能オブジェクトを受け取り、それの戻り値の型がある上記の指定:機能が呼び出し可能あり、あなたが呼び出すことができる何かをしたい、関数の型を必要としませんAny、例えばそれは一般的な呼び出し可能なオブジェクトです。 xは、同様に一般的なものを返します。

これはx(f: Callable) -> Callable:でも表現できます。プレーンCallableCallable[..., Any]に相当します。あなたが選んだのはスタイルの選択です。ここで私の個人的な好みとして明示的なオプションを使用しました。

+2

これは 'Callable'で注釈を付けるよりも何が良いでしょうか? – timgeb

+0

ありがとう!私は最後の型が返されると仮定します? – CodenameLambda

+1

@ CodeLambdas:そうです。 –