簡體   English   中英

Python定義IFERROR函數

[英]Python Define IFERROR function

我試圖像在Excel中一樣在python中定義我自己的IFERROR函數。 (是的,我知道我可以寫try / except。我只是試圖為我經常使用的try / except模式創建一個內聯簡寫。)當前的用例試圖獲得一些遠程表的幾個屬性。 用於連接它們的模塊會產生各種錯誤,如果發生這種情況,我只想記錄在嘗試獲取該屬性時遇到錯誤。

我嘗試了什么:搜索顯示了許多線程,其中最有用的是:

在Python中經常重復try / except

Python: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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM