Тип пакета для Python 3 в Google Cloud возвращает ошибку - PullRequest
0 голосов
/ 04 ноября 2018

Для фрагмента кода я использую пакет typing из стандартной библиотеки pythons. Моя локальная машина работает на Python 3.7 и работает без ошибок; однако, когда я пытаюсь запустить его на экземпляре виртуальной машины Google Cloud, который работает на Python 3.5.3, он выдает неверную синтаксическую ошибку. Я посмотрел вокруг и сказал, что он использует подсказки типа Python2.7, но приведенные примеры были в основном направлены на функции, а не на классы. вот код, который у меня есть:

class TrainConfig(typing.NamedTuple):
    T: int
    train_size: int
    batch_size: int
    loss_func: typing.Callable


class TrainData(typing.NamedTuple):
    feats: np.ndarray
    targs: np.ndarray

Здесь приведена ошибка:

T: int
 ^
SyntaxError: invalid syntax

1 Ответ

0 голосов
/ 07 ноября 2018

Они называются «аннотациями атрибутов класса», и нет прямого перевода в комментарии типа, так как вам нужно указать начальное значение:

class TrainConfig(typing.NamedTuple):
    T = ... # type: int
    train_size = ... # type: int
    batch_size = ... # type: int
    loss_func = ... # type: typing.Callable


class TrainData(typing.NamedTuple):
    feats = ... # type: np.ndarray
    targs = ... # type: np.ndarray

Однако допустимо установить начальное значение на None. От https://www.python.org/dev/peps/pep-0484/#type-comments:

В заглушках может быть полезно объявить о существовании переменной без указания ее начального значения. Это можно сделать, используя PEP 526 синтаксис переменной аннотации:

from typing import IO
stream: IO[str]

Приведенный выше синтаксис допустим в заглушках для всех версий Python. Тем не менее, в незавершенном коде для версий Python 3.5 и более ранних версий существует особый случай:

from typing import IO
stream = None # type: IO[str]

Проверщики типов не должны жаловаться на это (несмотря на то, что значение None не соответствует данному типу), и при этом они не должны изменять выводимый тип на Optional[...] (несмотря на правило, которое делает это для аннотированных аргументов со значением по умолчанию: None). Здесь предполагается, что другой код будет гарантировать, что переменной присвоено значение соответствующего типа, и все пользователи могут предполагать, что переменная имеет данный тип.

...