【发布时间】:2018-06-16 09:48:21
【问题描述】:
我有一个用于执行 sql 脚本的子类。
def execute_script(self, script_path, **kwargs):
pass # connect to db
query = open(script_path, "r").read().format(**kwargs)
pass # execute script and close connection
根据我要执行的操作类型,我有不同的包装函数,使用不同的关键字参数,例如
def create_job(self, **kwargs):
self.execute_script("create_job.sql", **kwargs)
现在,这非常适合格式化我的 sql 脚本以包含我的关键字参数,例如我执行create_job(job_name='foo')。该脚本获取job_name 并使用上面指出的.format()-方法将其放入我的sql 脚本中。
但是,随着 sql 脚本变长,需要传入更多参数,我可能很难准确记住需要传递哪些参数,因此我想从 *kwargs 切换到显式关键字参数,像这样:
def create_job2(self, job_name, **kwargs):
self.execute_script("create_job.sql", **kwargs)
但是,这给我带来了以下错误:
KeyError: 'job_name'
所以,我在子函数中包含了job_name,认为execute_script() 中的**kwargs 参数意味着我可以将任意数量的关键字参数传递给函数。
然而,
def create_job3(self, job_name, **kwargs):
self.execute_script("create_job.sql", job_name, **kwargs)
结果
TypeError: execute_script() takes exactly 2 arguments (3 given)
如果我省略了子函数 execute_script() 的 **kwargs 参数,也会发生同样的错误
我的问题:如何修改 execute_script() 函数,以便我可以将 any 关键字参数传递给包装函数?
或者(这实际上是首选),我可以离开**kwargs-connotation,而是使用文档字符串或任何其他机制来提醒我需要传递的参数(我我指的是弹出一个框并突出显示所需的参数,如 Sublime Text 或 PyCharm 正在做的)?
【问题讨论】:
-
使用这种方法很容易引入sql注入漏洞。您可能想看看 prepared statements 以防止这种情况发生。
-
谢谢,我已经阅读了类似的内容并更改了我的代码以使用首选方式 `cursor.execute(query, values) - 我想这就是您所指的?
-
没错,不要自己格式化 sql 查询,即不要对 sql 使用
str.format或旧的%字符串格式化。 -
@Wombatz 谢谢,已从字符串执行中删除。
标签: python python-2.7 function keyword-argument