2017-03-03 28 views
0

是否可以做以下從字符串創建對象,有可能嗎?

這工作

usethismodule.LoginUsername="my value" 
usethismodule.LoginPassword="another value" 

但我不知道該對象的第二部分,直到代碼正在運行,我想我要的就是這個

listofthings=[] 
listofthings.append('usethismodule.LoginUsername') 
listofthings.append('usethismodule.LoginPassword') 

for value in listofthings: 
    value="A value I set" 

這會產生與上述相同的結果。那有意義嗎?

+0

你可能想'setattr',例如'SETATTR(usethismodule, 'LoginUsename', 「我的價值」)使用字符串變量作爲變量名(HTTP的' – chepner

+1

可能重複:// stackoverflow.com/q/11553721/953482)。簡短的回答:使用字典。 – Kevin

回答

2

事實上,setattr和一個字典會做的伎倆。

dictofthings = { 
    'usethismodule.LoginUsername': 'my value', 
    'usethismodule.LoginPassword': 'my other value' 
} 

for k in dictofthings: 
    setattr(eval(k.split('.')[0]), k.split('.')[1], dictofthings[k]) 

希望這有助於!

+0

但模塊名稱也是數據的一部分。你將它作爲代碼的一部分。 –

+0

好的,改變了。請注意,eval *可能是安全漏洞,但是ast.literal_eval不起作用。這是否更好? – linusg

+0

我會說這樣會更好,因爲這是他們顯然想要的,但更糟的是因爲這個eval安全問題:-)。也許你的答案和奧斯汀的答案(假定單個模塊名稱)的組合是最好的。 –

0

你一直在說usethismodule.<something>。所以讓我們假裝你是對的。

Python在sys.modules中維護當前導入模塊的dict。您可以通過名稱查找模塊,並獲取「對象」。 (A module對象,其實。)

如果你手中有一個對象,你可以硬編碼的訪問其屬性之一,或使用它getattrsetattr

import sys 

module_name = "usethismodule" # I don't know where this come from. 

utm = sys.modules[module_name] 

utm.LoginUsername = "xyzzy" 
utm.LoginPassword = "secret123" 

# or 

pw_attr_name = "passWord"  # Maybe you read this from a config file? 
setattr(utm, pw_attr_name, "secret123")