Как использовать подсказки по типам со словарями и enoogle protobuf enum? - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь использовать protobuf enum как тип для значений в словаре, но по какой-то причине он не работает.

Мое определение перечисления в proto:

enum Device {
  UNSPECIFIED = 0;
  ON = 1;
  OFF = 2;
}

После При успешной компиляции и импорте следующий код приводит к ошибке.

from devices_pb2 import Device

def foo(device: Device) -> Dict[str, Device]:
    pass

Сообщение об ошибке:

    def foo(device: Device) -> Dict[str, Device]:
  File "/home/ivan/anaconda3/envs/py37/lib/python3.7/typing.py", line 254, in inner
    return func(*args, **kwds)
  File "/home/ivan/anaconda3/envs/py37/lib/python3.7/typing.py", line 629, in __getitem__
    params = tuple(_type_check(p, msg) for p in params)
  File "/home/ivan/anaconda3/envs/py37/lib/python3.7/typing.py", line 629, in <genexpr>
    params = tuple(_type_check(p, msg) for p in params)
  File "/home/ivan/anaconda3/envs/py37/lib/python3.7/typing.py", line 142, in _type_check
    raise TypeError(f"{msg} Got {arg!r:.100}.")
TypeError: Parameters to generic types must be types. Got <google.protobuf.internal.enum_type_wrapper.EnumTypeWrapper object at 0x7f4df6d81850>.

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

def foo(device: Device) -> Device:
    pass

Интересно, есть ли решение этой проблемы?

1 Ответ

0 голосов
/ 21 февраля 2020

Добавление следующего решило проблему:

from __future__ import annotations

Для более подробной информации, пожалуйста, проверьте здесь .

...