Который лучше в Python, del или delattr?

При использовании .net необходимо использовать InternalsVisibleToAttribute.

166
задан pydanny 9 July 2018 в 00:42
поделиться

6 ответов

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

252
ответ дан 23 November 2019 в 21:03
поделиться

Несомненно первое. На мой взгляд, это все равно, что спросить, лучше ли foo.bar , чем getattr (foo, «bar») , и я не думаю, что кто-то задает этот вопрос :)

17
ответ дан 23 November 2019 в 21:03
поделиться

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

14
ответ дан 23 November 2019 в 21:03
поделиться

Как и getattr и setattr, delattr следует использовать только тогда, когда имя атрибута неизвестно.

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

5
ответ дан 23 November 2019 в 21:03
поделиться

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

3
ответ дан 23 November 2019 в 21:03
поделиться

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

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

1
ответ дан 23 November 2019 в 21:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: