Тип подсказки для списков и кортежей - PullRequest
2 голосов
/ 25 октября 2019

Есть ли способ определить размер кортежа или списка в подсказках типа аргументов?

На данный момент я использую что-то вроде этого:

from typing import List, Optional, Tuple

def function_name(self, list1: List[Class1]):
    if len(list1) != 4:
        raise SomeError()
    pass
    # some code here

Яв поисках более гибкого способа сделать это.

Ответы [ 3 ]

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

Для списков это не имеет смысла, потому что они динамические, для кортежей, с другой стороны, число типов в определении - это число элементов, которые оно содержит:

from typing import Tuple

example_1: Tuple[int, int] = (1, 2)  # This is valid
example_2: Tuple[int, int] = (1, 2, 3)  # This is invalid
example_3: Tuple[int, ...] = (1, 2, 3, 4)  # This is valid, the ellipses means any number if ints
example_4: Tuple[int, ...] = (1, 'string')  # This is invalid

# So in your case if you need 4 you can do something like this
My4Tuple = Tuple[Class1, Class1, Class1, Class1]
def my_function(self, arg1: My4Tuple):
    pass

Всегда помните, что это неприменяется во время выполнения

0 голосов
/ 25 октября 2019

Почему бы вам просто не взять 4 аргумента? Затем вы можете сделать что-то вроде этого:

def function_name(self, a: Class1, b: Class1, c:Class1, d:Class1):
    ...

data = (Class1(...), Class1(...), Class1(...), Class1(...))
obj.function_name(*data)
0 голосов
/ 25 октября 2019

Один из способов - изменить подпись, чтобы она принимала 4 параметра:

def function_name(self, c1, c2, c3, c4): # Use better parameter names
    pass

Затем вы можете вызвать это с помощью списка, используя оператор splat:

l = [...]
x.function_name(*l)
...