在Python脚本中生成和执行Python代码可能吗?【动态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 个回答
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(['...']))