Isso pode ser bobo, mas está incomodando a parte de trás do meu cérebro há um tempo.
O Python nos fornece duas maneiras internas de excluir atributos de objetos, a palavra de comando del e a função interna delattr . Prefiro delattr porque acho um pouco mais explícito:
del foo.bar
delattr(foo, "bar")
Mas estou me perguntando se pode haver diferenças ocultas entre eles.
dis
módulo Você pode executá-lo na linha de comando usandopython -m dis
e digitando algum código ou desmontar uma função comdis.dis()
.Considere os seguintes exemplos:
ou:
Você não pode fazer isso com del .
fonte
del self.__dict__[name]
, Assumindo de negócios claro, nenhuma engraçado acontecendo com a classe metaInquestionavelmente o primeiro. Na minha opinião, é como perguntar se
foo.bar
é melhor do quegetattr(foo, "bar")
, e não acho que alguém esteja fazendo essa pergunta :)fonte
if hasattr(obj, 'var') and obj.var == ...
... Eu poderia reduzir isso para,if getattr(obj, 'var', None) == ...
na maioria dos casos! Um pouco mais curto e fácil de ler, eu acho.hasattr
realmente chamagetattr
É realmente uma questão de preferência, mas o primeiro é provavelmente preferível. Eu usaria o segundo apenas se você não souber o nome do atributo que está excluindo antes do tempo.
fonte
Assim como getattr e setattr, delattr deve ser usado apenas quando o nome do atributo for desconhecido.
Nesse sentido, é aproximadamente equivalente a vários recursos python usados para acessar a funcionalidade incorporada em um nível mais baixo do que você normalmente tem disponível, como em
__import__
vez deimport
e emoperator.add
vez de+
fonte
Não tenho certeza sobre o funcionamento interno, mas de uma reutilização de código e não seja uma perspectiva idiota de colegas de trabalho, use del. É mais claro e compreendido por pessoas vindas de outros idiomas também.
fonte
Se você acha que
delattr
é mais explícito, por que não usargetattr
o tempo todo e nãoobject.attr
?Quanto ao assunto ... seu palpite é tão bom quanto o meu. Se não for significativamente melhor.
fonte
É uma pergunta antiga, mas eu gostaria de colocar meus 2 centavos.
Embora,
del foo.bar
seja mais elegante, às vezes você precisarádelattr(foo, "bar")
. Digamos, se você tiver uma interface de linha de comando interativa que permita que um usuário exclua dinamicamente qualquer membro do objeto digitando o nome , não terá outra opção a não ser usar o último formulário.fonte