Общий декоратор для обертывания, кроме Python?Python

Программы на Python
Ответить
Anonymous
 Общий декоратор для обертывания, кроме Python?

Сообщение Anonymous »

Мне приходилось работать с большим количеством глубоко вложенных json-файлов, которые я не писал, и мне хотелось бы сделать мой скрипт Python более «прощающим» недопустимый ввод. Я пишу сложные блоки try-кроме и предпочитаю просто оборачивать сомнительную функцию.

Я понимаю, что проглатывать исключения — плохая политика, но я бы предпочел предпочитают, чтобы они были распечатаны и проанализированы позже, чем фактически прекращают выполнение. В моем случае более ценно продолжить выполнение в цикле, чем получить все ключи.

Вот что я сейчас делаю:

Код: Выделить всё

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 "", line 1, in 
NameError: name 'meow' is not defined
Прежде чем добавлять пустое возвращаемое значение, я бы хотел, чтобы оно правильно перехватилось. Если бы функция работала, она бы напечатала «Ошибка», верно?

Является ли здесь правильным подходом использование функции-обертки?

ОБНОВЛЕНИЕ

Ниже у меня было много действительно полезных и полезных ответов, и спасибо вам за них, но я отредактировал примеры, которые использовал выше, чтобы проиллюстрировать, что я пытаясь уловить больше, чем вложенные ключевые ошибки, я ищу специально функцию, которая оборачивает try-catch for...
  • Когда метод не существует.
  • Когда объект не существует и для него вызывается метод.
  • Когда несуществующий объект вызывается в качестве аргумента функции.
  • Любая комбинация любых из этих вещей.
  • Бонус, если функция не существует.


Подробнее здесь: https://stackoverflow.com/questions/155 ... -in-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»