Jak używać wskazówek dotyczących typów w celu dodania adnotacji do funkcji, która zwraca an, Iterable
która zawsze zwraca dwie wartości: a bool
i a str
? Wskazówka Tuple[bool, str]
jest bliska, z tą różnicą, że ogranicza typ wartości zwracanej do krotki, a nie do generatora lub innego typu iterowalnego.
Jestem głównie ciekawy, ponieważ chciałbym dodać adnotację do funkcji, foo()
która jest używana do zwracania wielu wartości, takich jak ta:
always_a_bool, always_a_str = foo()
Zwykle funkcje takie jak foo()
wykonaj coś podobnego return a, b
(co zwraca krotkę), ale chciałbym, aby wskazówka dotycząca typu była wystarczająco elastyczna, aby zastąpić zwróconą krotkę generatorem lub listą lub czymś innym.
python
python-3.x
python-3.5
type-hinting
Richard Hansen
źródło
źródło
Odpowiedzi:
Zawsze zwracasz jeden obiekt; używanie
return one, two
po prostu zwraca krotkę.Więc tak,
-> Tuple[bool, str]
jest całkowicie poprawne.Tylko
Tuple
typ pozwala określić stałą liczbę elementów, z których każdy odrębny typ. Naprawdę powinieneś zawsze zwracać krotkę, jeśli twoja funkcja generuje stałą liczbę zwracanych wartości, zwłaszcza gdy te wartości są specyficznymi, odrębnymi typami.Oczekuje się, że inne typy sekwencji będą miały jedną specyfikację typu dla zmiennej liczby elementów, więc
typing.Sequence
nie jest tutaj odpowiedni. Zobacz też Jaka jest różnica między listami a krotkami?System podpowiedzi typu Pythona jest zgodny z tą filozofią, obecnie nie ma składni, która określałaby iterowalność o stałej długości i zawierającą określone typy w określonych pozycjach.
Jeśli musisz określić, że jakikolwiek iterowalny będzie wystarczający, najlepsze, co możesz zrobić, to:
-> Iterable[Union[bool, str]]
w którym momencie wywołujący może oczekiwać wartości logicznych i łańcuchów w dowolnej kolejności i o nieznanej długości (od 0 do nieskończoności).
źródło
foo()
mógłyield True; yield "blah"
ia, b = foo()
nadal działał. Albofoo()
może zwrócić listę. Przeformułowałem moje pytanie, aby było jasne, że interesuje mnie wskazanie arbitralnej iteracji, a nie krotki.typing
orazmypy
kolejne 2 razy od wysłania; Jestem przekonany, że niczego nie przegapiłem. To powiedziawszy, jest tu kilku stałych bywalców SO z dużą ilością podpowiedzi typu Python, którzy nie zawahają się mnie poprawić, jeśli okażą się błędni, lub opublikują lepszą odpowiedź.from typing import Tuple
aby adnotacja krotka działała.Iterable
iUnion
. Ponieważ omawiamy tutaj ich konkretne zastosowanie, import jest implikowany.