Python 方法无效
我试图注入我的方法,而不是另一个方法,但它只适用于具有少量参数的方法 我的注射器:Python 方法无效,python,code-injection,inject,Python,Code Injection,Inject,我试图注入我的方法,而不是另一个方法,但它只适用于具有少量参数的方法 我的注射器: def inject(target_function, new_function): @wraps(target_function) def _inject(*args, **kwargs): return new_function(target_function, *args, **kwargs) return _inject # decorator in
def inject(target_function, new_function):
@wraps(target_function)
def _inject(*args, **kwargs):
return new_function(target_function, *args, **kwargs)
return _inject
# decorator injection.
def inject_to(target_object, target_function_name):
def _inject_to(new_function):
target_function = getattr(target_object, target_function_name)
setattr(target_object, target_function_name, inject(target_function, new_function))
return new_function
return _inject_to
我想用我的方法替换的原始方法:
@macros.macro
class Logger:
__qualname__ = 'Logger'
suppress = False
def exception(self, message, *args, exc=None, log_current_callstack=True, level=150, owner=None, trigger_breakpoint=False):
if Logger.suppress:
return
我的方法:
@injector.inject_to(Logger, 'exception')
def exception(original, self, *args, **kwargs):
f.writeLine("Logger.exception !!!")
f.writeLine("original" + str(original))
f.writeLine("self" + str(self))
f.writeLine("args" + str(*args))
f.writeLine("kwargs" + str(**kwargs))
此喷油器在执行诸如def update\u progress(self):
之类的功能时工作正常,但对于Logger.exception它不工作
有趣的时刻-当我的方法被注入时,它不工作,原始的方法Logger.exception也没有执行
那么,我能问你两个问题吗
您面临的基本问题是将
inject
的输出分配给方法属性。inject
的结果总是接受原始函数作为其第一个参数,而方法总是以self
作为第一个参数调用。世界上没有多少装饰师会为你改变这一点,所以你必须围绕它工作
无论inject\u to
在setattr(target\u object,target\u function\u name,…)
行中赋值什么,都必须接受self
作为第一个参数。只需重写\u inject
即可首先接受self
。可能同时允许这两个版本,并向inject
添加一个布尔参数。同时将参数的顺序更改为您的异常版本
:
def inject(target_function, new_function, method=False):
if method:
@wraps(target_function)
def _inject(self, *args, **kwargs):
return new_function(self, target_function, *args, **kwargs)
else:
@wraps(target_function)
def _inject(*args, **kwargs):
return new_function(target_function, *args, **kwargs)
return _inject
你真的认为所有这些试捕块都是绝对必要的吗?请提供一个@juanpa.arrivillaga。这里肯定有一点粗枝大叶,但如果您原谅一些日志语句和注释,它已经非常小了。代码已清理:)此代码未执行,没有任何错误消息或异常。它只是“不起作用”:)感谢您的解决方案,但它无法编译-
***抱歉:缩进错误:未缩进与任何外部缩进级别不匹配(injector_v2.py,第25行)
-它在方法def Injection(target_函数,new_函数,method=False)的返回时失败:
,您应该从示例中删除最后一个return\u inject
,并将其添加到if
和else
sections@Arthur. 回程线上有一个额外的空间。固定的
...
setattr(target_object, target_function_name, inject(target_function, new_function, method=True))
...
@injector.inject_to(Logger, 'exception')
def exception(self, original, *args, **kwargs):
...