【问题标题】:Python Decorator with extraneous arguments带有无关参数的 Python 装饰器
【发布时间】:2012-02-16 19:57:51
【问题描述】:

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

user 和 limit 作为输入是有意义的,但 table 没有意义,因为调用者永远无法控制它。感觉很陌生。

有没有办法做这样的事情:

@sql_decorator
def user_records(user, limit):
    "sql to select records from table with user=%s limit %s" % (user, limit)

然后让装饰器通过查找表的实例并将其更改为正确的值来更改 sql?

【问题讨论】:

  • 我不明白你在问什么。你的装饰师是做什么的?您要编写另一个函数,还是将table 设为具有默认值的关键字参数?
  • 我希望你不要真的那样构建你的 SQL。您的示例容易受到 SQL 注入的攻击。
  • 我不明白,你给出的例子接收相同的参数。
  • 抱歉,第二个函数中的表 arg 让我不清楚我在尝试什么。更新了。请让我知道它是否仍然令人困惑。 ...不,这只是一个示例 sql。
  • 这仍然令人困惑。 user_records 是你的装饰器吗?你用什么装饰它?我们可以看看你目前拥有的代码吗?

标签: python decorator


【解决方案1】:

如果我理解正确,那么你有这样的事情:

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)

【讨论】:

  • 这似乎不太正确,因为您仍然只是向 table_name 的@sql_decorator 提供输入,在本例中为“some_table_name”。装饰器的工作是找到应该是什么表,然后使用该值运行函数。该功能只想给出用户的输入和限制。它不想将 'table' 作为 arg,但如果没有 'table' 作为 arg,我无法找到一种方法。
  • 有趣。将尝试这个并报告回来。谢谢。
猜你喜欢
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2012-03-03
  • 2014-03-24
  • 2015-10-19
  • 1970-01-01
  • 2020-09-05
相关资源
最近更新 更多