Что лучше в python, del или delattr?

8 ответов


первый более эффективен, чем второй. 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             

это переводится в первый запуск немного быстрее (но это не огромная разница .15 мкс на моей машине).

как уже говорили другие, вы должны использовать только вторую форму, когда атрибут, который вы удаляете, определяется динамически.

[отредактировал показать инструкции байт-кода, созданные внутри функции, где компилятор может использовать LOAD_FAST и LOAD_GLOBAL]


  • дель является более явным и эффективным;
  • delattr позволяет удалить динамический атрибут.

рассмотрим следующий пример:

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 следует использовать только тогда, когда имя атрибута неизвестно.

в этом смысле это примерно эквивалентно нескольким функциям python, которые используются для доступа к встроенной функциональности на более низком уровне, чем обычно, например __import__ вместо import и operator.add вместо +


Не уверен во внутренней работе, но с точки зрения повторного использования кода и не будьте рывком коллегой, используйте del. Это более ясно и понятно людям, пришедшим с других языков.


Если вы думаете delattr более явные, то почему бы не использовать getattr все время, а не object.attr?

Что касается под капотом... твоя догадка не хуже моей. Если не значительно лучше.


Это старый вопрос, но я хотел бы поставить свои 2 цента.

, однако,del foo.bar более элегантно, иногда вам понадобится delattr(foo, "bar"). Скажем, если у вас есть интерактивный интерфейс командной строки, который позволяет пользователю динамически удалять любой элемент в объекте с помощью введите имя, то у вас нет выбора, кроме как использовать последний вариант.