【问题标题】:Wrap callback function to include extra argument when caller verifies exact callback signature当调用者验证确切的回调签名时,包装回调函数以包含额外的参数
【发布时间】:2018-05-23 07:16:52
【问题描述】:

我正在尝试使用如下代码绑定多个属性中的多个回调函数:

for key in keys:
    def callback(self, value):
        #Do stuff...
        return None

    doSomething(callback)

之所以可行,是因为调用代码(即调用 callback)希望完全两个参数,而 callback 返回 None。现在的问题是我想包装回调,这样我也可以通过 key 类似的方式:

for key in keys:
    def wrappedCallback(self, value):
        #How do I get key in here???
        realCallback(self, key, value)
        return None

    doSomething(wrapperCallback)

但我不知道如何在 wrapperCallback 中获取密钥。我无法添加额外的默认参数,例如:

...
#This throws with "expected a function taking 2 arguments, not 3"
def wrappedCallback(self, value, key=key):
    realCallback(self, key, value)
    ...

因为这会从调用者那里抛出一个错误(它是需要非常严格的回调的 C 代码)。我也试过functools.partial,但后来我得到expected a function, not a functools.partial

如何包装传递的回调函数以包含外部参数 key(来自 for 循环),同时保持 准确 签名的描述?

【问题讨论】:

    标签: python python-3.x blender


    【解决方案1】:

    我会创建一个回调生成器,它接受您的参数(例如key)并创建您的回调。

    >>> def callback_generator(key):
    ...     def callback(self, value):
    ...         do_something_with(key, value)
    ...     return callback
    ...
    >>> for key in keys:
    ...     doSomething(callback_generator(key))
    ...
    

    【讨论】:

    • 我更喜欢这个,因为至少它在 for 循环之外
    【解决方案2】:

    几分钟后,我发现我可以在 for 循环中创建一个函数来获取一个新的堆栈帧。不幸的是,这似乎根本不是 Pythonic...

    for key in keys:
        def dummyForStackFrame(key): #Extra function to get a new stack frame with key
            def wrappedCallback(self, value):
                realCallback(self, key, value)
                return None
            doSomething(wrappedCallback
        dummyForStackFrame(key)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 2016-04-23
      • 2017-04-09
      相关资源
      最近更新 更多