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)

Оба из них передают ваше намерение довольно ясно.

Другие вопросы по тегам