gpt4 book ai didi

python - 钩子(Hook)python模块函数

转载 作者:行者123 更新时间:2023-11-28 19:54:37 25 4
gpt4 key购买 nike

基本上我想做这样的事情: How can I hook a function in a python module?

但我想在我自己的代码之后调用旧函数。

喜欢

import whatever

oldfunc = whatever.this_is_a_function

def this_is_a_function(parameter):
#my own code here
# and call original function back
oldfunc(parameter)

whatever.this_is_a_function = this_is_a_function

这可能吗?

我尝试了copy.copycopy.deepcopy原始功能,但没有用。

最佳答案

是这样的吗?它避免使用全局变量,这通常是一件好事。

import whatever
import functools

def prefix_function(function, prefunction):
@functools.wraps(function)
def run(*args, **kwargs):
prefunction(*args, **kwargs)
return function(*args, **kwargs)
return run

def this_is_a_function(parameter):
pass # Your own code here that will be run before

whatever.this_is_a_function = prefix_function(
whatever.this_is_a_function, this_is_a_function)

prefix_function 是一个包含两个函数的函数:functionprefunction。它返回一个接受任何参数的函数,并调用 prefunction,然后调用具有相同参数的 functionprefix_function 函数适用于任何可调用对象,因此您只需为您可能需要执行的任何其他 Hook 编写一次前缀代码。

@functools.wraps 使得返回的包装函数的文档字符串和名称相同。

如果您需要 this_is_a_function 调用旧的 whatever.this_is_a_function 并使用与传递给它的参数不同的参数,您可以这样做:

import whatever
import functools

def wrap_function(oldfunction, newfunction):
@functools.wraps(function)
def run(*args, **kwargs):
return newfunction(oldfunction, *args, **kwargs)
return run

def this_is_a_function(oldfunc, parameter):
# Do some processing or something to customize the parameters to pass
newparams = parameter * 2 # Example of a change to newparams
return oldfunc(newparams)

whatever.this_is_a_function = wrap_function(
whatever.this_is_a_function, this_is_a_function)

有一个问题,如果 whatever 是纯 C 模块,通常不可能(或很难)首先更改其内部结构。

关于python - 钩子(Hook)python模块函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35758323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com