Eu tenho uma classe que infla objetos de linhas encontradas em um banco de dados (ou outra fonte, por exemplo, MongoDB, um arquivo CSV, etc.). Para definir as propriedades do objeto, ele faz algo como self.__dict__.update(**properties)
ou obj.__dict__.update(**properties)
.
Isso é considerado pitônico? Esse é um bom padrão que devo continuar a usar ou é considerado ruim?
Respostas:
No Python 3.3, um novo tipo foi adicionado e
types.SimpleNamespace()
, na documentação, é descrito assim:Observe o
__init__
método do tipo; você não pode obter um endosso melhor da técnica do que a documentação do Python.fonte
SimpleNamespace
seja bem diferente da maioria dos tipos, ele não possui um conjunto fixo de atributos.__dict__
. Este é o dicionário que contém a tabela de símbolos do módulo. A modificação deste dicionário realmente altera o símbolo do módulo. tabela, mas a atribuição direta ao__dict__
atributo não é possível (você pode escreverm.__dict__['a'] = 1
, que definem.a
como 1, mas não podewritem.__dict__ = {}
). Modificar__dict__
diretamente não é recomendado ", que foi o que inicialmente me levou a fazer essa pergunta.globals()
função retorna o mesmo espaço para nome e, geralmente, existem maneiras melhores de resolver problemas do que definir dinâmicas globais, daí o aviso.