Тип подсказки и цепочечные назначения и несколько назначений в Python - PullRequest
2 голосов
/ 15 июня 2019

Полагаю, эти два вопроса связаны между собой, поэтому я опубликую их вместе:

1.- Можно ли поместить подсказку типа в цепочечные назначения?

Эти две попытки потерпели неудачу:

>>> def foo(a:int):
...     b: int = c:int = a
  File "<stdin>", line 2
    b: int = c:int = a
              ^
SyntaxError: invalid syntax
>>> def foo(a:int):
...     b = c:int = a
  File "<stdin>", line 2
    b = c:int = a
         ^
SyntaxError: invalid syntax

2.- Можно ли указывать тип подсказки в нескольких назначениях?

Это были мои попытки:

>>> from typing import Tuple
>>> def bar(a: Tuple[int]):
...     b: int, c:int = a
  File "<stdin>", line 2
    b: int, c:int = a
          ^
SyntaxError: invalid syntax
>>> def bar(a: Tuple[int]):
...     b, c:Tuple[int] = a
... 
  File "<stdin>", line 2
SyntaxError: only single target (not tuple) can be annotated
>>> def bar(a: Tuple[int]):
...     b, c:int = a
... 
  File "<stdin>", line 2
SyntaxError: only single target (not tuple) can be annotated

Мне известно, что в обоих случаях тип выводится из подсказки типа a, но у меня есть длинный список переменных (в __init__ класса), и я хочу быть экстра-явным.

Я использую Python 3.6.8.

1 Ответ

3 голосов
/ 15 июня 2019
  1. Как прямо указано в PEP 526 , раздел «Отклоненные / отложенные предложения», аннотации в цепочечных назначениях не поддерживаются.Цитируя PEP:

    Это имеет проблемы неоднозначности и читабельности, аналогичные распаковке кортежей, например:
    x: int = y = 1
    z = w: int = 1
    это неоднозначно, что следуеттипы у и г быть?Кроме того, вторую строку трудно проанализировать.

  2. Для распаковки, в соответствии с тем же PEP, вы должны разместить пустые аннотации для ваших переменных перед присваиванием.Пример из PEP:

    # Tuple unpacking with variable annotation syntax
    header: str
    kind: int
    body: Optional[List[str]]
    header, kind, body = message
    
...