Python, Del 또는 Delattr에서 어느 것이 더 좋습니까?
문제
이것은 어리석은 일 수 있지만 한동안 내 뇌의 뒤를 잔소리하고 있습니다.
Python은 객체에서 속성을 삭제하는 두 가지 내장 방법을 제공합니다. 델 명령 단어와 델라 트 내장 기능. 나는 선호한다 델라 트 나는 그것이 조금 더 명백하다고 생각하기 때문에 :
del foo.bar
delattr(foo, "bar")
그러나 나는 그들 사이에 과도한 차이가 있을지 궁금합니다.
해결책
첫 번째는 두 번째보다 효율적입니다. del foo.bar
두 가지 바이트 코드 지침으로 컴파일합니다.
2 0 LOAD_FAST 0 (foo)
3 DELETE_ATTR 0 (bar)
반면 delattr(foo, "bar")
5 번 가져 가기 :
2 0 LOAD_GLOBAL 0 (delattr)
3 LOAD_FAST 0 (foo)
6 LOAD_CONST 1 ('bar')
9 CALL_FUNCTION 2
12 POP_TOP
이것은 첫 번째 달리기로 해석됩니다 약간 더 빠릅니다 (그러나 그것은 큰 차이가 아닙니다 - 내 기계의 .15 μs).
다른 사람들이 말했듯이, 삭제하는 속성이 동적으로 결정될 때만 두 번째 양식 만 사용해야합니다.
컴파일러가 사용할 수있는 함수 내부에서 생성 된 바이트 코드 지침을 표시하도록 편집. LOAD_FAST
그리고 LOAD_GLOBAL
]
다른 팁
- 델 더 명확하고 효율적입니다.
- 델라 트 동적 속성 삭제를 허용합니다.
다음 예를 고려하십시오.
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)
당신은 그것을 할 수 없습니다 델.
의심 할 여지없이 전자. 내 견해로는 이것은 묻는 것과 같습니다 foo.bar
~보다 낫다 getattr(foo, "bar")
, 그리고 나는 아무도 그 질문을하고 있다고 생각하지 않습니다 :)
실제로 선호하는 문제이지만 첫 번째는 아마도 선호 될 것입니다. 당신이 미리 삭제하는 속성의 이름을 모르는 경우에만 두 번째를 사용할 것입니다.
getAttr 및 setattr와 마찬가지로 Delattr은 속성 이름을 알 수없는 경우에만 사용해야합니다.
그런 의미에서, 그것은 일반적으로 사용 가능한 것보다 더 낮은 수준에서 내장 기능에 액세스하는 데 사용되는 여러 파이썬 기능과 거의 같습니다. __import__
대신에 import
그리고 operator.add
대신에 +
내부 작업에 대해서는 확실하지 않지만 코드 재사용 성과 저크 동료 관점이 아닌 Del을 사용하십시오. 다른 언어에서 온 사람들도 더 명확하고 이해합니다.
당신이 생각한다면 delattr
더 명백한 경우 사용하지 않는 이유는 무엇입니까? getattr
항상보다는 object.attr
?
후드 밑에서 ... 당신의 추측은 내 것만 큼 좋습니다. 크게 나아지지 않는 경우.
오래된 질문이지만 2 센트를 넣고 싶습니다.
그렇지만, del foo.bar
더 우아하고 때로는 필요할 것입니다 delattr(foo, "bar")
. 사용자가 객체의 멤버를 동적으로 삭제할 수있는 대화식 명령 줄 인터페이스가있는 경우 이름을 입력합니다, 당신은 후자의 형태를 사용하는 것 외에는 선택의 여지가 없습니다.