2012-03-18 11 views

Odpowiedz

17

Podobnie jak w przypadku każdego wywołania funkcji, argumenty są obliczane przed wywołaniem wywołania.
W tym przypadku dict.get() nie jest wyjątkiem ...

+2

+1 - Zen python: "Specjalne przypadki nie są wystarczająco szczególne, aby złamać zasady." – Sake

+0

+1 zen z pythonem – Doboy

+0

To powinna być zaakceptowana odpowiedź. –

3

Bo oceniamy go, a następnie przekazanie jej jako argumentu do get. Zdarza się to niezależnie od tego, czy get, czy nie, kończy się za pomocą argumentu.

0
  1. a[key] jest a['foo'] i nie masz tego klucza w a.
  2. ten jest oceniany przed wywołaniem b.get stąd błąd
  3. „nawet jeśli klucz ma w słowniku” - to anot prawda b jest pusta (ale jako 2. Punkty pokazach, to nie ma znaczenia)
6

można przepisać przykład dałeś jako

b.get(key, a.get(key)) 

uniknąć wyjątek. To zwróci None, jeśli klucz nie jest w słowniku. Ogólniej, jeśli chcesz uniknąć oceny drugiego argumentu można użyć

try: 
    x = b[key] 
except KeyError: 
    x = a[key] # or whatever the default value is supposed to be 
5

użycie zamiast tego

x = b.get(key) or a.get(key) 

or i and są operatorzy obwodu krótkie, więc jeśli b ma klucz to nie będzie wyglądać na a. Ale problemy pojawią się, jeśli masz falsy wartości w b. Jeśli tak jest w istocie można zrobić ..

x = b[key] if key in b else b.get(a) 
1

Aby uniknąć odnośnika możesz:

value = b.get(key) 
if value is None: 
    value = a[key] 

lub jeśli None jest dozwolone wtedy:

not_set = object() 
# ... 
value = b.get(key, not_set) 
if value is not_set: 
    value = a[key] 
+0

co jeśli w '# ...', użytkownik robi 'b [not_set] = 1'. {trollface} – Doboy

+0

@Doboy: nic się nie dzieje. 'not_set' jest wartością specjalną, a nie kluczem. – jfs

+0

mam na myśli .. 'b [1] = not_set' – Doboy

Powiązane problemy