General Dekorator Wrapping versuchen außer in Python?

Ich würde die Interaktion mit einer Menge von tief verschachtelten json, die ich nicht geschrieben habe, und möchte mein python-Skript mehr 'vergeben' ungültige Eingabe. Ich finde mich schriftlich beteiligt try-except-Blöcke, und würde lieber nur wickeln Sie die zweifelhafte Funktion.

Verstehe ich, dass es eine schlechte Politik zu schlucken Ausnahmen, aber ich würde eher bevorzugen, Sie werden gedruckt und analysiert später, als tatsächlich stoppen Ausführung. Es ist mehr Wert, in meinem Anwendungsfall, die weitere Ausführung über den loop als alle Schlüssel.

Hier ist, was ich jetzt mache:

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

Hier ist, was ich möchte (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 wickeln kann entweder die einzelnen Daten-Element (1), oder ein master-Funktion (2), in eine Funktion, schaltet der Ausführung-Stopp Ausnahmen in leere Felder, gedruckt auf stdout. Das erstere wäre eine Art von Element-wise skip - wo welche Taste ist nicht verfügbar, meldet er sich leer und bewegt sich auf - letzteres ist ein row-skip, wo Sie, wenn Sie die Felder nicht funktionieren, wird der gesamte Datensatz übersprungen.

Mein Verständnis ist, dass eine Art wrapper sollte in der Lage sein, dies zu beheben. Hier ist, was ich versucht habe, mit einem wrapper:

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

Ist hier, warum es nicht funktioniert. Eine Funktion aufzurufen, die nicht existiert, ist es nicht von try-catch es Weg:

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

Bevor ich füge noch einen leeren Rückgabewert, ich mag würde, um es zu try-catch richtig. Wenn die Funktion gearbeitet hatte, dieses würde gedruckt haben "Fehler", richtig?

Ist eine wrapper-Funktion der richtige Ansatz hier?

UPDATE

Ich habe eine Menge wirklich nützliche, hilfreiche Antworten, und danke Ihnen---aber ich habe bearbeitet die Beispiele, die ich oben verwendet, um zu verdeutlichen, dass ich versuche zu fangen, mehr als verschachtelte Schlüssel-Fehler, ich bin auf der Suche speziell für eine Funktion, die wraps mit einem try-catch für...

  1. Wenn eine Methode nicht existiert.
  2. Wenn ein Objekt nicht existiert, und wird immer eine Methode aufgerufen.
  3. Wenn ein Objekt, das nicht existiert, aufgerufen wird, als argument an eine Funktion.
  4. Eine beliebige Kombination von diesen Dingen.
  5. Bonus, wenn eine Funktion nicht vorhanden ist.
Kommentar zu dem Problem
Für den Zugriff auf geschachtelte JSON-insbesondere, möchten Sie vielleicht, zu betrachten, safeJSON. Dies funktioniert, indem Sie effektiv das einwickeln der Objekt myobject. Kommentarautor: BrenBarn

InformationsquelleAutor der Frage Mittenchops | 2013-03-22

Schreibe einen Kommentar