簡體   English   中英

動態調用函數 - Python

[英]Dynamically calling functions - Python

我有一個功能列表......例如

def filter_bunnies(pets): ...

def filter_turtles(pets): ...

def filter_narwhals(pets): ...

有沒有辦法通過使用表示其名稱的字符串來調用這些函數?

例如

'filter_bunnies', 'filter_turtles', 'filter_narwhals'

你的函數是一個對象的一部分嗎? 如果是這樣,你可以使用getattr函數:

>> class A:
    def filter_bunnies(self, pets):
        print('bunnies')

>>> getattr(A(), 'filter_bunnies')(1)
bunnies

是的,你可以使用:

globals()['filter_bunnies']()

叫'filter_bunnies'。

您可以使用內置函數locals()來獲取變量和函數的字典,這是一個示例:

def a(str):
    print("A" + str)

def b(str):
    print("B" + str)

def c(str):
    print("C" + str)

for f in ['a', 'b', 'c']:
    locals()[f]('hello')

我的代碼水晶球檢測到您的濾波器功能之間可能存在一些共性。 它們真的是不同的功能,還是只有一個不同的過濾器值它們都是一樣的? 如果你在一個程序中有大量的重復,那就停下來思考是否值得對一個公共函數進行一些重構,這比一組非常相似的函數更容易維護。 你可以有一個函數filterByType ,它接受2個參數,寵物列表和過濾類型,然后定義一個dict來將輸入字符串映射到你想要過濾的類型對象或類。

使用eval

請參閱eval函數。

最簡單和最丑陋的方法是使用eval函數調用它,它將評估你的字符串。 更清晰的解決方案是在函數所屬的模塊上使用getattr函數來獲取函數的引用,然后通過引用調用它。

我剛剛獲得函數引用的另一種方法是使用eval函數,如func = eval("filter_bunnies")

當你使用eval時要小心,特別是如果eval的值依賴於某種用戶輸入,因為它可能會使你執行不需要的/惡意的代碼。

通常,當我需要根據字符串向一個函數調用一個函數調用時,我將創建一個dict的函數元素。 我已經完成了這個,例如,編寫一個簡單的解釋器,其中每個關鍵字由不同的函數實現。 您甚至可以使用裝飾器來優雅地處理任務:

KEYWORD_FUNCTIONS = {}

def MAKE_KEYWORD( f ):
    KEYWORD_FUNCTIONS[ f.func_name ] = f
    return f

@MAKE_KEYWORD
def KEYWORD_A( arg ):
    print "Keyword A with arg %s" % arg

@MAKE_KEYWORD
def KEYWORD_B( arg ):
    print "Keyword B with arg %s" % arg

if __name__ == "__main__":
    KEYWORD_FUNCTIONS[ "KEYWORD_A" ]( "first_argument" )
    KEYWORD_FUNCTIONS[ "KEYWORD_B" ]( "second_argument" )

暫無
暫無

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

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