Інші відповіді зробили гарну роботу, пояснивши типи качок та просту відповідь tzot :
Python не має змінних, як і інші мови, де змінні мають тип і значення; він має назви, що вказують на об'єкти, які знають їх тип.
Однак одна цікава річ змінилася з 2010 року (коли вперше було задано питання), а саме реалізація PEP 3107 (реалізована в Python 3). Тепер ви можете фактично вказати тип параметра та тип повернення типу функції, як це:
def pick(l: list, index: int) -> int:
return l[index]
Тут ми можемо побачити, що pick
бере 2 параметри, список l
і ціле число index
. Він також повинен повернути ціле число.
Тож тут мається на увазі, що l
це список цілих чисел, який ми можемо бачити без особливих зусиль, але для більш складних функцій це може бути трохи заплутано щодо того, що список повинен містити. Ми також хочемо, щоб значення за замовчуванням index
було 0. Щоб вирішити це, ви можете pick
замість цього написати так:
def pick(l: "list of ints", index: int = 0) -> int:
return l[index]
Зауважте, що тепер ми вводимо рядок як тип l
, який синтаксично дозволений, але це не добре для програмного розбору (про який ми повернемося пізніше).
Важливо зазначити, що Python не зробить a, TypeError
якщо ви перейдете поплавок у index
, причина цього - один з головних моментів філософії дизайну Python: "Всі ми тут погоджуємось із дорослими" , а це означає, що від вас очікують пам'ятайте, що ви можете передати функції, а що не можете. Якщо ви дійсно хочете написати код, який видає TypeErrors, ви можете скористатися isinstance
функцією, щоб перевірити, чи переданий аргумент належного типу або його підклас:
def pick(l: list, index: int = 0) -> int:
if not isinstance(l, list):
raise TypeError
return l[index]
Детальніше про те, чому вам рідко потрібно робити це, а що робити замість цього, розповідається в наступному розділі та в коментарях.
PEP 3107 не тільки покращує читабельність коду, але також має декілька примірних випадків використання, про які ви можете прочитати тут .
Анотація типу отримала набагато більше уваги в Python 3.5 із введенням PEP 484, який представляє стандартний модуль для підказки типу.
Ці підказки походять від перевірки типу mypy ( GitHub ), яка зараз відповідає стандарту PEP 484 .
Модуль набору тексту надає досить вичерпну колекцію підказок типу, включаючи:
List
, Tuple
, Set
, Map
- для list
, tuple
, set
і map
відповідно.
Iterable
- корисно для генераторів.
Any
- коли це може бути що завгодно.
Union
- коли це може бути що-небудь у визначеному наборі типів, на відміну від Any
.
Optional
- коли це може бути Ніхто. Стенограма для Union[T, None]
.
TypeVar
- використовується з дженериками.
Callable
- використовується в основному для функцій, але може використовуватися для інших дзвінків.
Це найпоширеніші підказки типу. Повний перелік можна знайти в документації до модуля набору тексту .
Ось старий приклад використання методів анотацій, введених у модуль набору тексту:
from typing import List
def pick(l: List[int], index: int) -> int:
return l[index]
Однією з потужних особливостей є те, Callable
що дозволяє вводити методи анотації, які приймають функцію як аргумент. Наприклад:
from typing import Callable, Any, Iterable
def imap(f: Callable[[Any], Any], l: Iterable[Any]) -> List[Any]:
"""An immediate version of map, don't pass it any infinite iterables!"""
return list(map(f, l))
Наведений вище приклад міг би стати більш точним із використанням TypeVar
замість цього Any
, але це залишилося як вправу для читача, оскільки я вважаю, що я вже наповнив свою відповідь занадто багато інформації про чудові нові функції, включені підказкою типу.
Раніше, коли один задокументований код Python, наприклад, Sphinx, деякі з перерахованих вище функцій можна було отримати, записавши документи, відформатовані так:
def pick(l, index):
"""
:param l: list of integers
:type l: list
:param index: index at which to pick an integer from *l*
:type index: int
:returns: integer at *index* in *l*
:rtype: int
"""
return l[index]
Як бачите, для цього потрібні ряд зайвих рядків (точне число залежить від того, наскільки явним ви хочете бути та як ви форматуєте свою документацію). Але тепер вам повинно бути зрозуміло, як PEP 3107 надає альтернативу, яка у багатьох (усіх?) Спосіб перевершує. Особливо це стосується комбінації з PEP 484, який, як ми бачили, забезпечує стандартний модуль, який визначає синтаксис для цих типів підказки / примітки, які можна використовувати таким чином, щоб він був однозначним і точним, але при цьому був гнучким, що робить для потужне поєднання.
На мою особисту думку, це одна з найбільших особливостей Python коли-небудь. Я не можу чекати, коли люди почнуть використовувати силу цього. Вибачте за довгу відповідь, але це те, що відбувається, коли я збуджуюся.
Приклад коду Python, який широко використовує натяк на тип, можна знайти тут .