Python: Type Annotations, как определить элементы кортежа?
Вот минимальный случай.
def foo(x:int, y:int) -> tuple:
return (x*y, y//2)
Очень заманчиво иметь возможность писать -> tuple(:int, :int)
который не является допустимым форматом. Есть ли правильный подход в этом случае, или это все еще серая область, пока питон не двинется дальше по дороге аннотации типа?
редактировать: по-видимому, можно сделать что-то подобное
def bar(x, y) -> ((str, int), (str, int)):
return ("%s+%s" %(x,y), x+y), ("%s-%s" %(x,y), x-y)
3 ответа
Теперь есть способ аннотировать этот случай:
from typing import Tuple
def foo(x:int, y:int) -> Tuple[int, int]:
return (x*y, y//2)
Примечание: Python во время выполнения не будет жаловаться -> (int, int)
, но это не правильная аннотация типа в соответствии с PEP 484. Другими словами, вы можете использовать ее, если хотите создать свой мини-язык, используя подсказки типов для своих собственных целей; но это не принято стандартом типирования Python (PEP 484).
теперь устарел, начиная с Python 3.9. Вам следует использовать встроенныйtuple
вместо этого введите (импорт не требуется):
def foo(x:int, y:int) -> tuple[int, int]:
return (x*y, y//2)
Документы для
typing.Tuple
состояние:
Устарело с версии 3.9:
builtins.tuple
теперь поддерживает подписку ([]
). См. PEP 585 и общий тип псевдонима .
Нет, пока нет канонического способа сделать это. Аннотации типа Python являются относительно новым дополнением к языку, поэтому они все еще несколько ограничены.
Сейчас вы можете использовать кортеж литерала:
def foo(x:int, y:int) -> (int, int):
return (x*y, y//2)
Это или строковый литерал, такой как:
def foo(x:int, y:int) -> 'tuple(int, int)':
return (x*y, y//2)
Оба из них передают ваше намерение довольно ясно.