A modificação do __dict__ de um objeto para definir suas propriedades é considerada Pythonic?


12

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?


1
Não sei se é Pythonic, mas certamente é mais comum fazê-lo no dunder init.
user16764

Respostas:


10

No Python 3.3, um novo tipo foi adicionado e types.SimpleNamespace(), na documentação, é descrito assim:

O tipo é aproximadamente equivalente ao seguinte código:

class SimpleNamespace:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
    def __repr__(self):
        keys = sorted(self.__dict__)
        items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
        return "{}({})".format(type(self).__name__, ", ".join(items))

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.


Embora SimpleNamespaceseja bem diferente da maioria dos tipos, ele não possui um conjunto fixo de atributos.

7
Bem, falando da documentação do Python, em docs.python.org/2/library/stdtypes.html "Um atributo especial de cada módulo é __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 escrever m.__dict__['a'] = 1, que define m.acomo 1, mas não pode writem.__dict__ = {}). Modificar __dict__diretamente não é recomendado ", que foi o que inicialmente me levou a fazer essa pergunta.
Skyler # 12/13

@ skyler: observe que isso apenas menciona o espaço para nome do módulo . A 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.
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.