我有一个装饰器,目前需要使用它的每个函数都有一些参数,arg1,arg2和arg3。它工作正常。
但其中一个args特别感到无关紧要,因为这些函数并不真正想要将它作为输入,例如像
这样的东西@sql_decorator
def user_records(table, user, limit):
"sql to select records from ' + table + ' with user=%s limit %s" % (user, limit)
用户和限制作为输入有意义,但表没有,因为调用者永远无法控制它。感觉无关紧要。
有没有办法做这样的事情:
@sql_decorator
def user_records(user, limit):
"sql to select records from table with user=%s limit %s" % (user, limit)
然后装饰器通过查找表的实例并将其更改为正确的值来更改sql?
答案 0 :(得分:2)
如果我理解正确,那你就有这样的事情:
def sql_decorator(func):
def decorated(table, user, limit):
... # do stuff with table
return func(table, user, limit)
return decorated
@sql_decorator
def user_records(table, user, limit):
...
如果是这样,那么这可能是你想要的: 不,答案错误。见下文。
def sql_decorator(table_name):
def the_actual_decorator(func):
def decorated(user, limit):
... # do stuff with table_name
return func(user, limit)
return decorated
return the_actual_decorator
@sql_decorator('some_table_name')
def user_records(user, limit):
...
[编辑]根据你的评论你可能想要这样的东西:
def sql_decorator(func):
def decorated(user, limit):
table = compute_the_table_somehow(user)
return func(table, user, limit)
return decorated
@sql_decorator
def user_records(table, user, limit):
"sql to select records from %s with user=%s limit %s" % (table, user, limit)
data = user_records('joe', 100)