2013-03-06 49 views
1

此代碼是在Python和工作得很好:檢查字典中是否存在項目,這是不好的做法嗎?

# tests if class exists in the dictionary attrs 
try: 
    self.attrs['class'] 
# if it doesnt python will throw an exception 
except KeyError: 
    self.attrs['class'] = "someclass" 
# else it is defined, so we concat someclass to previous value 
else: 
    self.attrs['class'] = "someclass %s" % self.attrs['class'] 

雖然,這恐怕不是一個好的做法,因爲如果蟒蛇有一個更新,並且改變拋出的異常,它可能會停止工作的名稱。這是不好的做法嗎?有沒有更好的方法來做到這一點?

+1

從我pythonism的理解它實際上不是。你不應該擔心名稱改變。這會破壞太多的代碼,而不是重要的更新,而這些更新都是你知道的。 – 2013-03-06 17:14:29

+1

你可能會發現http://programmers.stackexchange.com/questions/175655/python-forgiveness-vs-permission-and-duck-typing有趣。 – George 2013-03-06 17:27:11

回答

4

您有更多查找有比你需要......在這種情況下,你也許可以這樣做:

self.attrs['class'] = 'someclass %s' % self.attrs.get('class','') 

這會給你:

'someclass ' 

如果'class'鍵不是已經在你的詞典中(這是一個不同於以前的空間)。

+0

我喜歡單線解決方案,但這個空間對我來說有所不同。 – StaticX 2013-03-06 17:25:32

+2

@StaticX - 如果需要的話,你可以在所有的末尾加上'.rstrip()'。 '('someclass%s'%self.attrs.get('class',''))。rstrip()' - 在Cpython中,這非常有效。它不創建一個新的字符串,除非它真的需要。 – mgilson 2013-03-06 17:29:56

+0

在Eric答案中添加其他2個解決方案,我會將您的標記標記爲最佳解決方案。 – StaticX 2013-03-06 17:44:35

1

此代碼效率低下,因爲在成功路徑上它仍然查找原始'class'值兩次。試試這個

try: 
    v = self.attrs['class'] 
    self.attrs['class'] = "someclass %s" % v 
except KeyError: 
    self.attrs['class'] = "someclass" 
+0

我同意,我的錯誤。我喜歡你的解決方案,但@ diego-herranz不需要你創建的這個輔助變量'v'。雖然使用try更加pythonic。這是不好的,我不能選擇這兩個答案。 – StaticX 2013-03-06 17:30:15

+0

@StaticX不用擔心,你應該總是選擇你覺得最好的答案。 – JaredPar 2013-03-06 19:43:36

1

類型的異常不會改變,但有兩種解決方案,可能會更好:

  1. 您可以使用attrs.get('class', 'someclass'),即提供一個默認值,如果鍵還可以「T中找到

  2. 擴展UserDict並覆蓋__missing__()

    class ListDict(UserDict): 
        def __missing__(key): 
         return ['someclass'] 
    

這給你一個字典,它會自動爲所有丟失的鍵創建一個新的列表。你現在可以像這樣使用它:

self.attrs['class'].append(v) 
2

@ mgilson的回答非常好。這是另一種方法,也許更容易理解和解決的最後一個空間問題:

if 'class' in self.attrs: 
    self.attrs['class'] = "someclass %s" % self.attrs['class'] 
else: 
    self.attrs['class'] = "someclass" 
2

爲什麼要靠異常時,你可以使用會員測試:

# tests if class exists in the dictionary attrs 
if 'class' in self.attrs: 
    self.attrs['class'] = "someclass %s" % self.attrs['class'] 
else: 
    self.attrs['class'] = "someclass" 

或者至少是,刪除在空操作嘗試:

# tests if class exists in the dictionary attrs 
try: 
    self.attrs['class'] = "someclass %s" % self.attrs['class'] 
except KeyError: 
    self.attrs['class'] = "someclass" 
0

我覺得異常的名字不應該被改變,但是如果你需要在一個字典執行那種邏輯(添加如果新元素的不存在,或更新,如果它是),可以還執行像下面的(是一個例子,我希望它有助於):

if not "class" in self.attrs: 

    self.attrs['class'] = 'newclass' 
else: 
    self.attrs['class'] = "someclass %s" % self.attrs['class'] 

的條件檢查的第一部分,如果元件距離字典的鍵列表。這對你來說應該是一種「成語」。 此致敬禮。

0

如果你正在創建的ATTRS字典自己,你可以使用一個DefaultDict

from collections import defaultdict 

attrs = defaultdict(str) 

attrs['class'] = "someclass %s" % attrs['class'] 
相關問題