Конкретный пример - список имен файлов и их размеры. Я не могу решить, должен ли каждый элемент в списке иметь форму {"filename": "blabla", "size": 123}
или просто ("blabla", 123)
. Словарь кажется мне более логичным, потому что, например, доступ к размеру file["size"]
более понятен, чем file[1]
... но я точно не знаю точно. Мысли?
python
dictionary
CLB
источник
источник
fname, file_size = file
, где данные - это ваш вышеприведенный кортеж, с которым можно покончитьfile[1]
и заменить егоfile_size
. Конечно, это зависит от хорошей документации.Ответы:
Я бы использовал
namedtuple
:Теперь вы можете использовать
file.size
иfile.filename
в своей программе, которая является ИМХО наиболее читаемой формой. Notenamedtuple
создает неизменяемые объекты, такие как кортежи, и они более легкие, чем словари, как описано здесь .источник
Filesize = namedtuple('Filesize', 'filepath kilobytes')
attrs
модуль (может найти его черезpip
или просто найти его), который позволяет вам иметь очень похожие синтаксические удобства с именованным кортежем, но может дать вам изменчивость (но также может быть сделана неизменной). Основное функциональное отличие состоит в том, чтоattrs
классы -made не сравниваются равными обычным кортежам, какnamedtuple
это делают s.class
,def
И=
все просто переписывает все предыдущие использования. repl.itnamedtuple
это по сути краткая декларация для нового типа с неизменяемыми атрибутами. Это означает, что ответ на самом деле «Ни,tuple
ни аdict
, а анobject
». +1Это старый вопрос о том, нужно ли кодировать ваш формат / схему как внутри, так и вне полосы.
Вы тратите немного памяти, чтобы получить удобочитаемость и переносимость, которые возникают при выражении формата данных прямо в данных. Если вы этого не сделаете, то знание того, что первое поле - это имя файла, а второе - размер, должно быть сохранено в другом месте. Это экономит память, но стоит читабельности и портативности. Что будет стоить вашей компании больше денег?
Что касается неизменного вопроса, помните, что неизменный не означает бесполезный перед лицом изменений. Это значит, что нам нужно больше памяти, внести изменения в копию и использовать новую копию. Это не бесплатно, но часто не является нарушителем. Мы используем неизменные строки для постоянного изменения вещей.
Еще одним соображением является расширяемость. Когда вы храните данные только позиционно, без кодирования информации о формате, вы обречены на единственное наследование, которое на самом деле является ничем иным, как практикой объединения дополнительных полей после установленных полей. Я могу определить 3-е поле как дату создания и при этом быть совместимым с вашим форматом, так как я определяю первое и второе одинаково.
Однако я не могу собрать два независимо определенных формата, которые имеют некоторые перекрывающиеся поля, а некоторые нет, хранить их в одном формате и использовать его для вещей, которые знают только об одном или других форматах.
Для этого мне нужно кодировать информацию о формате с самого начала. Мне нужно сказать "это поле является именем файла". Это позволяет множественное наследование.
Вы, вероятно, привыкли наследовать, только выражаясь в контексте объектов, но те же идеи работают для форматов данных, потому что объекты хранятся в форматах данных. Это точно такая же проблема.
Так что используйте то, что вам больше всего нужно. Я стремлюсь к гибкости, если не могу указать вескую причину, чтобы не делать этого.
источник
Я бы использовал класс с двумя свойствами.
file.size
это лучше , чем любойfile[1]
илиfile["size"]
.Простое лучше, чем сложное.
источник
file = Filesize(filename='stuff.txt', size=222)
иfiletup = ("stuff.txt", 222)
оба генерируют один и тот же JSON:json.dumps(file)
иjson.dumps(filetup)
приводят к:'["stuff.txt", 222]'
Уникальны ли имена файлов? Если это так, вы можете полностью удалить список и использовать чистый словарь для всех файлов. например (гипотетический сайт)
так далее...
Теперь вы не получаете «имя» и «размер», вы просто используете ключ и значение, но часто это более естественно. YMMV.
Если вам действительно нужен «размер» для ясности или вам нужно более одного значения для файла, то:
источник
В python словарь является изменяемым объектом. С другой стороны, кортеж является неизменным объектом.
если вам нужно изменить ключ словаря, значение пары часто или каждый раз. Я предлагаю использовать словарь.
Если у вас есть фиксированные / статические данные, я предлагаю использовать кортеж.
Но не может изменить данные кортежа с помощью оператора присваивания.
источник