Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

307
Visualizações
Establezca los elementos de dictado de Python de forma recursiva, cuando se le dé una clave compuesta 'foo.bar.baz'

Me gustaría lograr lo siguiente:

 foodict['foo.bar.baz'] = 'foo' { 'foo': { 'bar': { 'baz': 'foo' } } } }

...creando claves recursivamente.

Después de rascarme la cabeza por un tiempo, se me ocurrió esto:

 class Config(dict): def __init__(self, *args, **kwargs): self.super = super(Config, self) self.update(*args, **kwargs) def __setitem__(self, keys, value): keys = keys.split('.') keys.reverse() config = Config() for i, k in enumerate(keys): if i == 0: config = Config(**{ k: value }) else: config = Config(**{ k: config }) self.super.update(config)
over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Puede considerar la receta del "dictado predeterminado infinito", del propio Raymond Hettinger:

https://twitter.com/raymondh/status/343823801278140417

 >>> from collections import defaultdict >>> infinite_defaultdict = lambda: defaultdict(infinite_defaultdict) >>> d = infinite_defaultdict() >>> d['foo']['bar']['baz'] = 'foo' >>> d defaultdict(<function <lambda> at 0x1040388c8>, {'foo': defaultdict(<function <lambda> at 0x1040388c8>, {'bar': defaultdict(<function <lambda> at 0x1040388c8>, {'baz': 'foo'})})})

Otra opción es implementar __missing__ :

 >>> class InfiniteDict(dict): ... def __missing__(self, val): ... d = InfiniteDict() ... self[val] = d ... return d ... >>> d = InfiniteDict() >>> d['foo']['bar']['baz'] = 'foo' >>> d {'foo': {'bar': {'baz': 'foo'}}}

Y si debe tener acceso de atributo:

 class InfiniteDict(dict): def __missing__(self, val): d = InfiniteDict() self[val] = d return d def __getattr__(self, item): return self.__getitem__(item) def __setattr__(self, item, value): super().__setitem__(item, value)

En acción:

 >>> d = InfiniteDict() >>> d.foo.bar.baz = 'foo' >>> d {'foo': {'bar': {'baz': 'foo'}}} >>>

Aunque, eso es un poco rápido y sucio, por lo que no hay garantías de que no haya errores. Y hay muy pocas protecciones contra, por ejemplo, colisiones con atributos reales:

 >>> d.keys = 'should I be allowed?' >>> d {'foo': {'bar': {'baz': 'foo'}}, 'keys': 'should I be allowed?'} >>> d.keys() dict_keys(['foo', 'keys'])
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda