小談Python的getattr函式

2021-09-01 06:08:47 字數 1630 閱讀 9042

通過 getattr 獲取物件引用

你已經知道 python 函式是物件。 你不知道的是,使用 getattr 函式,可以得到乙個直到執行時才知道名稱的函式的引用。

>>>li = ["larry", "curly"]

>>>li.pop

>>>getattr(li, "pop")

>>>li

["larry", "curly", "moe"]

>>>getattr({}, "clear")

>>>getattr((), "pop")

用於模組的 getattr

getattr 不僅僅適用於內建資料型別,也可作用於模組。

>>>import odbchelper

>>>odbchelper.buildconnectionstring

>>>getattr(odbchelper, "buildconnectionstring")

>>>object = odbchelper

>>>method = "buildconnectionstring"

>>>getattr(object, method)

>>>type(getattr(object, method))

>>>import types

>>>type(getattr(object, method)) == types.functiontype

true

>>>callable(getattr(object, method))

true

getattr 作為乙個分發者

import statsout

def output(data, format="text"):

output_function = getattr(statsout, "output_%s" % format)

return output_function(data)

你是否發現前面示例的乙個 bug?即字串和函式之間的松耦合,而且沒有錯誤檢查。如果使用者傳入乙個格式引數,但是在 statsout 中沒有定義相應的格式輸出函式,會發生什麼呢?還好,getattr 會返回 none,它會取代乙個有效函式並被賦值給 output_function,然後下一行呼叫函式的語句將會失敗並丟擲乙個異常。這種方式不好。

值得慶幸的是,getattr 能夠使用可選的第三個引數,乙個預設返回值。

import statsout

def output(data, format="text"):

output_function = getattr(statsout, "output_%s" % format, statsout.output_text)

return output_function(data)

這個函式呼叫一定可以工作,因為你在呼叫 getattr 時新增了第三個引數。第三個引數是乙個預設返回值,如果第二個引數指定的屬性或者方法沒能找到,則將返回這個預設返回值。

python專案小談

專案結構.docs conf.py index.rst quickstart.rst foobar cli.py init py storage.py tests init py test cli.py test storage.py readme.rst requirements.txt setu...

小談 python 生成器

生成器 迭代器的另一種操作,它能幹的事,list也都能幹,只不過在需要處理的序列比較大時,列表解析比較費記憶體。生成器表示式 通列表解析語法,只不過把列表解析的換成 例如 gen x 2 for x in range 5 gen at 0x0000000002fb7b40 for g in gen ...

小談《金鎖記》

2005 1 18 金鎖記 是張愛玲1943年的作品。同年間的其他作品包括 傾城之戀 第一爐香 第二爐香 茉莉香片 等。張愛玲本人比較喜歡 傾城之戀 而許多讀者,包括 我在內比較傾向於中篇 金鎖記 張愛玲的大部分作品,讀者讀下來的感覺是蒼涼 凝重。我讀 金鎖記 這篇,更感受到 了命運的無奈。篇中幾位...