O exemplo específico em mente é uma lista de nomes de arquivos e seus tamanhos. Não consigo decidir se cada item da lista deve ter o formato {"filename": "blabla", "size": 123}
ou apenas ("blabla", 123)
. Um dicionário me parece mais lógico, porque acessar o tamanho, por exemplo, file["size"]
é mais explicativo do que file[1]
... mas eu realmente não tenho certeza. Pensamentos?
python
dictionary
clb
fonte
fonte
fname, file_size = file
, onde os dados são sua tupla acima, eliminariamfile[1]
e substituiriamfile_size
. Claro que isso depende de uma boa documentação.Respostas:
Eu usaria um
namedtuple
:Agora você pode usar
file.size
efile.filename
em seu programa, que é a forma mais legível de IMHO. O Notenamedtuple
cria objetos imutáveis, como tuplas, e eles são mais leves que os dicionários, conforme descrito aqui .fonte
Filesize = namedtuple('Filesize', 'filepath kilobytes')
attrs
módulo muito bom (você pode encontrá-lo atravéspip
ou apenas procurá-lo), que permite conveniências sintáticas muito semelhantes às tuplas nomeadas, mas pode fornecer a mutabilidade (mas também pode ser imutável). A principal diferença funcional é que asattrs
classes criadas não se comparam às tuplas simples, da mesma forma quenamedtuple
as fazem.class
,def
E=
tudo apenas substituir quaisquer utilizações anteriores. repl.itnamedtuple
é essencialmente uma declaração curta para um novo tipo com atributos imutáveis. Isso significa que a resposta é efetivamente: "Nem umtuple
nem umdict
, mas umobject
". 1Essa é a questão antiga: codificar seu formato / esquema dentro ou fora da banda.
Você troca alguma memória para obter a legibilidade e portabilidade resultantes da expressão correta do formato dos dados. Se você não fizer isso, o conhecimento de que o primeiro campo é o nome do arquivo e o segundo é o tamanho deve ser mantido em outro lugar. Isso economiza memória, mas custa legibilidade e portabilidade. O que vai custar mais dinheiro à sua empresa?
Quanto à questão imutável, lembre-se de imutável não significa inútil diante da mudança. Isso significa que precisamos pegar mais memória, fazer a alteração em uma cópia e usar a nova cópia. Isso não é gratuito, mas muitas vezes não é um disjuntor. Usamos cordas imutáveis para mudar as coisas o tempo todo.
Outra consideração é a extensibilidade. Quando você armazena dados apenas em posição, sem codificar informações de formato, é condenado a apenas uma herança, o que realmente não passa de prática de concatenar campos adicionais após os campos estabelecidos. Posso definir um terceiro campo para ser a data de criação e ainda ser compatível com o seu formato, pois defino primeiro e segundo da mesma maneira.
No entanto, o que não posso fazer é reunir dois formatos definidos independentemente, com alguns campos sobrepostos, outros não, armazená-los em um formato e ser útil para coisas que só sabem sobre um ou outro formato.
Para fazer isso, preciso codificar as informações de formato desde o início. Eu preciso dizer "este campo é o nome do arquivo". Isso permite herança múltipla.
Você provavelmente está acostumado a herança apenas sendo expressa no contexto de objetos, mas as mesmas idéias funcionam para formatos de dados porque, bem, os objetos são armazenados em formatos de dados. É exatamente o mesmo problema.
Portanto, use o que achar mais provável. Busco flexibilidade, a menos que consiga apontar um bom motivo para não fazê-lo.
fonte
Eu usaria uma classe com duas propriedades.
file.size
é melhor que umfile[1]
ou outrofile["size"]
.Simples é melhor que complexo.
fonte
file = Filesize(filename='stuff.txt', size=222)
efiletup = ("stuff.txt", 222)
ambos geram o mesmo JSON:json.dumps(file)
ejson.dumps(filetup)
resultam em:'["stuff.txt", 222]'
Os nomes de arquivo são exclusivos? Nesse caso, você pode descartar completamente a lista e usar apenas um dicionário puro para todos os arquivos. por exemplo (um site hipotético)
etc ...
Agora, você não recebe "nome" e "tamanho", apenas usa chave e valor, mas geralmente isso é mais natural. YMMV.
Se você realmente deseja um "tamanho" para maior clareza ou precisa de mais de um valor para o arquivo, então:
fonte
Em python, dicionário é objeto mutável. Por outro lado, tupla é objeto imutável.
se você precisar alterar a chave do dicionário, par de valores frequentemente ou sempre. Eu sugiro dicionário para usar.
se você tiver dados fixos / estáticos, sugiro usar tupla.
Mas, não é possível alterar os dados da tupla usando o operador de atribuição.
fonte