Генерация переменных с последовательными значениями - PullRequest
3 голосов
/ 11 июня 2019

Я работаю с таблицей с большим количеством столбцов. Чтобы не получить магические числа, я кодирую что-то вроде этого

colName, colID, colDesc = 1, 2, 3

Когда я хочу добавить новый элемент, он становится

#        vvvvvvvv                           v
colName, colAddr, colID, colDesc = 1, 2 ,3, 4

Я добавляю colAddr, где я хочу, и 4 в конце. Это работает с 4 переменными, но примерно с 20-30 я получаю очень длинные строки кода.

Итак, я разделил их: по одной строке

colName = 1
colID = 2
colDesc = 3

Если я хочу добавить что-то между Name и ID, мне придется изменить нумерацию переменных, что очень болезненно

colName = 1
colAddr = 2
colID = 3 # renumbered
colDesc = 4 # renumbered

Возможно, мне придется добавлять столбцы между ними довольно часто - дизайн таблицы все еще плавный, поэтому я подумал о чем-то вроде этого

col = 0
col, colName = col + 1, col
col, colID = col + 1, col
col, colDesc = col + 1, col

Если бы я хотел добавить colAddr, то это было бы просто изменение на одну строку

col = 0
col, colName = col + 1, col
col, colAddr = col + 1, col # new line of code
col, colID = col + 1, col
col, colDesc = col + 1, col

Это работает, но выглядит очень грязно. Есть ли лучший способ сделать это?

Ответы [ 3 ]

3 голосов
/ 11 июня 2019

Более элегантное решение, чем предлагает @depperm, - использовать модуль enum (доступно начиная с Python v. 3.4), например:

from enum import Enum
class MyEnum (Enum):
    col, colName, colAddr, colID, colDesc = range(5)

Затем вы используетеэто следующим образом:

MyEnum.col
MyEnum.colName
...

Конечно, вы можете использовать непоследовательные значения для каждой из переменных.

3 голосов
/ 11 июня 2019

Вы можете использовать collections.namedtuple:

from collections import namedtuple

t = namedtuple('columns', 'colName, colAddr, colID, colDesc')
cols = t._make(range(len(t._fields)))

print(cols)
print(cols.colName)
print(cols.colAddr)
print(cols.colID)
print(cols.colDesc)

Отпечатки:

columns(colName=0, colAddr=1, colID=2, colDesc=3)
0
1
2
3
3 голосов
/ 11 июня 2019

Если вы используете a,b,c=range(3), вы можете добавить любое количество переменных в начале и изменить значение диапазона для соответствия количеству переменных.

Если нумерация должна начинаться с 1, используйте range(1,4)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...