General Decorator, um zu versuchen, außer in Python zu wickeln?

Ich würde mit vielen tief verschachtelten Json interagieren, die ich nicht geschrieben habe, und möchte, dass mein Python-Skript ungültigen Eingaben mehr "verzeiht". Ich stelle fest, dass es sich beim Schreiben um Try-except-Blöcke handelt, und würde die zweifelhafte Funktion lieber abschließen.

Ich verstehe, dass es eine schlechte Strategie ist, Ausnahmen zu schlucken, aber ich würde es vorziehen, wenn sie später gedruckt und analysiert werden, anstatt die Ausführung tatsächlich zu stoppen. In meinem Anwendungsfall ist es wertvoller, die Ausführung über die Schleife fortzusetzen, als alle Schlüssel abzurufen.

Folgendes mache ich jetzt:

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'] = ''

Folgendes möchte ich (1):

item['a'] = f(myobject.get('key').get('subkey'))
item['b'] = f(myobject.get('key2'))
item['c'] = f(func1(myobject)
...

oder (2):

@f
def get_stuff():
   item={}
   item['a'] = myobject.get('key').get('subkey')
   item['b'] = myobject.get('key2')
   item['c'] = func1(myobject)
   ...
   return(item)

... wo ich entweder das einzelne Datenelement (1) oder eine Master-Funktion (2) in eine Funktion einbinden kann, die Ausnahmen zum Anhalten der Ausführung in leere Felder umwandelt, die auf stdout gedruckt werden. Ersteres wäre ein artikelbezogenes Überspringen - wo dieser Schlüssel nicht verfügbar ist, er sich leer meldet und weitergeht - Letzteres ist ein Zeilensprung, bei dem der gesamte Datensatz, wenn eines der Felder nicht funktioniert übersprungen.

Nach meinem Verständnis sollte eine Art Wrapper dies beheben können. Folgendes habe ich mit einem Wrapper versucht:

def f(func):
   def silenceit():
      try:
         func(*args,**kwargs)
      except:
         print('Error')
      return(silenceit)

Hier ist, warum es nicht funktioniert. Rufen Sie eine Funktion auf, die es nicht gibt, und versuchen Sie nicht, sie zu entfernen:

>>> f(meow())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'meow' is not defined

Bevor ich überhaupt einen leeren Rückgabewert hinzufüge, möchte ich, dass er richtig ausprobiert wird. Wenn die Funktion funktioniert hätte, hätte dies "Fehler" gedruckt, oder?

Ist eine Wrapper-Funktion hier der richtige Ansatz?

AKTUALISIEREN

Ich habe unten eine Menge wirklich nützlicher und hilfreicher Antworten erhalten und danke Ihnen dafür. Aber ich habe die Beispiele, die ich oben verwendet habe, bearbeitet, um zu veranschaulichen, dass ich mehr als verschachtelte Schlüsselfehler abfangen möchte. Ich suche speziell nach einer Funktion, die einen Try-Catch für ...

Wenn eine Methode nicht existiert.Wenn ein Objekt nicht existiert und eine Methode dafür aufgerufen wird.Wenn ein Objekt, das nicht existiert, als Argument für eine Funktion aufgerufen wird.Beliebige Kombination aus all diesen Dingen.Bonus, wenn eine Funktion nicht existiert.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage