лучшие способы написания вложенных для и если циклов в Python 3 - PullRequest
0 голосов
/ 02 марта 2019

У меня есть программа, которая читает строку за строкой из таблицы базы данных (используя pyodbc), а затем выполняет следующее:

цель: создать извлечение .hyper в таблице, используя главный недостаток API Python 3: вставить в.hyper файл (таблица) - это построчная операция, и мне нужно явно назначить каждый столбец каждой строки объекту строки в таблице, а затем вставить в гипер файл таблицы.

код для просмотра:

while row is not None:
    for i in range(0,colCount):
        if row[i] is not None:
            if columnDataTypes[i] == 15: 
                newrow.setCharString(i,row[i])
            elif columnDataTypes[i] == 12: 
                newrow.setDate(i, row[i].year, row[i].month, row[i].day)
            elif columnDataTypes[i] == 7: 
                newrow.setInteger(i,row[i])
            elif columnDataTypes[i] == 11:
                newrow.setBoolean(i,row[i])
            elif columnDataTypes[i] == 13:
                newrow.setDateTime(i,row[i])
            elif columnDataTypes[i] == 14:
                newrow.setDuration(i,row[i])
            elif columnDataTypes[i] == 16:
                newrow.set(i,row[i])
            else:
                newrow.setDouble(i,row[i])
    table.insert(newrow)
    row = cursor.fetchone()

Это прекрасно работает, но хочет знать, можно ли переписать это, получая либо: 1. краткий код (несколько строк) 2. лучшую производительность (по отношению к памяти или сокращению циклов).

Я добавил цикл «если row [i] не None», потому что, если я не добавлю это, и если значение столбца будет нулевым, то скрипт завершится неудачно.

Поскольку я являюсь новым разработчиком Python, любые входные данные помогут мне лучше понять, как работает python.

Моя текущая версия Python: 3.7.2 Windows 10 Enterprise RAM: 32 ГБ i5 6300U CPU

Заранее спасибо, Срикант

1 Ответ

0 голосов
/ 02 марта 2019

Мы не знаем, какой класс newrow.Для этого я буду использовать RowClass идентификатор.

(например, RowClass = newrow.__class__)

Идея состоит в том, чтобы создать словарь с целыми числами в качестве ключей и функциями для вызова в качестве значений, и посмотретьдобавьте функцию со значением по умолчанию setDouble

Создайте ее один раз при запуске (иначе это менее интересно с точки зрения производительности), что объясняет, что я не использую newrow и объектную нотацию, которая бытребуется перестроить словарь при каждом новом newrow значении.

calldict = {
  15 : RowClass.setCharString,
  7  : RowClass.setInteger,
  11 : RowClass.setBoolean,
  12 : lambda self,i,r : RowClass(self,i,r.year,r.month,r.day)  # special case to match 2 arguments
  # same principle for others, of course
}

ваш цикл с добавлением, сначала поиск функции, затем вызов функции:

while row is not None:
    for i in range(0,colCount):
        if row[i] is not None:

            # look up the function

            function_to_call = calldict.get(i,RowClass.setDouble)

            # call the function, passing the object as first argument:

            function_to_call(newrow,i,row[i])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...