Тип подсказки для нескольких параметров одного типа? - PullRequest
3 голосов
/ 10 января 2020

Есть ли другой способ ввода параметров подсказок того же типа, кроме:

def foobar(a: int, b: int, c: int, d: str): ...

Может быть что-то вроде:

def foobar([a, b, c]: int, d: str): ...

Очевидно, что это условно, но что-то, чтобы уменьшить повторяющиеся подсказки типа

Ответы [ 2 ]

5 голосов
/ 10 января 2020

Единственные известные мне способы, которые включают каким-то образом "упаковку" параметров.

Из-за того, как работают var-args, вы можете немного изменить свой порядок и принять аргументы как var-args:

def foobar(d: str, *args: int): …

args теперь содержит a, b и c (вместе со всем, что еще пропущено).

Вдоль тех же строк вы можете передать в list:

from typing import List

def foobar(args: List[int], d: str): …

По сути, это то же самое, что и выше.

Конечно, они оба имеют недостаток Серьезный , который вы больше не имеете возможности stati c - проверить арность; что, возможно, еще хуже проблемы, чем неспособность проверить тип c.

Вы можете мягко обойти это, используя кортеж, чтобы обеспечить длину:

from typing import Tuple

def foobar(args: Tuple[int, int, int], d: str): …

Но, конечно, в нем столько же повторений, сколько в исходном коде (и требуется упаковка аргументов в кортеж), поэтому выигрыша на самом деле нет.

Я не знаю ни одного «безопасного» способа сделать буквально что хочешь.

0 голосов
/ 10 января 2020

Я думаю, что @Carcigenicate охватил топи c довольно хорошо, но, поскольку ваша задача в основном нотационная и вы хотите, чтобы она выглядела аккуратно, вы можете вместо этого использовать висячий отступ :

def foobar(a: int,
           b: int,
           c: int,
           d: str):
    pass
...