2014-03-12 78 views
0

在Python中,我正在填充一個對象以模擬與本地計算機上的rsyslog相關的配置,環境和其他方面(RHEL 6.4 Python 2.6.4)我循環了許多rsyslog守護進程(this_instance_number)以及配置文件中定義的許多屬性(屬性)。如何使用字符串格式來動態分配變量

用這些值填充對象。

考慮以下變量:

this_instance_number=5 
attribute="startupscript" 

下面的代碼行,

print ('rsyslog.instance%(instance_number)s.%(attribute)s' %\ 
     {"instance_number": this_instance_number, "attribute": attribute}) 

將打印這樣的文字:

rsyslog.instance5.startupscript 

我怎樣才能然後分配屬性的文本會引用基於該格式字符串的值?

例如,如果硬編碼,我會分配:

rsyslog.instance5.startupscript="/etc/init.d/sample" 

但是,我想給它分配是這樣的:

('rsyslog.instance%(instance_number)s.%(attribute)s' %\ 
     {"instance_number": this_instance_number, "attribute": attribute}) = variable 

回答

2

你會使用getattr()動態檢索屬性:

instance = getattr(rsyslog, 'instance{}'.format(this_instance_number)) 
print getattr(instance, attribute) 

setattr()分配:

instance = getattr(rsyslog, 'instance{}'.format(this_instance_number)) 
setattr(instance, attribute, variable) 

,或者用任意深度的更通用的方法:

def get_deep_attr(obj, *path): 
    return reduce(getattr, path, obj) 

def set_deep_attr(obj, value, *path) 
    setattr(get_deep_attr(obj, path[:-1]), path[-1], value) 

print get_deep_attr(rsyslog, 'instance{}'.format(this_instance_number), attribute) 
set_deep_attr(rsyslog, variable, 'instance{}'.format(this_instance_number), attribute) 
+0

的Martijn,那麼我們如何填充更深的對象?如果我需要編輯我原來的問題,我會的。簡而言之,我正在循環創建rsyslog。 ,並在該循環內創建rsyslog。 s。你的setattr看起來是將對象的屬性設置回剛剛讀取的任何內容,但是我將設置唯一值。是否有可能像這樣使用settattr?:setattr(rsyslog,instance5.startupscript,「/etc/init.d/sample」)?通過擴展,那麼我們如何動態替換「instance5.startupscript」? –

+0

@JustinHaynes:使用通用方法更新以允許任意深度屬性鏈。 –

+0

@JustinHaynes:儘管原始方法仍然可以正常工作,但你必須在循環中的某個地方找到一些變量。 –

相關問題