![](/img/trans.png)
[英]Excel function IFERROR(value, value_if_error). Does it have a python equivalent?
[英]Python Define IFERROR function
我試圖像在Excel中一樣在python中定義我自己的IFERROR函數。 (是的,我知道我可以寫try / except。我只是試圖為我經常使用的try / except模式創建一個內聯簡寫。)當前的用例試圖獲得一些遠程表的幾個屬性。 用於連接它們的模塊會產生各種錯誤,如果發生這種情況,我只想記錄在嘗試獲取該屬性時遇到錯誤。
我嘗試了什么:搜索顯示了許多線程,其中最有用的是:
閱讀完這些主題后,我嘗試編寫以下內容:
>>> def iferror(success, failure, *exceptions):
... try:
... return success
... except exceptions or Exception:
... return failure
...
>>> iferror(1/0,0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
我也嘗試過使用上下文管理器(對我而言):
>>> from contextlib import contextmanager as cm
>>> @cm
... def iferror(failure, *exceptions):
... try:
... yield
... except exceptions or Exception:
... return failure
...
>>> with iferror(0,ZeroDivisionError) as x:
... x=1/0
...
>>> print(x)
None
有沒有辦法定義一個函數,它將執行預定義的try / except模式,如IFERROR?
iferror(1/0,0)
是在輸入函數之前計算函數參數(在大多數編程語言中就是這種情況,Haskell就是一個很大的例外)。 無論iferror
做什么, 1/0
先運行並拋出錯誤。
我們必須以某種方式延遲對1/0
的評估,以便它在try
塊的上下文中發生在函數內部。 一種方法是使用一個字符串( iferror('1/0', 1)
) iferror
然后可以eval
。 但是應盡可能避免使用eval
,並且有一個更輕量級的替代方法:在調用函數之前不會對函數體進行求值,因此我們可以將表達式包裝在函數中並傳遞:
def iferror(success, failure, *exceptions):
try:
return success()
except exceptions or Exception:
return failure
def my_expr():
return 1/0
print(iferror(my_expr, 42))
42
這里的關鍵部分是我們不直接調用my_expr
。 我們將它作為函數傳遞給iferror
,然后調用success()
,最終執行return 1/0
。
唯一的問題是我們不得不將函數參數( 1/0
)從正常的代碼流中拉出來並進入一個單獨的函數定義,我們必須給出一個名稱(甚至認為它只使用一次)。
使用lambda
可以避免這些缺點,它允許我們內聯定義單表達式函數:
def iferror(success, failure, *exceptions):
try:
return success()
# ^^
except exceptions or Exception:
return failure
print(iferror(lambda: 1/0, 42))
# ^^^^^^^
42
[ 現場演示 ]
與原始嘗試相比,只需要進行兩次更改:將表達式換行為lambda:
,延遲評估,並在try: return success()
使用()
try: return success()
調用lambda,觸發對函數體的評估。
好吧,我找到了一種方法,但我不太確定,如果這就是你要找的東西。
首先,如果調用該函數會發生錯誤,因此您的函數根本無法啟動! 所以我給函數的第一個參數一個字符串。
因此該函數通過eval()
獲取“測試”並“控制”它。 這是我的代碼:
def iferror(success: str, failure, *exceptions):
try:
# Test
return eval(success)
except exceptions or Exception:
return failure
iferror("1/0", "Hi there!")
我希望我能希望你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.