аннотации функций в python

Я только что открыл аннотации функций для python 3 ( https://www.python.org/dev/peps/pep-3107/ ), которые выглядят великолепно для документирования параметров или возвращаемых типов. Это также улучшает intellisense, доступный в моей среде разработки pycharm.

У меня вопрос о параметрах, где тип ввода нечеткий. Например, это может быть массив списка или numpy или некоторое количество «массив». Каков наилучший способ аннотировать такой входной параметр функции? Пример:

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

У меня есть другой случай, когда вход может быть любым из двух типов. Пример:

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

Каков наилучший способ документирования этих входных параметров?

Если вы используете python3.5, лучший способ – использовать typing.Union

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

Вы также можете использовать typing.TypeVar, если вы последовательно используете Union [t1, t2, …]. (Кроме того, вы можете добавлять и удалять типы из TypeVar более легко, чем многие Unions в вашем коде)

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

Этот код затем связывает Ar со списками, массивами array.arrays и numpy.

Вам нужно будет решить, какое общее свойство имеют правовые входы для вас. Для первого, похоже, он должен быть итерируемым:

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

Для ваших заголовков пахнет как Nifti1Header а Nifti2Header должен наследовать от общего базового класса. Если функция должна работать для любого производного класса, почему бы не аннотировать ее базовым классом?