Chcę utworzyć typ, który jest krotem, który zawiera 5 pływaków i int. Mogę to zrobić w następujący sposób, który pracuje ładnie.

from typing import Tuple

MyT = Tuple[float, float, float, float, float, int]
t: MyT = (1.0, 1.0, 1.0, 1.0, 1.0, 5)

Ale jeśli chcę jeszcze więcej pływaków, staje się denerwujące, aby wpisać to samo w kółko. Czy istnieje sposób na stworzenie takiego typu w sposób parametryzowany? Wiem, że przechodząca do krotki do krotki [] i.e.

MyT = Tuple[(float, float, float, float, float, int)]
t: MyT = (1.0, 1.0, 1.0, 1.0, 1.0, 5)

Dlatego próbowałem następujących.

tup = ((float, ) * 5) + (int, )
MyT = Tuple[tup]

t: MyT = (1.0, 1.0, 1.0, 1.0, 1.0, 5)

Ale to nie kończy sprawdzanie Mypy. Myślę, że to dlatego, że krotka przekazana do Tuple [] jest tworzona tylko w czasie wykonywania? Czy jest podobny sposób, który będzie działał? Testowany za pomocą Pythona 3.8.6 i Mypy 0,782.

0
Christian Baumann 2 październik 2020, 19:05

1 odpowiedź

Najlepsza odpowiedź

Nie ma sposobu na zautomatyzowanie procesu tworzenia podpowiedzi typu Tuple lub tworzenie typu krotki, w którym liczba elementów jest parametryzowalna: Musisz napisać wszystkie pięć typów pływaków ręcznie, jak w pierwszym przykładzie.

Zamiast tego zalecam utworzenie klasy zamiast tego:

class MyT:
    def __init__(self, a: List[float], b: int) -> None:
        self.a = a
        self.b = b

Możesz wyrazić tę klasę bardziej kompaktową za pomocą DataClasses Jeśli wolisz:

from dataclasses import dataclass

@dataclass
class MyTVersion2:
    a: List[float]
    b: int

Korzystanie z klasy lub DataClass powinien umożliwiać bezpośrednio wsparcie przechowywanie zmiennej liczby pływaków, jednocześnie ułatwiając strukturę danych łatwiejsze dla innych do zrozumienia.

Jeśli ważne jest, abyś użył specjalnie krotki, myślę, że jedyne opcje, które masz do:

  1. Usiedlenie do ręcznego pisania tworzenia aliasu nowego typu dla każdego rodzaju krotki, której chcesz użyć.
  2. Zadowolić coś takiego jak Tuple[Any, ...]. Robiący Tuple[float, ...] może również działać dla konkretnego przykładu - IIRCR Mypy uważa, że jest podtypem pływaków.
0
Michael0x2a 2 październik 2020, 16:26