[英]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.