這可能很愚蠢,但它一直在嘮叨我腦後。在python,del或delattr中哪個更好?
的Python爲我們提供了兩個內置的方式,從對象中刪除屬性時,德爾命令字和delattr內置功能。我喜歡delattr,因爲我覺得它有點更明確:
del foo.bar
delattr(foo, "bar")
但我想知道是否有可能是它們之間在引擎罩的差異。
這可能很愚蠢,但它一直在嘮叨我腦後。在python,del或delattr中哪個更好?
的Python爲我們提供了兩個內置的方式,從對象中刪除屬性時,德爾命令字和delattr內置功能。我喜歡delattr,因爲我覺得它有點更明確:
del foo.bar
delattr(foo, "bar")
但我想知道是否有可能是它們之間在引擎罩的差異。
第一個比第二個更有效率。 del foo.bar
編譯兩個字節碼指令:
2 0 LOAD_FAST 0 (foo)
3 DELETE_ATTR 0 (bar)
而delattr(foo, "bar")
有五個:
2 0 LOAD_GLOBAL 0 (delattr)
3 LOAD_FAST 0 (foo)
6 LOAD_CONST 1 ('bar')
9 CALL_FUNCTION 2
12 POP_TOP
這就轉化成爲第一個運行稍更快(但它不是一個巨大的差異 - 0.15微秒我的機器上)。
像其他人所說的,你真的應該只使用第二種形式時,動態地確定您要刪除的屬性。
[編輯,以顯示功能,當編譯器可以使用LOAD_FAST
和LOAD_GLOBAL
內部生成的字節碼指令]
這真是喜好的問題,但第一個可能是優選的。如果您不知道要刪除的屬性的名稱,我只會使用第二個。
毫無疑問前者。在我看來,這就像詢問foo.bar
是否優於getattr(foo, "bar")
,我不認爲有人會問這個問題:)
如果你覺得delattr
更加明確,那麼爲什麼不使用getattr
所有的時間,而不是object.attr
?
至於引擎蓋下...你猜我的一樣好。如果不是更好。
就像GETATTR和SETATTR,只應在屬性名是未知的使用delattr。
在這個意義上,它是大致相當於被用來在一個較低的水平比你通常擁有大量可訪問內置的功能,一些蟒蛇的功能,如__import__
而不是import
和operator.add
代替+
不關於內部工作的確定,但是從代碼可重用性,並不是一個混蛋的同事的角度來看,使用德爾。來自其他語言的人也更加清楚和理解。
請看下面的例子:
for name in ATTRIBUTES:
delattr(obj, name)
或:
def _cleanup(self, name):
"""Do cleanup for an attribute"""
value = getattr(self, name)
self._pre_cleanup(name, value)
delattr(self, name)
self._post_cleanup(name, value)
你不能做到這一點與德爾。
這是一個老問題,但我想將我的2美分。
雖然,del foo.bar
更優雅,有時你需要delattr(foo, "bar")
。比方說,如果您有一個交互式命令行界面,允許用戶通過輸入名稱來動態刪除對象中的任何成員,那麼您別無選擇,只能使用後一種形式。
我確定至少有一個人會喜歡getattr(foo,「bar」)over foo.bar。當然,我不同意他們。但是,這個人仍然足以使它不是毫無疑問的前者。 – 2009-07-13 18:13:43
@Jason然後,沒有什麼比你對這句話的解釋「無疑更好」。我認爲這是「毫無疑問」的完全合理使用。 – Phob 2013-05-09 21:50:29
如果屬性不存在並且您希望設置默認值而不必寫入try/except塊,則getattr更可取。 即。 gettattr(foo,「bar」,None) – 2013-09-04 15:09:21