2015-07-03 5 views
-1

Я пытаюсь войти в систему с помощью syslog. У меня есть строка с объектом в ней. В этом случае "LOG_LOCAL0". Я хочу использовать эту строку для доступа к syslog.LOG_LOCAL0, который является значением int 128. Если бы это была функция, я бы использовал getattr(), но я не знаю, как это сделать для чего-то, что нельзя назвать как int, как я?Получение значения атрибута функций из строки

В основном я хочу позвонить syslog.LOG_LOCAL0, но у меня есть "LOG_LOCAL0" как строка, поэтому я не могу.

ответ

1

Если вы хотите установить значение, которое вы хотите setattr(object, name, value) (обратите внимание, что нет подписи подчёркивания). Таким образом, вы можете сделать:

setattr(syslog, "LOG_LOCAL0", "The log value") 

Если вы хотите использовать значение, то getattr еще уместно

getattr(syslog, "LOG_LOCAL0") # syslog.LOG_LOCAL0 for all intents and purposes 
+0

Извините, я, вероятно, не был чист. Я не хочу устанавливать значение. Я хочу использовать значение 'syslog.LOG_LOCAL0', которое уже существует, это может быть' syslog.LOG_LOCAL1' и т. Д., В зависимости от ввода, но у меня есть только строка с именем и вызов 'syslog." LOG_LOCAL0 "' would not быть допустимой командой, мне интересно, как сделать вызов с помощью строки. – Paul

+0

Спасибо, это было getattr все время. Я писал 'getattr (syslog, 'LOG_LOCAL0')()' вместо 'getattr (syslog, 'LOG_LOCAL0')' – Paul

1

Вы можете использовать __dict__ возвращает словарь всех functions и variables в классе, а затем используйте переменную, которую вы хотите получить как ключ, чтобы получить ее значение.

Пример -

>>> class CA: 
...  i = 15 
...  def hello(self): 
...    print("Hello") 
... 
>>> CA.__dict__ 
mappingproxy({'__dict__': <attribute '__dict__' of 'CA' objects>, ' 
>>> CA.__dict__['i'] 
15 

В вашем случае, может быть, -

syslog.__dict__['LOG_LOCAL0'] 

Хотя сноске от here -

за исключением одной вещи. Объекты модуля имеют секретный атрибут только для чтения, называемый dict, который возвращает словарь, используемый для реализации пространства имен модуля; имя dict - это атрибут, но не глобальное имя. Очевидно, что использование этого нарушает абстракцию реализации пространства имен и должно быть ограничено такими вещами, как отбойники после вскрытия.

+0

Спасибо за это, я не думал об этом, к счастью, у меня была небольшая ошибка в том, что я делал – Paul

Смежные вопросы