2014-10-02 4 views
2

Вот, мой простой класс:Как я могу динамически ссылаться на переменную в Python

import sys 

class Foo(object): 

    def __init__(self): 
    self.frontend_attrs = ['name','ip_address','mode','port','max_conn'] 
    self.backend_attrs = ['name','balance_method','balance_mode'] 

Метод инициализации выше создает два списка, и я хочу, чтобы ссылаться на них как динамически:

def sanity_check_data(self): 
    self.check_section('frontend') 
    self.check_section('backend') 

def check_section(self, section): 
    # HERE IS THE DYNAMIC REFERENCE 
    for attr in ("self.%s_attrs" % section): 
    print attr 

Но когда я это делаю, питон жалуется на вызов ("self.%s_attrs" % section).

Я читал о людях, использующих get_attr, чтобы найти модули динамически ...

getattr(sys.modules[__name__], "%s_attrs" % section)() 

Может ли это быть сделано для словарей.

+1

Вы хотите 'GetAttr (сам, '{} _attrs' .format (section)) ' – dano

+1

Вы не должны хранить данные в именах переменных вообще. Это просто просит неприятностей. Вы должны сохранить эти два словаря в другой структуре, возможно, даже в другом словаре. – TheSoundDefense

+0

Спасибо @ TheSoundDefense за совет, я возьму его на борт! – stephenmurdoch

ответ

4

То, что вы ищете, я думаю, это getattr(). Что-то вроде этого:

def check_section(self, section): 
    for attr in getattr(self, '%s_attrs' % section): 
     print attr 

Хотя с этим конкретным случаем, вы могли бы быть лучше с Dict, просто чтобы держать вещи простой:

class Foo(object): 

    def __init__(self): 
    self.my_attrs = { 
     'frontend': ['name','ip_address','mode','port','max_conn'], 
     'backend': ['name','balance_method','balance_mode'], 
    } 

    def sanity_check_data(self): 
    self.check_section('frontend') 
    self.check_section('backend') 

    def check_section(self, section): 
    # maybe use self.my_attrs.get(section) and add some error handling? 
    my_attrs = self.my_attrs[section] 
    for attr in my_attrs: 
     print attr 
+0

Woo! Он работает отлично. Большое спасибо! – stephenmurdoch

+0

Рад помочь! Если вы нажмете на значок проверки рядом с счетчиком, тогда он пометит вопрос, как он разрешен с этим конкретным ответом. –

+0

Дополнительная благодарность за бит в конце! – stephenmurdoch

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