Python 用字符串名調用方法

有時候,一些特殊情況,需要用到用字符串的方法名去調用方法。現在做個筆記避免以後一直搜。

官網示例

  • 官方中文文檔3.8 https://docs.python.org/zh-cn/3/faq/programming.html#how-do-i-use-strings-to-call-functions-methods

StackOverflow

  • StackOverflow https://stackoverflow.com/questions/3061/calling-a-function-of-a-module-by-using-its-name-a-string

官網搬運

如何使用字符串調用函數/方法?
有多種技巧可供選擇。

  • 最好的做法是使用一個將字符串映射到函數的字典。 這一技巧的主要優勢在於字符串不必與函數名稱一致。 這也是用於模擬其他語言中 case 結構的主要技巧:

def a():
    pass

def b():
    pass

dispatch = {'go': a, 'stop': b}  # Note lack of parens for funcs

dispatch[get_input()]()  # Note trailing parens to call function
  • 使用內置函數 getattr()
import foo
getattr(foo, 'bar')()

請注意 getattr() 可用於任何對象,包括類、類實例、模塊等等。

在標準庫中多次使用了這個技巧,例如:

class Foo:
    def do_foo(self):
        ...

    def do_bar(self):
        ...

f = getattr(foo_instance, 'do_' + opname)
f()
  • 使用 locals() 或 eval() 來解析出函數名:
def myFunc():
    print("hello")

fname = "myFunc"
f = locals()[fname]
f()

f = eval(fname)
f()

注意:使用 eval() 速度慢而且危險。 如果你不能絕對掌控字符串的內容,別人將能傳入可被解析爲任意函數直接執行的字符串。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章