首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >装饰DBUS方法

装饰DBUS方法
EN

Stack Overflow用户
提问于 2011-02-20 10:14:47
回答 1查看 1.1K关注 0票数 2

我正在尝试将DBUS的异步方法调用与Twisted的Deferreds结合起来,但在调整通常的DBUS服务方法装饰器以完成此操作时遇到了麻烦。

要使用DBUS异步回调方法,请执行以下操作:

代码语言:javascript
复制
class Service(dbus.service.Object):

    @dbus.service.method(INTERFACE, async_callbacks=('callback', 'errback'))
    def Resources(self, callback, errback):
        callback({'Magic' : 42})

有几个地方我简单地将这两个方法封装在延迟推断中,所以我想我应该创建一个装饰器来完成这个任务:

代码语言:javascript
复制
def twisted_dbus(*args, **kargs):
    def decorator(real_func):

        @dbus.service.method(*args, async_callbacks=('callback', 'errback'), **kargs)
        def wrapped_func(callback, errback, *inner_args, **inner_kargs):
            d = defer.Deferred()
            d.addCallbacks(callback, errback)
            return real_func(d, *inner_args, **inner_kargs)

        return wrapped_func

    return decorator

class Service(dbus.service.Object):

    @twisted_dbus(INTERFACE)
    def Resources(self, deferred):
        deferred.callback({'Magic' : 42})

但是,这不起作用,因为该方法是绑定的,并接受了第一个参数,从而产生了这个回溯:

代码语言:javascript
复制
$ python service.py 
Traceback (most recent call last):
  File "service.py", line 25, in <module>
    class StatusCache(dbus.service.Object):
  File "service.py", line 32, in StatusCache
    @twisted_dbus(INTERFACE)
  File "service.py", line 15, in decorator
    @dbus.service.method(*args, async_callbacks=('callback', 'errback'), **kargs)
  File "/usr/lib/pymodules/python2.6/dbus/decorators.py", line 165, in decorator
    args.remove(async_callbacks[0])
ValueError: list.remove(x): x not in list

我可以在内部函数中添加一个额外的参数,如下所示:

代码语言:javascript
复制
def twisted_dbus(*args, **kargs):
    def decorator(real_func):

        @dbus.service.method(*args, async_callbacks=('callback', 'errback'), **kargs)
        def wrapped_func(possibly_self, callback, errback, *inner_args, **inner_kargs):
            d = defer.Deferred()
            d.addCallbacks(callback, errback)
            return real_func(possibly_self, d, *inner_args, **inner_kargs)

        return wrapped_func

    return decorator

但这似乎..。好吧,蠢蛋。特别是,由于某种原因,我想导出一个非绑定方法。

那么能不能让这个装潢师工作呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-20 13:26:46

为什么这么蠢?您已经假定您知道第一个位置参数(在self之后)是延迟推断的。为什么假设你知道真正的第一立场论点是自我更愚蠢呢?

如果您还想支持空闲函数,那么编写另一个装饰器,当您知道没有自我参数出现时使用它。

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

https://stackoverflow.com/questions/5056377

复制
相关文章

相似问题

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