我會與很多深度嵌套的json進行交互,我沒有寫,並且想讓我的python腳本更加「寬容」到無效輸入。我發現自己的寫作涉及嘗試(除了塊),而只是將可疑函數包裝起來。一般裝飾器包裝嘗試除了在python?
我知道吞下異常是一個糟糕的政策,但我寧願他們在稍後打印和分析,而不是實際停止執行。這更有價值,在我的用例中繼續執行循環而不是獲取所有密鑰。
這裏是我現在在做什麼:
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),在一些功能,轉變執行 - 停止異常到空字段,打印到stdo UT。前者可能是一種逐項跳過 - 如果該鍵不可用,則記錄空白並繼續前進 - 後者是一個行跳過,如果任何字段不起作用,則整個記錄是跳過。
我的理解是某種包裝應該能夠解決這個問題。以下是我用包裝紙試過的:
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。如果該功能已經工作,這將打印出「錯誤」,對吧?
包裝函數是否是正確的方法?
UPDATE
我已經有很多低於真正有用的,有益的答案,並感謝你爲他們 - 但是我已經編輯我上面所用的例子來說明,我試圖以捕捉更多的嵌套關鍵錯誤,我正在尋找一種功能,包裝一個try-catch ...
- 當一個方法不存在。
- 當一個對象不存在時,並且正在獲取一個對其調用的方法。
- 當一個不存在的對象被調用爲一個函數的參數時。
- 任何這些東西的任何組合。
- 獎勵,當一個功能不存在。
對於具體訪問嵌套的JSON,你可能想看看[safeJSON](https://github.com/NYTimes/safejson)。這通過有效地包裝對象'myobject'來工作。 – BrenBarn 2014-12-14 21:20:27