私が書いていない深くネストされたjsonの多くとやり取りしたいので、私のpythonスクリプトを無効な入力に対してより「寛容」にしたいと考えています。私は自分自身が複雑な 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) をラップして、実行停止例外を空のフィールドに変換し、stdout に出力します。前者は項目ごとのスキップのようなものです - そのキーが利用できない場合、空白をログに記録して先に進みます - 後者は行スキップで、フィールドのいずれかが機能しない場合、レコード全体がスキップしました。
私の理解では、ある種のラッパーがこれを修正できるはずです。ラッパーを使用して、私が試したのは次のとおりです。
def f(func):
def silenceit():
try:
func(*args,**kwargs)
except:
print('Error')
return(silenceit)
これが機能しない理由です。存在しない関数を呼び出しても、try-catch は行われません:
>>> f(meow())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'meow' is not defined
空白の戻り値を追加する前に、try-catch を正しく取得したいと考えています。関数が機能した場合、これは「エラー」と出力されますよね?
ここでラッパー関数は正しいアプローチですか?
アップデート
以下に非常に有用で役立つ回答がたくさんありました。それらに感謝します。 m 特に try-catch をラップする関数を探しています...
- メソッドが存在しない場合。
- オブジェクトが存在せず、メソッドが呼び出されている場合。
- 存在しないオブジェクトが関数の引数として呼び出されている場合。
- これらの任意の組み合わせ。
- 関数が存在しない場合のボーナス。