2016-03-31 20 views
4

Python 3 (https://www.python.org/dev/peps/pep-3107/) parametrelerini veya dönüş türlerini belgelemek için harika görünen işlev ek açıklamalarını keşfettim. Ayrıca eczane IDE'mde daha iyi bir intellisense sunar.işlev ek açıklamaları

Giriş türünün bulanık olduğu parametrelerle ilgili bir sorum var. Örneğin, bir liste veya numpy dizi veya "dizi benzeri" bir miktar olabilir. Bu tür bir giriş parametresini fonksiyona açıklama yapmak için en iyi yol hangisidir? Örneğin: Girişin iki türden biri olabileceği başka bir durum var. Örnek: Bu tür parametre girdilerini belgelemenin en iyi yolu nedir?

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

cevap

5

sen python3.5 kullanıyorsanız, en iyi yolu sürekli Birliği kullanıyorsanız alternatif typing.TypeVar kullanabilirsiniz typing.Union

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

kullanmaktır [t1, t2, ...] . Bu kod, daha sonra listelerin, array.arrays ve numpy dizilerle Ar ilişkilendirecekti

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

(Artı kodunuzda birçok Sendikaları daha kolay TypeVar gelen türlerini ekleyebilir ve silebilirsiniz).

4

Sizin için yasal girdilerin paylaşıldığı hangi ortak özelliği paylaşmanız gerekir. İlki, buna iterable olması gerektiği gibi görünür: Nifti1Header ve Nifti2Header ortak temel sınıfından gerektiği gibi başlıkları için

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

, bu kokuyor. İşlev türetilen herhangi bir sınıf için çalışacaksa, neden temel sınıfla not eklememelisiniz?

İlgili konular