2017-08-30 20 views
2

Python 3.6型ヒントを使用して、引数の辞書が型ヒントを尊重しているかどうかを確認する関数デコレータを作成しようとしています。 HTTP APIに使用される問題の数です。実行時にPython 3.6で実行時にUnion型の変数をチェックする

問題は、関数がUnion型を使用するパラメータを持っている場合、実行時に変数をチェックできないという問題です。例えば

、私は私が行うことができます

from typing import Union 
def bark(myname: str, descr: Union[int, str], mynum: int = 3) -> str: 
    return descr + myname * mynum 

この機能を持っている:

isinstance('Arnold', bark.__annotations__['myname']) 

でもない:

isinstance(3, bark.__annotations__['descr']) 

Unionisinstanceまたはissubclassで使用することはできませんので。

タイプオブジェクトを使用して確認する方法が見つかりませんでした。 自分でチェックを実装しようとしましたが、bark.__annotations__['descr']がREPLにtyping.Union[int, str]と表示されていますが、実行時にタイプのリストにアクセスできない場合は、bark.__annotations__['descr'].__repr__()という醜いハッキングを使用しないといけません。

この情報にアクセスする適切な方法はありますか?または、意図的に実行時に簡単にアクセスできないように意図されていますか?

答えて

2

あなたはのtuple保持Union__args__属性使用することができ、「可能な内容を:

それは考えることができるよう __args__引数が文書化されていない
>>> from typing import Union 

>>> x = Union[int, str] 
>>> x.__args__ 
(int, str) 
>>> isinstance(3, x.__args__) 
True 
>>> isinstance('a', x.__args__) 
True 

『』実装の詳細をいじりが、それはのように思えますを解析するよりも良い方法です。

+1

Python 3.5では 'Union [int、str] .__ union_args__'を使用しましたが、3.6では' isinstance'が失敗するため、他の 'Generic'から' Union'を解決できません。 ( –

関連する問題