Python как перебрать StrEnum без линтера (проверки PyCharm) неразрешенные ссылки - PullRequest
2 голосов
/ 11 апреля 2020

Я ввел StrEnum (иначе Enum члены должны быть str) в соответствии с инструкциями в Python 3.6 enum документах, раздел 8.13.13.4 Others.

from enum import Enum


class StrEnum(str, Enum):
    """Enum where members are strings."""

У меня есть подкласс StrEnum, где я использую for l oop для его итерации.

class TestStrEnum(StrEnum):
    """Test string enum."""

    A = "Apple"
    B = "Bananas"


for enum_ in TestStrEnum:
    print(f"name = {enum_.name}, value = {enum_.value}.")

Это прекрасно работает во время выполнения. Однако мой линтер жалуется на неразрешенную ссылку при обращении к атрибутам name и value:

Pycharm unresolved reference on enum

Как получить мой линтер, чтобы не жаловаться?

Кажется, проблема в том, что линтер не проверяется должным образом в StrEnum._member_map_. Я думаю, что решение может заключаться в том, чтобы переопределить метод dunder в StrEnum, но я не уверен, какой из них использовать.


Обходное решение

Вот Обходной путь, который я нашел, используя атрибут __members__ для явного доступа к членам.

for enum_member_name, enum_member in TestStrEnum.__members__.items():
    print(f"name = {enum_member.name}, value = {enum_member.value}.")

Мой линтер - это проверки кода PyCharm 2019.2.6 CE.

** РЕДАКТИРОВАТЬ **

В ответе @ user2235698 кажется, что это известная проблема с PyCharm: PY-36205 , поднятая в мае 2019 года. только в настоящее время имеет 6 голосов (по состоянию на 11 апреля 2020 года), я не уверен, что это будет исправлено в ближайшее время.

Если у кого-то есть хорошее решение, которое можно использовать, пока проблема не будет решена, я все еще интересно.

1 Ответ

2 голосов
/ 11 апреля 2020

Это известная проблема, пожалуйста, проголосуйте за https://youtrack.jetbrains.com/issue/PY-36205 (палец вверх возле названия вопроса)

...