簡體   English   中英

如何使用 Python 中的函數編寫 switch case 語句?

[英]How can I write a switch case statement with functions in Python?

我試圖根據我在 SO 中看到的示例創建字典(以實現切換器),並想出了這個:

def filter_on_arg(arg):
    switcher = {
        'can': get_can(table_name, filename, arg),
        'aus': get_aus(table_name, filename, arg)
    }
    return switcher.get(arg, "Invalid arg")

但是當我嘗試編譯和運行腳本時, arg的值為aus 它仍在執行第一個方法get_can ,從中我認為上述方法有問題。

我也嘗試使用NeoPySwitch庫,但是在使用 pip 安裝它時遇到了一些問題。

我使用切換器,而不是使用 if/elif; 這樣基於一個鍵,我就可以調用上面的函數。

當你定義一個字典時,鍵在存儲之前被評估。 因此,在您的情況下,每次運行 line switcher = ... ,都會評估所有get_...函數。

相反,您可以使用 lambda 使值變得“惰性”:

def filter_on_arg(arg):
    switcher = {
        'can': lambda: get_can(table_name, filename, arg),
        'aus': lambda: get_aus(table_name, filename, arg),
    }
    return switcher.get(arg, lambda: "Invalid arg")()

(注意()get()

您必須將函數作為 dict 的內容傳遞。

def filter_on_arg(arg):
    switcher = {
        'can': get_can,
        'aus': get_aus
    }
    return switcher.get(arg, invalid_arg)(table_name, filename, arg)
    # invalid_arg(table_name, filename, arg) has to be a function handling invalid argument

Python 函數是可以作為參數傳遞的對象,只要您不在它們的名稱后面加上括號(這會使它們成為函數調用)。

一旦 dict 為您提供正確的函數,您就可以使用參數調用所需的函數。

為什么不用單獨的函數來做呢? 或者您是否有不允許這樣做的要求?

def foobar_can():
    return "can"


def foobar_aus():
    return "aus"


switcher = {
        "can": foobar_can,
        "aus": foobar_aus
}

func = switcher.get("can", lambda: "Invalid arg")
print(func())
func = switcher.get("aus", lambda: "Invalid arg")
print(func())
func = switcher.get("foobar", lambda: "Invalid arg")
print(func())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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