是否可以在Python脚本中生成和执行Python代码? [动态Python代码]

时间:2011-11-22 17:55:06

标签: dynamic code-generation python

我正在处理一些报告(计数),我必须获取不同参数的计数。非常简单但又乏味。

一个参数的示例查询:

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 个答案:

答案 0 :(得分:5)

这是可能的,但在这里没用。

做一些像

这样的事情
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(['...']))

答案 1 :(得分:2)

你可以这样做:

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

这与写作相同:

a = 5

作为第一个编译参数传递的字符串可以动态构建。

答案 2 :(得分:1)

基于glglgl所说的内容,动态SQL可能比动态Python更好(尽管动态Python绝对可以使用像eval这样的东西)。使用Dynamic SQL时,应该注意sql注入。看起来它不会出现在您的特定用例中,但它确实比许多开发人员意识到的更频繁。

我碰巧撰写了一篇关于SQL Injection and Python的文章,可在Simple-talk找到。