문제

이것은 어리석은 일 수 있지만 한동안 내 뇌의 뒤를 잔소리하고 있습니다.

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"). 사용자가 객체의 멤버를 동적으로 삭제할 수있는 대화식 명령 줄 인터페이스가있는 경우 이름을 입력합니다, 당신은 후자의 형태를 사용하는 것 외에는 선택의 여지가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top