2016-03-31 11 views
4

python 3(https://www.python.org/dev/peps/pep-3107/)の関数注釈が見つかりました。これは、パラメータや戻り値の型を文書化するのに最適です。また、私のpycharm IDEでより良いインテリセンスを利用できます。Pythonの関数アノテーション

入力タイプが不明なパラメータに関する質問があります。例えば、それはリストまたは数の少ない配列または何らかの「配列のような」量であり得る。そのような入力パラメータに関数に注釈を付ける最も良い方法は何ですか?例:

import numpy as np 

def fun(data: np.ndarray) # can also be a list 
    pass 

入力が2つのタイプのいずれかになる場合があります。例:

def fun(header: Nifti1Header) # can also be Nifti2Header 
    pass 

これらの種類のパラメータ入力を文書化する最良の方法は何ですか?

答えて

5

あなたはpython3.5を使用している場合は、最善の方法は、あなたが一貫して連合を使用している場合は、代わりtyping.TypeVarを使用することができtyping.Unionに

>>> from typing import Union 
>>> import numpy as np 
>>> def fun(data: Union[np.ndarray, list]): 
     pass 

を使用することです[T1、T2、...] 。このコードは、リスト、array.arrays、およびnumpyの配列でアルゴンを関連付けます

>>> from typing import TypeVar 
>>> import numpy as np 
>>> import array 
>>> Ar = TypeVar('Ar', np.ndarray, list, array.array) 

(プラスあなたはあなたのコード内で多くの組合よりも簡単TypeVarからタイプを追加および削除することができます)。

4

あなたの法的入力が共通の財産であることを機能分担しなければなりません。まず一つは、それが反復可能でなければなりませんようになっています。Nifti1HeaderNifti2Headerは、共通の基本クラスから継承しなければならないようなあなたのために、ヘッダー

>>> from collections import Iterable 
>>> def fun(data: Iterable): 
...  pass 
... 
>>> isinstance(np.ndarray(0), Iterable) 
True 
>>> isinstance([], Iterable) 
True 
>>> isinstance(23, Iterable) 
False 

は、それが臭いです。関数が派生クラスに対して機能する必要がある場合、そのクラスに基本クラスを注釈付けしてみませんか?