带有无关参数的Python装饰器

时间:2012-02-16 19:57:52

标签: python decorator

我有一个装饰器,目前需要使用它的每个函数都有一些参数,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?

1 个答案:

答案 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)