Найти - Пользователи
Полная версия: Не работает проверка, существует или нет переменная
Начало » Python для новичков » Не работает проверка, существует или нет переменная
1
SharkyEXE
Здравствуйте.

Пожалуйста, я очнеь прошу, помогите рабозраться, почему не работает проверка, существует или нет переменная

    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')

Суть простая

Если существует переменная config.plugins.NewYear.delay , то выполняется
     #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')

Если не существует переменная config.plugins.NewYear.delay , то выполняется
     #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')

Однако не работает

Почему не работает - файл /media/hdd/ClockToText_log.txt не создается , в файл /media/hdd/ClockToText_log.txt ничего не пишется

Спасибо.
FishHook
1) Есть специальная функция для проверки наличия атрибута объекта - hasattr
2) Не у всех объектов можно установить произвольный атрибут
3) При обращении к отсутствующему атрибуту райзится AttributeError, а никак не NameError
4) Вы как бы проверяете наличие атрибута delay, а установить пытаетесь delay.value_exists, ну и как это может быть?
SharkyEXE
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
FishHook
SharkyEXE
Я вам ответил развернуто, что конкретно вы не поняли? То что вы перехватываете NameError, вместо AttributeError? Это непонятно? Или непонятно то, что в питоне таким образом не проверяют наличие атрибута объекта? Я объяснил - есть hasattr специально для этого предназначенный. Может это непонятно? Или вам непонятно, что устанавливать атрибут несуществующего атрибута - это как-то странно?

   try:
       config.plugins.NewYear.delay  # проверяю, установлен ли delay 
   except NameError:
       config.plugins.NewYear.delay.value_exists = False  # ОК, он не существует, поэтому я ?????? Вот что вы тут делаете, объясните 
SharkyEXE
FishHook

Я же Вам написал , что config.plugins.NewYear.delay - это переменная, какие аттрибуты

Если есть у Вас желание - просто, пожалуйста, напишите

Если вообще существует , определена и прочее переменная config.plugins.NewYear.delay , то переменной weather_city присвоить значение переменной config.plugins.NewYear.delay , то есть weather_city = config.plugins.NewYear.delay

Иначе weather_city = 1200
FishHook
SharkyEXE
Я же Вам написал , что config.plugins.NewYear.delay - это переменная, какие аттрибуты

ГОСТ Р 43.0.5-2009: Информационное обеспечение техники и операторской деятельности. Процессы информационно-обменные в технической деятельности. Общие положения

3.1 атрибут объекта: Элемент данных, представляющий определенную характеристику объекта (информационного, информационно-интеллектуального, предметного) и имеющий имя и значение.

Если вы хотите поспорить со мной о терминах, я вас переспорю.
Крепко подумайте над тем, что вам уже сказано.
SharkyEXE
Все, спасибо, извините, буду ждать ответа других пользователей, при их желании помочь.
FishHook
я вас переспорю.
Мне просто тупо решение моей проблемы, и ничего более
FishHook
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'
>>> 
Как вы наверняка видите, ошибка, которая возникает при обращении к неустановленной км.. переменной - AttributeError.
Вы в своем коде перехватываете NameError. Это, конечно, не сработает.

Ответьте, вот что вам тут непонятно? Какой конкретно пункт, слово, выражение, я его вам разжую на атомы. Вы только скажите, чего вы не понимаете.
panama555
Привет!
Вам же написали, что вы пытаетесь перехватить NameError в то время когда система выдаёт ошибку AttributeError.

Поэтому вместо
except NameError:
напишите
except AttributeError:

в этом случае программа будет обрабатывать именно тот тип ошибки который вам нужен
Rafik
NameError выкидывает когда обращаемся к именам которые которые пишутся без точки. Для конструкций вида х.у - это уже обращение к атрибуту и ошибка здесь будет AttributeError. Надеюсь, понятно выразился, хотя и не 100% точно с точки зрения терминологии.
Вот это пытается втолковать FishHook несколько постов подряд, а panama555 конкретно указал Вашу ошибку.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB