Использование подчеркивания с именованными кортежами - PullRequest
0 голосов
/ 25 января 2019

Я работаю над созданием эмулятора SQL в Python и для хранения строк, я хотел бы использовать именованные кортежи, так как я могу легко обрабатывать сложные запросы с помощью выбора, упорядочения по и где.Я начал с обычных кортежей, но мне часто приходилось искать атрибут строки и мне нужно было поддерживать порядок столбцов, поэтому я пришел к namedtuples.

Проблема в том, что некоторые имена моих столбцов имеют ведущиеподчеркивания, которые приводят к тому, что я получаю ValueError: Field names cannot start with an underscore: '_col2'

Я ищу способ использовать именованные кортежи с подчеркиваниями (возможно, какой-то тип переопределения) или подходящий альтернативный контейнер, который позволяет мне легко преобразовать вкортеж значений в исходном порядке столбцов или для доступа к отдельным значениям по именам их полей.

Я думал о добавлении строки начальных символов к каждому кортежу, а затем о написании функции промежуточного программного обеспечения, выполняющей функцию getattr, но сначала удаливведущая строка символов - но это кажется невероятно хакерским.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Вы можете избежать ValueError, используя rename=True аргумент

from collections import namedtuple

a = namedtuple("Table", "_col1 _col2 _col3 col4", rename=True)

print(a._fields)

('_ 0', '_1', '_2', 'col4')

@ Edit1 Возможно, вы захотите отслеживать, какие поля были изменены

from collections import namedtuple

columns = "_col1 _col2 _col3 col4"
a = namedtuple("Table", columns, rename=True)

old_feilds = columns.split()
new_feilds = a._fields

mapper = {}

for f1,f2 in zip(old_feilds, new_feilds):
    mapper[f1] = f2

print(mapper)

{'_ col3': '_2', '_col1': '_0', 'col4': 'col4', '_col2': '_1'}

0 голосов
/ 25 января 2019

Рассмотрите возможность использования типа OrderedDict .Вы можете получить доступ к полям с любым именем строки с помощью синтаксиса скобок и в конечном итоге преобразовать его в кортеж, используя ".items".

from collections import OrderedDict
ordered_form = OrderedDict([("col1", 'Apple'), ("col2", 'Orange'), ("_col3", 'Banana')])
ordered_form["_col3"] = 'Grapefruit'
tuple_form = tuple([i[1] for i in list(ordered_form.items())])
print(tuple_form)
...