【问题标题】:What's the right approach to manually adding a callback to an existing module method?向现有模块方法手动添加回调的正确方法是什么?
【发布时间】:2018-07-15 18:30:43
【问题描述】:

例如...

我想将几种方法视为“事件”,并在它们被调用后触发我自己的函数。

我不会手动调用这些。

作为一个不熟悉 Python 但熟悉 C# 的人,我希望能够修补到模块方法中,并更改功能,或者只是回调我自己的方法。

编辑:添加示例

def my_own_callback_method():
    # do something here


# imagine in a large code base there's a method I'd like to target and fire my own callback ...
#
# ... something else invokes a method ('not_my_method') in a third-party module ('core').


def not_my_method():
    # the orginial function executes as it would
    # 
    # but I'd like to pre/post callback my own method from my module
    my_own_callback_method()

或者,如果能够“修补”一个方法并改变它的功能,那就太好了。下面的例子 -

# again, imagine in a large code base there's a method I'd like to target ...
# ... but I'd like to alter the way this method works in my own module.
# 
# kind of like...


def my_method(something:str, something_else:int):
    # my own method patch of how the original 'not_my_method' should work

def not_my_method(something:str, something_else:int):
    return my_method(something, something_else)

【问题讨论】:

  • 添加了一个例子。

标签: python events callback patch


【解决方案1】:

如果您对not_my_method 的代码没有任何控制权,那将(几乎?)不可能,因为您想实际更改其源代码。

我相信你能做到的最好的事情就是将它包装在你自己的函数中,在它调用my_method 之后调用not_my_method,但差不多就是这样。

也许你从错误的角度看它。修补调用not_my_method 的实际事件可能比修补not_my_method 本身更容易。

【讨论】:

  • 能够改变方法的功能是对我在 C# 中习惯的推动力——它更像是一个“拥有会很好”的案例。我目前允许前后回调的方法是使用注入器装饰器并传递目标方法和任何参数。不太确定这是否是处理此类事情的正确方法。
猜你喜欢
  • 2014-11-06
  • 2021-10-22
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 2013-08-11
  • 2019-01-06
相关资源
最近更新 更多