2017-02-08 13 views
3

私はのdecltypeのアナログをC++で探しています。私が達成しようとしているのは、次のとおりです。別の関数の戻り値型を使用してPython関数に注釈を付けるにはどうすればよいですか?

def f(a: int) -> List[Tuple(int, float)] 
def g(a: List[int]) -> List[decltype(f)] 

したがって、別の機能のタイプ注釈を使用することです。私が見つけた ソリューションは、何らかの形で不器用になります

def g(a: List[int])->f.__annotations__['return'] 

基本的に、質問は(おそらくそれは「return_type」と呼ばれるべきである)decltypeのようなものが存在するかどうかであるか、それがさらにバージョンで計画されていますか。我々はまた、get_type_hints代わりの注釈

+0

次のような意味です: 'def decltype(function):return function .__ annotations __ ['return']'? :) – cowbert

+0

@cowbertはい、私はちょうど同様の例を追加しました:)実際には、私はこの種のもののための機能がないことを混乱しています、そして、私はこの態度に何かが間違っているのだろうかと思います。 –

答えて

5

何も使用することができますジムFasarakis-ヒリアードによって示唆された

def return_type(f: Callable): 
    try: 
     return get_type_hints(f)['return'] 
    except(KeyError, AttributeError): 
     return Any 
def g() -> return_type(f): 

UPDとして:私はまた、この機能の使用可能性を示して小さな機能を書かれていますそのような現在が存在し、the tracker for typingに問題があると思われるように計画されています。問題を作成し、これがどのように歓迎されているかを常に歓迎します。

現在、あなたのアプローチは(つまりタイプを割り当てます)トリックをし、私が紹介したいだけの変更ではなく、直接__annotations__属性をつかむよりもtypingからget_type_hintsを使用することです。 (それは辞書を返すので).getと相まって、あまりにも、これを短くすることができます:もちろん機能から削除され、あなたがその気なら、単一のラインで使用することができます

def return_type(f): 
    return get_type_hints(f).get('return', Any) 

def g() -> return_type(f): 

。これはあなたができる動的タイプが割り当てられますので、」もちろん

def return_type(f): 
    try: 
     return get_type_hints(f).get('return', Any) 
    except TypeError: 
     return Any 

:ランダムなオブジェクトの可能性がreturn_type終了に供給されている場合は

、あなたはそれが提起TypeErrorをキャッチし、あなたのデフォルトAnyを返却する必要があります静的な型チェッカーがそれを捕まえることを期待しているなら、そのための静的なヒントが必要です。

+0

'typing'は3.5の時点でのみ存在します。 – cowbert

+0

get_type_hintsに言及してくれてありがとうございます!私はこれを質問テキスト –

+0

@ ig-melnykに追加します。 'get_type_hints'では、本当にそれがワンライナーになります:-) –

関連する問題