Можно ли генерировать и выполнять код Python в сценарии Python? [Динамический код Python] - PullRequest
3 голосов
/ 22 ноября 2011

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

Пример запроса для одного параметра:

qCountsEmployee = (
    "select count(*) from %s where EmployeeName is not null"
     % (tablename)
     )
CountsEmployee = execute_query(qCountsEmployee)

Теперь у меня есть несколько сотен таких параметров!

Что я сделал: создал список всех параметров и сгенерировал их, используя быстрый скрипт Python, а затем скопировал этот текст и поместил его в основной скрипт, чтобы избежать утомительных строк.

columnList = ['a', 'b', ............'zzzz']

for each in columnList:
   print (
            'q' + each + ' ='
            + '"select count(*) from %s where' + each
            + 'is not null" % (tablename)'
         )
   print each + '   = execute_query(' + 'q' + each + ')'

Хотя этот подход работает, мне было интересно, можно ли вместо отдельного сценария сгенерировать строки кода и скопировать вставку в основную программу, можно ли сгенерировать их непосредственно в основном сценарии и позволить сценарию обработать ихкак строки кода?Я думаю, это сделает код намного более читабельным.Надеюсь, у меня есть смысл!Спасибо ...

Ответы [ 3 ]

5 голосов
/ 22 ноября 2011

Это было бы возможно, но здесь бесполезно.

Просто сделай что-то вроде

columnList = ['a', 'b', ............'zzzz']

results = {}
for column in columnList:
    query = (
            "select count(*) from " + tablename
            + " where " + column + " is not null"
            )
    result = execute_query(qCountsEmployee)
    results[column] = result

Вы также можете собрать все это вместе в функции генератора и выполнить

def do_counting(column_list):
    for column in column_list:
        query = (
            "select count(*) from " + tablename
            + " where " + column + " is not null"
            )
        result = execute_query(qCountsEmployee)
        yield column, result

result_dict = dict(do_counting(['...']))
2 голосов
/ 22 ноября 2011

Вы можете сделать:

cmd = compile( 'a = 5', '<string>', 'exec' )
exec( cmd )

Это то же самое, что просто написать:

a = 5

Строка, переданная в качестве первого аргумента для компиляции, может быть построена динамически.

1 голос
/ 22 ноября 2011

Чтобы основываться на том, что сказал glglgl, вы, вероятно, лучше с динамическим SQL, чем с динамическим Python (хотя Dynamic Python определенно возможен при использовании таких вещей, как eval ).При работе с динамическим SQL вы должны быть осторожны с внедрением SQL.Похоже, что это не подходит в вашем конкретном случае использования, но, безусловно, встречается чаще, чем понимают многие разработчики.

Я случайно написал статью о SQL Injection и Python который доступен на Simple-talk .

...