2015-08-23 2 views
0

Я ищу некоторые данные в словаре. Но иногда некоторых фрагментов информации нет, и бросается KeyError. Есть ли способ, который я могу сказать, чтобы игнорировать любые ошибки, которые возникают, не окружая каждую строку try/except?Как игнорировать KeyErrors для нескольких отдельных строк?

Я хочу что-то вроде:

ignore KeyError: 
    a = data['foo'] 
    b = data['bar'] 
    c = data['fizz'] 
    d = data['buzz'] 

Вместо:

try: 
    a = data['foo'] 
except KeyError: 
    pass 
try: 
    b = data['bar'] 
except KeyError: 
    pass 
try: 
    c = data['fizz'] 
except KeyError: 
    pass 
try: 
    d = data['buzz'] 
except KeyError: 
    pass 
+0

В целом это не очень хорошая идея, но в данном конкретном случае '.get' может быть хорошим выбором (вы, возможно, придется присвоить значение' Ā', 'b',' c' и 'd' в любом случае). – skyking

ответ

3

Вы можете использовать .get(), он возвращает None если ключ не существует. Пример -

a = data.get('foo') 
b = data.get('bar') 
c = data.get('fizz') 
d = data.get('buzz') 

После этого, если keys как 'foo' не существовало, dict.get() вернется None. Вы также можете указать в качестве второго аргумента значение по умолчанию для возврата в случае, если ключ не существует. Пример -

a = data.get('foo','<default value>') #the default value does not have to be a string, it can be anything. 

Это будет возвращать '<default value>' если ключ не существует.

1

Возможно, вы можете использовать цикл for и список ключей.

keys = ['foo', 'bar','fizz', 'buzz'] 
values = [] 

for k in keys: 
    v = data.get(k) 
    values.append(v) 
-1

Использовать в блоке try для всех вместо отдельных блоков, потому что у вас всегда один и тот же, кроме блока. , например.

try: 
    a = data['foo'] 
    b = data['bar'] 
    c = data['fizz'] 
    d = data['buzz'] 
except: 
    pass 

`

+1

Это не сработает. Если '' foo'' не найден, но другие присутствуют, они не будут восстановлены. – BartoszKP

0

Может быть, вы можете использовать .has_key:

a = None  
if data.has_key('foo'): 
    a = data['foo'] 
print a  

или
положить результат data.keys() в набор() и убедитесь, что первый

+0

Жизнеспособный вариант, за исключением того, что «ключ в данных» считается более Pythonic. –

+0

Пока это работает;) –

0

Это возможно только с exec (если вы используете get() переменные метода быть None):

code = """a = data["foo"] 
b = data["bar"] 
c = data["fizz"] 
d = data["buzz"]""" 
for line in code.splitlines(): 
    try: 
     exec(line, globals()) 
    except Exception: 
     pass 
Смежные вопросы