2017-08-30 49 views
2

我想寫使用Python 3.6類型提示來檢查的參數的字典尊重類型提示,如果不提高有清晰的描述錯誤的函數裝飾該問題將用於HTTP API。覈對聯盟類型的變量在運行時在Python 3.6

的問題是,當函數使用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']) 

因爲Union不能isinstanceissubclass使用。

我找不到使用類型對象檢查它的方法。 我嘗試自己實施檢查,但同時bark.__annotations__['descr']在REPL顯示爲typing.Union[int, str]我不能在運行時,如果不使用檢查bark.__annotations__['descr'].__repr__()的醜陋的黑客訪問類型的列表。

有沒有訪問此信息的正確方法?還是故意在運行時不容易訪問?

回答

2

您可以使用__args__屬性的Union持有的一個tuple「可能的內容:

>>> from typing import Union 

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

__args__參數未記錄,因此它可以被認爲是‘有實施細則’搞亂,但它似乎像一個比解析repr更好的方法

+1

Python 3.5使用了'Union [int,str] .__ union_args__'而不是3.6,似乎沒有辦法從任何其他'Generic'解析'Union',因爲'isinstance'失敗: ( –