Я бы взаимодействовал с большим количеством глубоко вложенных json, которые я не писал, и хотел бы сделать мой python script более "прощающим" для недопустимого ввода. Я нахожу, что пишу участвую в блоках try-except, и скорее всего закрою сомнительную функцию.
Я понимаю, что это плохая политика для проглатывания исключений, но я предпочел бы, чтобы они были напечатаны и проанализированы позже, чем фактически остановить выполнение. Это более ценно, в моем случае использования, чтобы продолжить выполнение над циклом, чем получить все ключи.
Вот что я делаю сейчас:
try:
item['a'] = myobject.get('key').METHOD_THAT_DOESNT_EXIST()
except:
item['a'] = ''
try:
item['b'] = OBJECT_THAT_DOESNT_EXIST.get('key2')
except:
item['b'] = ''
try:
item['c'] = func1(ARGUMENT_THAT_DOESNT_EXIST)
except:
item['c'] = ''
...
try:
item['z'] = FUNCTION_THAT_DOESNT_EXIST(myobject.method())
except:
item['z'] = ''
Вот что мне хотелось бы, (1):
item['a'] = f(myobject.get('key').get('subkey'))
item['b'] = f(myobject.get('key2'))
item['c'] = f(func1(myobject)
...
или (2):
@f
def get_stuff():
item={}
item['a'] = myobject.get('key').get('subkey')
item['b'] = myobject.get('key2')
item['c'] = func1(myobject)
...
return(item)
... где я могу обернуть либо единый элемент данных (1), либо главную функцию (2), в некоторой функции, которая превращает исключения завершения выполнения в пустые поля, напечатанные на стандартный вывод. Первый будет своего рода пропуском по пунктам - там, где этот ключ недоступен, он записывается пустым и перемещается - последний является пропуском строки, где, если какое-либо из полей не работает, вся запись пропущен.
Я понимаю, что какая-то обертка должна уметь это исправить. Вот что я пробовал, с оберткой:
def f(func):
def silenceit():
try:
func(*args,**kwargs)
except:
print('Error')
return(silenceit)
Вот почему это не работает. Вызовите функцию, которая не существует, она не пытается ее уловить:
>>> f(meow())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'meow' is not defined
Прежде чем я даже добавлю пустое возвращаемое значение, я бы хотел, чтобы он правильно попытался поймать. Если бы функция работала, это напечатало бы "Ошибка", правильно?
Является ли функция-обертка правильным здесь?
UPDATE
У меня было много действительно полезных и полезных ответов ниже, и спасибо вам за них, но я отредактировал примеры, которые я использовал выше, чтобы проиллюстрировать, что я пытаюсь поймать больше, чем вложенные ключевые ошибки, что я ищу специально для функции, которая обертывает try-catch для...
- Если метод не существует.
- Когда объект не существует и получает вызванный метод.
- Когда объект, который не существует, вызывается как аргумент функции.
- Любая комбинация любой из этих вещей.
- Бонус, когда функция не существует.