Jedną z najczęściej omawianych funkcji w Pythonie 3.5 są wskazówki dotyczące typów .
Przykładem podpowiedzi typu jest mowa w tym artykule , a ten jeden , a jednocześnie z podaniem użyć podpowiedzi typu odpowiedzialnie. Czy ktoś może wyjaśnić więcej na ich temat oraz kiedy należy ich używać, a kiedy nie?
python
python-3.x
python-3.5
type-hinting
Vaulstein
źródło
źródło
Odpowiedzi:
Proponuję czytanie PEP 483 i PEP 484 i oglądania tej prezentacji Guido typu podpowiedzi.
W skrócie : Podpowiedzi typu są dosłownie tym, co oznaczają słowa, podpowiedzisz, jakiego typu obiektów używasz .
Ze względu na dynamiczny charakter Pythona szczególnie trudne jest wnioskowanie lub sprawdzanie typu używanego obiektu. Fakt ten utrudnia programistom zrozumienie, co dokładnie dzieje się w kodzie, którego nie napisali, a co najważniejsze, w przypadku narzędzi do sprawdzania typów znalezionych w wielu IDE [PyCharm, PyDev przychodzą na myśl], które są ograniczone ze względu na fakt, że nie mają żadnego wskaźnika tego, jakiego typu są obiekty. W rezultacie próbują wywnioskować ten typ z (jak wspomniano w prezentacji) około 50% wskaźnikiem sukcesu.
Aby wziąć dwa ważne slajdy z prezentacji Podpowiedzi typu:
Dlaczego warto pisać wskazówki?
TypeErrors
..
i mając wyskakujące metody / atrybuty, które nie są zdefiniowane dla obiektu.Dlaczego warto korzystać ze statycznych kontrolerów typu?
Na zakończenie tego krótkiego wprowadzenia : Jest to funkcja opcjonalna i, o ile rozumiem, została wprowadzona w celu czerpania korzyści z pisania statycznego.
Na ogół nie musisz się tym martwić i zdecydowanie nie musisz go używać (szczególnie w przypadkach, w których używasz Pythona jako pomocniczego języka skryptowego). Powinien być pomocny przy tworzeniu dużych projektów, ponieważ zapewnia bardzo potrzebną niezawodność, kontrolę i dodatkowe możliwości debugowania .
Wpisz podpowiedź z mypy :
Aby uzupełnić tę odpowiedź, uważam, że odpowiednia byłaby mała demonstracja. Będę korzystać
mypy
z biblioteki, która zainspirowała wskazówki typu, gdy są one przedstawione w PEP. Jest to napisane głównie dla każdego, kto wpadnie na to pytanie i zastanawia się, od czego zacząć.Zanim to zrobię, powtórzę: PEP 484 niczego nie wymusza; po prostu określa kierunek adnotacji funkcji i proponuje wytyczne, w jaki sposób można / należy wykonać sprawdzanie typu. Możesz dodawać adnotacje do swoich funkcji i podpowiadać dowolną liczbę rzeczy; twoje skrypty będą nadal działać bez względu na obecność adnotacji, ponieważ sam Python ich nie używa.
W każdym razie, jak zauważono w PEP, typy podpowiedzi powinny zasadniczo przyjmować trzy formy:
# type: type
uwagi, które uzupełniają dwie pierwsze formy. (Zobacz: Co to są adnotacje zmienne w Pythonie 3.6? Do aktualizacji Pythona 3.6 w celu uzyskania# type: type
komentarzy)Dodatkowo, będziesz chciał użyć wskazówek typu w połączeniu z nowym
typing
modułem wprowadzonym wPy3.5
. W nim zdefiniowano wiele (dodatkowych) ABC (abstrakcyjnych klas podstawowych) wraz z funkcjami pomocniczymi i dekoratorami do użycia w sprawdzaniu statycznym. WiększośćABCs
wcollections.abc
są wliczone, ale wGeneric
formie, w celu umożliwienia subskrypcji (poprzez określenie__getitem__()
metody).Dla każdego zainteresowanego bardziej dogłębnym wyjaśnieniem,
mypy documentation
jest napisany bardzo ładnie i ma wiele próbek kodu demonstrujących / opisujących funkcjonalność swojego kontrolera; zdecydowanie warto to przeczytać.Adnotacje funkcyjne i specjalne komentarze:
Po pierwsze, interesujące jest obserwowanie niektórych zachowań, które możemy uzyskać, używając specjalnych komentarzy.
# type: type
Podczas przypisywania zmiennych można dodawać specjalne komentarze, aby wskazać typ obiektu, jeśli nie można go bezpośrednio wywnioskować. Proste przypisania są na ogół łatwo wywnioskowane, ale inne, takie jak listy (w odniesieniu do ich zawartości), nie mogą.Uwaga: jeśli chcemy użyć dowolnej pochodnej
Containers
i musimy określić zawartość tego kontenera, musimy użyć ogólnych typów ztyping
modułu. Te wspierają indeksowanie.Jeśli dodamy te polecenia do pliku i uruchomimy je za pomocą naszego interpretera, wszystko będzie działać dobrze i
print(a)
po prostu wydrukuje zawartość listya
. Te# type
uwagi zostały odrzucone, traktowany jako zwykły komentarze, które nie mają dodatkowe znaczenie semantyczne .Z
mypy
drugiej strony, uruchamiając to , otrzymujemy następujące odpowiedzi:Wskazując, że lista
str
obiektów nie może zawieraćint
, co statycznie rzecz biorąc, jest dźwiękiem. Można to naprawić, przestrzegając typua
i tylko dodającstr
obiekty lub zmieniając typ zawartości,a
aby wskazać, że dowolna wartość jest akceptowalna (Intuicyjnie wykonywane zList[Any]
poAny
zaimportowaniu ztyping
).Adnotacje do funkcji są dodawane w postaci
param_name : type
po każdym parametrze w sygnaturze funkcji, a typ zwracany jest określany za pomocą-> type
notacji przed dwukropkiem końcowym funkcji; wszystkie adnotacje są przechowywane w__annotations__
atrybucie dla tej funkcji w przydatnej formie słownika. Korzystając z trywialnego przykładu (który nie wymaga dodatkowych typów ztyping
modułu):annotated.__annotations__
Atrybut ma teraz następujące wartości:Jeśli jesteśmy kompletnym noobie lub znamy się na
Py2.7
koncepcjach i w związku z tym nie jesteśmy świadomiTypeError
czającego się w porównaniuannotated
, możemy wykonać kolejną kontrolę statyczną, wykryć błąd i zaoszczędzić nam trochę kłopotów:Przechwytywanie funkcji z niepoprawnymi argumentami również zostanie złapane:
Można je rozszerzyć na praktycznie każdy przypadek użycia, a wykryte błędy wykraczają poza zwykłe wywołania i operacje. Rodzaje, które możesz sprawdzić, są naprawdę elastyczne, a ja jedynie podałem mały potencjał jego możliwości. Spojrzenie w
typing
module, dokumentach PEP lubmypy
dokumentach da Ci pełniejszy obraz oferowanych możliwości.Pliki pośredniczące:
Pliki pośredniczące mogą być używane w dwóch różnych nie wykluczających się wzajemnie przypadkach:
Pliki pośredniczące (z rozszerzeniem
.pyi
) to opisany interfejs modułu, którego tworzysz / chcesz używać. Zawierają podpisy funkcji, które chcesz sprawdzić, z treścią odrzuconych funkcji. Aby to zrozumieć, biorąc pod uwagę zestaw trzech losowych funkcji w module o nazwierandfunc.py
:Możemy utworzyć plik pośredniczący
randfunc.pyi
, w którym możemy wprowadzić pewne ograniczenia, jeśli chcemy to zrobić. Minusem jest to, że ktoś przeglądający źródło bez kodu pośredniczącego nie otrzyma tak naprawdę adnotacji, gdy będzie próbował zrozumieć, co powinno zostać przekazane.W każdym razie struktura pliku pośredniczącego jest dość uproszczona: dodaj wszystkie definicje funkcji z pustymi obiektami (
pass
wypełnionymi) i dostarcz adnotacje na podstawie twoich wymagań. Załóżmy, że chcemy pracować tylko zint
typami dla naszych kontenerów.Ta
combine
funkcja wskazuje, dlaczego możesz chcieć używać adnotacji w innym pliku, czasem zaśmiecają kod i zmniejszają czytelność (duże nie-nie dla Pythona). Możesz oczywiście użyć aliasów typu, ale to kiedyś bardziej myli, niż pomaga (więc używaj ich mądrze).Powinno to zaznajomić Cię z podstawowymi pojęciami typu Wskazówki w Pythonie. Mimo, że używano sprawdzania typów
mypy
, powinieneś stopniowo zacząć widzieć więcej z nich wyskakujących okienek, niektóre wewnętrznie w IDE ( PyCharm ,), a inne jako standardowe moduły python. Spróbuję dodać dodatkowe warcaby / powiązane pakiety z poniższej listy, kiedy je znajdę (lub jeśli będzie to sugerowane).Warcaby, które znam :
Powiązane pakiety / projekty :
typeshed
Projekt jest rzeczywiście jednym z najlepszych miejsc, gdzie można zobaczyć, jak wyglądają na typ podpowiedzi mogą być wykorzystane w projekcie własnych. Weź Chodźmy jako przykład na__init__
dunders zCounter
klasy w odpowiednim.pyi
pliku:Gdzie
_T = TypeVar('_T')
służy do definiowania klas ogólnych . W przypadkuCounter
klasy widzimy, że nie może ona przyjmować żadnych argumentów w swoim inicjalizatorze, uzyskać pojedynczegoMapping
z dowolnego typuint
lub braćIterable
żadnego dowolnego typu.Uwaga : zapomniałem wspomnieć o tym, że
typing
moduł został wprowadzony tymczasowo . Od PEP 411 :Więc weź rzeczy tutaj ze szczyptą soli; Wątpię, czy zostanie to usunięte lub zmienione w znaczący sposób, ale nigdy nie wiadomo.
** Zupełnie inny temat, ale poprawny w zakresie wskazówek dotyczących typów
PEP 526
:: Składnia adnotacji zmiennych to próba zastąpienia# type
komentarzy przez wprowadzenie nowej składni, która pozwala użytkownikom opisywać typy zmiennych w prostychvarname: type
instrukcjach.Zobacz Co to są adnotacje o zmiennych w Pythonie 3.6? , jak wcześniej wspomniano, na krótkie wprowadzenie do nich.
źródło
Dodając do szczegółowej odpowiedzi Jima:
Sprawdź
typing
moduł - ten moduł obsługuje wskazówki typu określone w PEP 484 .Na przykład poniższa funkcja przyjmuje i zwraca wartości typu
str
i jest opisana w następujący sposób:typing
Moduł obsługuje również:źródło
Nowo wydany PyCharm 5 obsługuje podpowiedzi typu. W swoim wpisie na blogu na ten temat (patrz Podpowiedzi typu Python 3.5 w PyCharm 5 ) oferują świetne wyjaśnienie, jakie są podpowiedzi typu i nie są wraz z kilkoma przykładami i ilustracjami, jak używać ich w kodzie.
Dodatkowo jest obsługiwany w Pythonie 2.7, jak wyjaśniono w tym komentarzu :
źródło
Podpowiedź typu to najnowszy dodatek do dynamicznego języka, w którym przez dziesięciolecia ludzie przysięgali konwencje nazewnictwa tak proste jak węgierski (etykieta obiektu z pierwszą literą b = boolowska, c = znak, d = słownik, i = liczba całkowita, l = lista, n = numeryczna , s = ciąg, t = krotka) nie były potrzebne, zbyt kłopotliwe, ale teraz zdecydowaliśmy, że, och, czekaj ... używanie języka (type ()) do rozpoznawania obiektów jest zbyt wielkim problemem, a nasze fantazyjne IDE potrzebują pomocy w robieniu wszystkiego, co skomplikowane, a dynamicznie przypisywane wartości obiektów czynią je całkowicie bezużytecznymi, podczas gdy prosta konwencja nazewnictwa mogłaby rozwiązać wszystko dla każdego programisty na pierwszy rzut oka.
źródło
Podpowiedzi typów służą do konserwacji i nie są interpretowane przez Python. W poniższym kodzie wiersz
def add(self, ic:int)
nie powoduje błędu aż do następnegoreturn...
wiersza:źródło