我需要传递几个方法作为不带self
参数的回调。这是我当前代码的样子:
def _do_callback(callback, log, *args):
try:
# some common code
callback(*args)
except:
log.error('XX')
class Foo(object):
def __init__(self):
self.log = Log('Foo')
self.cb1_wrapper = lambda x: _do_callback(self.cb1, self.log, x) # I need a function taking one parameter
self.cb2_wrapper = lambda x: _do_callback(self.cb2, self.log, x)
def cb1(self, x):
# some code accessing self
def cb2(self, x):
# some code accessing self
def register_callbacks(self):
register('1', self.cb1_wrapper)
register('2', self.cb2_wrapper)
是否可以编写一些装饰器以应用于cb1
和cb2
,以便能够将结果传递给当前需要self.cb1_wrapper
的代码?
(我知道标题不理想,随时可以编辑)
答案 0 :(得分:1)
不确定;试想一下展开的方法应该如何看待:
def callback(fn):
def inner(self, *args):
return _do_callback(fn.__get__(self, type(self)), self.log, *args)
return inner
class Foo(object):
def __init__(self):
self.log = Log('Foo')
@callback
def cb1_wrapped(self, x):
pass
答案 1 :(得分:0)
我不知道装饰器,但你可以很容易地写一个“包装器函数”,它将绑定方法变成“回调”。 喜欢的东西:
def wrap(bound_method):
return lambda x: _do_callback(bound_method, bound_method.__self__.log, x)
一个(主要的?)缺点是你必须在呼叫时使用包装器:
foo = Foo()
...
my_fnc_using_callback(wrap(foo.cb1))