2010-09-01 55 views
2

我有配置變量的字典,看起來是這樣的:有人會向我解釋爲什麼類型(富)(酒吧)是如此嚴重阻礙?

self.config = { 
    "foo": "abcdef", 
    "bar": 42, 
    "xyz": True 
} 

我希望能夠更新來自用戶的輸入(在這種情況下,總是會在一個字符串的形式,這些變量)。我面臨的問題是顯而易見的,我的第一個解決方案似乎不夠好對我說:

def updateconfig(self, key, value): 
    if key in self.config: 
     self.config[key] = type(self.config[key])(value) 

然而,#python Freenode的幾乎似乎得罪,我會提出這樣的解決方案。有人能告訴我爲什麼這是不好的做法嗎?

+0

真的很奇怪的代碼...你能解釋類型(self.config [key])的含義語義嗎? – 2010-09-01 00:41:13

+0

我的意思是,這段代碼並不意味着_key_的類型和值的目標類型之間有任何語義關係! – 2010-09-01 00:43:38

+0

它查找變量的原始類型(這無疑是正確的)並將傳入值設置爲該類型。代表它的更好的方法可能是'old_value = self.config [key]'後面跟着'self.config [key] = type(old_value)(value)'。 – Fraxtil 2010-09-01 00:45:26

回答

5

並非所有類型都支持這種成語,「用字符串調用該類型以創建該類型的新實例」。不過,如果你確保你在你的配置字典這樣的類型(與可能的init一次全面的檢查),把合適的try/except保護在你嘗試轉換(處理用戶錯誤,如拼寫錯誤一個更好的方式比死於堆棧跟蹤將是;-)沒有什麼「固有錯誤」使用該功能的類型,支持它。

+0

+1不鼓勵使用語言功能似乎在python中非常流行。這就像人們想要一種較弱的語言。 – aaronasterling 2010-09-01 00:43:48

+3

'bool(「False」) - > True'是一種不起作用的類型。 – 2010-09-01 01:03:10

+0

@THCk,'type(True)(False) - > False'這更接近用例。 – aaronasterling 2010-09-01 02:19:23

0

更不用說,在Python中有配置模塊,這裏是我將如何處理配置,以整數值「bar」爲例。對亞歷克斯+1爲''的方式來說假,看到價值「xyz」!

config = { 
    "foo": "abcdef", 
    "bar": "42", 
    "xyz": "True" ## or 'Yes' or anything not False, "" for False 
} 

bar = '' 
while not bar: 
    barinput = raw_input('Enter property bar, integer (1..99): ') 
    try: 
     if 0 < int(barinput) < 100: 
      pass 
     else: 
      raise ValueError("%s is not integer in range 1..99" % barinput) 
    except ValueError as e: 
     print(str(e)+"\nWrong input, try again") 
    else: 
     print("Saving correct value") 
     bar = config["bar"] = barinput 
print('New value of "bar" in config: %i' % int(config["bar"])) 

的值可以被保存爲int類型的配置還可以,但我們還沒有需要type因爲我們知道,我們正在輸入查詢的整數。

相關問題