Форум сайта python.su
0
Здравствуйте.
Пожалуйста, я очнеь прошу, помогите рабозраться, почему не работает проверка, существует или нет переменная
try: config.plugins.NewYear.delay except NameError: #var_exists = False config.plugins.NewYear.delay.value_exists = False weather_city = 1123200 open('/media/hdd/ClockToText_log.txt', 'a').write(str(weather_city)+'\n') else: #var_exists = True config.plugins.NewYear.delay.value_exists = True weather_city = config.plugins.NewYear.delay.value open('/media/hdd/ClockToText_log.txt', 'a').write(str(weather_city)+'\n')
#var_exists = True config.plugins.NewYear.delay.value_exists = True weather_city = config.plugins.NewYear.delay.value open('/media/hdd/ClockToText_log.txt', 'a').write(str(weather_city)+'\n')
#var_exists = False config.plugins.NewYear.delay.value_exists = False weather_city = 1123200 open('/media/hdd/ClockToText_log.txt', 'a').write(str(weather_city)+'\n')
Отредактировано SharkyEXE (Март 8, 2019 15:00:10)
Офлайн
568
1) Есть специальная функция для проверки наличия атрибута объекта - hasattr
2) Не у всех объектов можно установить произвольный атрибут
3) При обращении к отсутствующему атрибуту райзится AttributeError, а никак не NameError
4) Вы как бы проверяете наличие атрибута delay, а установить пытаетесь delay.value_exists, ну и как это может быть?
Офлайн
0
FishHook
Здравствуйте.
Что такое config.plugins.NewYear.delay - это переменная , типа config.plugins.NewYear.delay = 1200
Что мне нужно - что если вообще существует , определена и прочее переменная config.plugins.NewYear.delay , то переменной weather_city присвоить значение переменной config.plugins.NewYear.delay , то есть weather_city = config.plugins.NewYear.delay
Иначе weather_city = 1200
Отредактировано SharkyEXE (Март 8, 2019 15:40:24)
Офлайн
568
SharkyEXE
Я вам ответил развернуто, что конкретно вы не поняли? То что вы перехватываете NameError, вместо AttributeError? Это непонятно? Или непонятно то, что в питоне таким образом не проверяют наличие атрибута объекта? Я объяснил - есть hasattr специально для этого предназначенный. Может это непонятно? Или вам непонятно, что устанавливать атрибут несуществующего атрибута - это как-то странно?
try: config.plugins.NewYear.delay # проверяю, установлен ли delay except NameError: config.plugins.NewYear.delay.value_exists = False # ОК, он не существует, поэтому я ?????? Вот что вы тут делаете, объясните
Офлайн
0
FishHook
Я же Вам написал , что config.plugins.NewYear.delay - это переменная, какие аттрибуты
Если есть у Вас желание - просто, пожалуйста, напишите
Если вообще существует , определена и прочее переменная config.plugins.NewYear.delay , то переменной weather_city присвоить значение переменной config.plugins.NewYear.delay , то есть weather_city = config.plugins.NewYear.delay
Иначе weather_city = 1200
Офлайн
568
SharkyEXE
Я же Вам написал , что config.plugins.NewYear.delay - это переменная, какие аттрибуты
ГОСТ Р 43.0.5-2009: Информационное обеспечение техники и операторской деятельности. Процессы информационно-обменные в технической деятельности. Общие положения
3.1 атрибут объекта: Элемент данных, представляющий определенную характеристику объекта (информационного, информационно-интеллектуального, предметного) и имеющий имя и значение.
Офлайн
0
Все, спасибо, извините, буду ждать ответа других пользователей, при их желании помочь.
FishHookМне просто тупо решение моей проблемы, и ничего более
я вас переспорю.
Отредактировано SharkyEXE (Март 8, 2019 15:57:58)
Офлайн
568
SharkyEXEОтлично, это даже уже интересно становится. Давайте по порядку,
Мне просто тупо решение моей проблемы, и ничего более
Python 3.7.2 (default, Jan 10 2019, 23:51:51) [GCC 8.2.1 20181127] on linux Type "help", "copyright", "credits" or "license" for more information. >>> a = object() >>> a.a Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'object' object has no attribute 'a' >>>
Офлайн
4
Привет!
Вам же написали, что вы пытаетесь перехватить NameError в то время когда система выдаёт ошибку AttributeError.
Поэтому вместо
except NameError:
напишите
except AttributeError:
в этом случае программа будет обрабатывать именно тот тип ошибки который вам нужен
Офлайн
27
NameError выкидывает когда обращаемся к именам которые которые пишутся без точки. Для конструкций вида х.у - это уже обращение к атрибуту и ошибка здесь будет AttributeError. Надеюсь, понятно выразился, хотя и не 100% точно с точки зрения терминологии.
Вот это пытается втолковать FishHook несколько постов подряд, а panama555 конкретно указал Вашу ошибку.
Офлайн