在Python脚本中生成和执行Python代码可能吗?【动态Python代码】

4 投票
3 回答
1483 浏览
提问于 2025-04-17 06:51

我正在做一些报告(计数),需要获取不同参数的计数。这看起来很简单,但其实很繁琐。

这里有一个参数的示例查询:

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 个回答

2

你可以这样做:

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

这和直接写成下面这样是一样的:

a = 5

传给编译函数的第一个参数的字符串可以动态生成。

2

根据glglgl的说法,使用动态SQL可能比动态Python更合适(虽然用一些方法,比如eval,动态Python也是可以做到的)。在使用动态SQL时,你需要小心SQL注入问题。虽然在你的特定使用场景中可能不会出现这个问题,但实际上,这种情况比很多开发者意识到的要常见得多。

我刚好写了一篇关于SQL注入和Python的文章,可以在Simple-talk上找到。

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(['...']))

撰写回答