Wpisz podpowiedź do listy określonego typu


128

Korzystając z adnotacji funkcji Python 3, można określić typ elementów zawartych w jednorodnej liście (lub innej kolekcji) w celu podpowiedzi typu w PyCharm i innych IDE?

Przykład kodu w pseudo-Pythonie dla listy int:

def my_func(l:list<int>):
    pass

Wiem, że jest to możliwe przy użyciu Docstring ...

def my_func(l):
    """
    :type l: list[int]
    """
    pass

... ale wolę styl adnotacji, jeśli to możliwe.


Czy próbowałeś użyć tego samego formatu w adnotacjach funkcji? Co się stało?
jonrsharpe

@jonrsharpe Powinno to spowodować błąd, ponieważ type object is not subscriptablepodczas definiowania funkcji. Oczywiście możesz użyć ciągu znaków: def my_func(L: 'list[int]')ale nie wiem, czy PyCharm przeanalizuje go podczas analizowania dokumentów ...
Bakuriu

@Bakuriu tak, miałem na myśli 'list[int]'przeprosiny, jeśli to nie było jasne.
jonrsharpe

Nie wydaje się, aby PyCharm przeanalizował to tak, jak robi to dokumenty.
Eric W.

Odpowiedzi:


161

Odpowiadając na moje własne pytanie; odpowiedź TLDR brzmi: nie, tak .

Zaktualizuj 2

We wrześniu 2015 r. Wydano język Python 3.5 z obsługą podpowiedzi typu i zawiera nowy moduł do pisania . Pozwala to na określenie typów zawartych w kolekcjach. Od listopada 2015 r. JetBrains PyCharm 5.0 w pełni obsługuje język Python 3.5, uwzględniając wskazówki dotyczące typów, jak pokazano poniżej.

Uzupełnianie kodu PyCharm 5.0 za pomocą wskazówek dotyczących typów

Zaktualizuj 1

Od maja 2015 r. PEP0484 (Wskazówki dotyczące typu) został formalnie zaakceptowany. Projekt implementacji jest również dostępny na github w ambv / typehinting .

Oryginalna odpowiedź

Od sierpnia 2014 r. Potwierdziłem, że nie można używać adnotacji typu Python 3 do określania typów w kolekcjach (np. Lista ciągów).

Użycie sformatowanych ciągów dokumentów, takich jak reStructuredText lub Sphinx, jest realną alternatywą i jest obsługiwane przez różne środowiska IDE.

Wydaje się również, że Guido rozważa możliwość rozszerzenia adnotacji typu w duchu mypy: http://mail.python.org/pipermail/python-ideas/2014-August/028618.html


Aktualizacja: Wygląda na to, że podpowiedź dotycząca typów obejmująca obsługę typów ogólnych dotarła do PEP484 python.org/dev/peps/pep-0484
Eric W.

74

Teraz, gdy Python 3.5 jest oficjalnie dostępny, istnieje moduł wspierający Wskazówki dotyczące typów - typingi odpowiedni List„typ” dla kontenerów ogólnych.

Innymi słowy, teraz możesz:

from typing import List

def my_func(l: List[int]):
    pass

10

Komentarze typu zostały dodane od PEP 484

from . import Monitor
from typing import List, Set, Tuple, Dict


active_monitors = [] # type: List[Monitor]
# or
active_monitors: List[Monitor] = []

# bonus
active_monitors: Set[Monitor] = set()
monitor_pair: Tuple[Monitor, Monitor] = (Monitor(), Monitor())
monitor_dict: Dict[str, Monitor] = {'codename': Monitor()}

# nested
monitor_pair_list: List[Dict[str, Monitor]] = [{'codename': Monitor()}]

Obecnie pracuję dla mnie nad PyCharm z Pythonem 3.6.4

Przykładowe zdjęcie w Pycharm


4

Dzięki wsparciu z BDFL, jest prawie pewne, że Python (prawdopodobnie 3.5) zapewni standardową składnię dla wskazówek dotyczących typów poprzez adnotacje funkcji.

https://www.python.org/dev/peps/pep-0484/

Jak wspomniano w PEP, istnieje eksperymentalna funkcja sprawdzania typów (coś w rodzaju pylint, ale dla typów) o nazwie mypy, która już korzysta z tego standardu i nie wymaga nowej składni.

http://mypy-lang.org/


3

Począwszy od Pythona 3.9, typy wbudowane są ogólne w odniesieniu do adnotacji typu (patrz PEP 585 ). Pozwala to bezpośrednio określić rodzaj elementów:

def my_func(l: list[int]):
    pass

Różne narzędzia mogą obsługiwać tę składnię wcześniej niż Python 3.9. Gdy adnotacje nie są sprawdzane w czasie wykonywania, składnia jest poprawna przy użyciu cytowania lub __future__.annotations.

# quoted
def my_func(l: 'list[int]'):
    pass
# postponed evaluation of annotation
from __future__ import annotations

def my_func(l: list[int]):
    pass
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.