Правильный способ ввода аргумента, который может быть последовательностью или массивом - PullRequest
0 голосов
/ 24 октября 2019

Я хочу реализовать метод, выполняющий некоторые вычисления расстояния в трехмерном пространстве, в зависимости от аргумента position, состоящего из 3 целочисленных значений для координат x, y и z соответственно.

Теперь это будетхорошо, если метод принял этот аргумент position как

  • Sequence из len=3 и как
  • np.array из shape=(3,).

Мне было интересно, что считается наилучшей практикой документирования такого гибкого типа аргумента. Используя сравнительно новый модуль ввода Python, я пришел к следующему:

import numpy as np
from typing import Union, Sequence

def get_distances(self, 
                  position: Union[Sequence[int, int, int], np.ndarray((3,), dtype=int)]):
    ...
    return distances

Это как это сделать? Или это слишком, и такие вещи лучше документировать с помощью документации или избегать всего вместе?

1 Ответ

1 голос
/ 24 октября 2019

Для вашей аннотации типа вы создаете экземпляр массива numpy (который вызовет исключение, если вы его запустите). Кроме того, Sequence принимает только один аргумент, тип, который он содержит.

Возникнет ошибка Sequence:

TypeError: Too many parameters for typing.Sequence; actual 3, expected 1

, а ошибка np.ndarray((3,)...):

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Вам нужно просто указать идентификатор типа иукажите int только один раз:

import numpy as np
from typing import Union, Sequence

def get_distances(self, 
                  position: Union[Sequence[int], np.ndarray]):
    ...
    return distances

На странице typing содержится много полезной информации о том, как использовать аннотации.

...