首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从现有的装饰器创建一个新的装饰师

从现有的装饰器创建一个新的装饰师
EN

Stack Overflow用户
提问于 2020-01-07 14:07:03
回答 2查看 207关注 0票数 2

我在任务队列中使用剧作家q,它提供装饰器@dramatiq.actor,将函数装饰为一个任务。我尝试自己编写包装@dramatiq.actor装饰器的装饰器,以便向适用于所有任务的@dramatiq.actor装饰器中添加一个默认参数(我正在讨论的参数是priority=100)。

由于某些原因,我得到了以下错误:

代码语言:javascript
复制
TypeError: foobar() takes 1 positional argument but 3 were given

如果我将我的自定义@task装饰器换成@dramatiq.actor,它会工作,所以我想我的定制装饰器是不正确的,但是我找不到我的错误。

decorators.py

代码语言:javascript
复制
def task(func=None, **kwargs):    
    def decorator(func):
        @wraps(func)
        @dramatiq.actor(priority=100, **kwargs)
        def wrapper(*args, **kwargs):
            return func(*args, **kwargs)

        return wrapper

    if func is None:
        return decorator

    return decorator(func)

tasks.py

代码语言:javascript
复制
@task
def foobar(entry_pk):
    ...

views.py

代码语言:javascript
复制
foobar.send_with_options(args=(entry.pk,))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-07 14:15:20

使用functools.partial要容易得多

代码语言:javascript
复制
from functools import partial

task = partial(dramatiq.actor, priority=100)

@task
def foobar(*args, **kwargs):
    ...

这允许您先发制人地向函数添加参数,而不必实际调用它。

票数 3
EN

Stack Overflow用户

发布于 2020-01-29 19:50:26

另一种方法是子类Dramatiq类并重写actor方法。这种方法加上这里描述的其他一些技巧- https://blog.narrativ.com/converting-celery-to-dramatiq-a-py3-war-story-23df217b426

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59630018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档