Как исправить ошибку Python Enum — AttributeError(name) from None?

При попытке использовать перечисление в Python 3.7.3 возникает следующая ошибка. Уже пытался установить и удалить enum34, но все равно не работает. Проделал все операции в виртуальной среде (как показывает ошибка).

Что еще я могу сделать, чтобы исправить это (кроме использования другой реализации перечисления, как показано в этот вопрос)?

#enum import:
from enum import Enum

# enum definition:
class Status(Enum):
    on: 1
    off: 2

# enum utilisation (another class, same file):
self.status = Status.off

# error:
File "C:\dev\python\test\venv\lib\enum.py", line 349, in __getattr__
AttributeError(name) from None
AttributeError: off

Это правильный вопрос, вызванный недавно добавленным синтаксисом, поддерживающим аннотации типов. Пожалуйста, откройте его снова.

Ethan Furman 11.06.2019 19:12
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
8
1
6 011
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Правильный синтаксис для определения перечисления:

class Status(Enum):
    on = 1
    off = 2

Не on: 1.

В вашем определении используйте = для присвоения значений атрибутам, а не :.

# enum definition:
class Status(Enum):
    on = 1
    off = 2

Вот и все, но ты опоздал, извини :/

evilmandarine 10.06.2019 21:43

Не могли бы вы добавить объяснение, почему исходный синтаксис OP не был ошибкой?

Ethan Furman 10.06.2019 22:10

@ИтанФурман что? почему вы говорите, что это "не было ошибкой"? На самом деле это была синтаксическая ошибка; вы используете = для присвоения значений, а не :.

c0x6a 10.06.2019 22:43

Не в 3.7 — он создает аннотации, поэтому Status был пуст.

Ethan Furman 10.06.2019 22:49

@EthanFurman Я новичок в Python. Искал аннотации после вашего комментария. Вы про аннотации типа "вкл: int=1, выкл: int=2"? Если да, то почему «on: 1» не генерирует ошибку, поскольку 1 не является типом, таким как int или str?

evilmandarine 10.06.2019 23:22

Хех - это для вас, чтобы исследовать и обучать нас! Если хочешь, конечно. В зависимости от глубины вашего ответа, я буду рад опубликовать вознаграждение в размере от 100 до 500 репутации.

Ethan Furman 10.06.2019 23:36

@EthanFurman Я просто пытался обучиться и понять ваш комментарий, извините, что побеспокоил вас.

evilmandarine 11.06.2019 10:54

@EthanFurman, это не то, как предполагается использовать annotations, вы должны использовать типы данных, а не значения ¯\_(ツ)_/¯

c0x6a 11.06.2019 18:00

@supafly: Ой! Я думал, что разговариваю с @c0x6a. Мои извенения! Короткий ответ на ваш вопрос заключается в том, что аннотации предназначены для поддержки средств проверки статического типа, таких как MyPy, поэтому сам Python ничего не делает с предоставленной информацией, кроме как сохраняет ее в атрибуте __annotations__.

Ethan Furman 11.06.2019 18:29

@EthanFurman не беспокойтесь :) спасибо! (тем временем за меня проголосовали, не знаю почему, но и тут не о чем беспокоиться... работал допоздна после нескольких часов работы с json, не увидел моей глупой ошибки и в итоге узнал об аннотациях :)

evilmandarine 11.06.2019 21:56

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

Как я могу успешно преобразовать многозначное перечисление?
Почему я не могу сравнить макрос и перечисление с помощью #if?
Лучший способ написать этот переключатель/регистр в машинописном тексте?
Как сгенерировать значения перечисления времени компиляции с помощью макроса в С#?
Как правильно ввести значения перечисления, сопоставленные с ключом
Можно ли написать составной случай переключения между условным значением, связанным с перечислением, и другим случаем перечисления?
Удалить перечисление из массива перечислений независимо от его аргумента
Как проводить высокопроизводительные сравнения с фиксированным набором параметров в Python 3.7?
Как я могу использовать несколько перечислений (два перечисления) для управления двумя осями, которые объект будет вращать одновременно?
Как получить доступ и распечатать членов класса с помощью ключа перечисления?