Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 方法无效_Python_Code Injection_Inject - Fatal编程技术网

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也没有执行

那么,我能问你两个问题吗

  • 如何用我的方法正确替换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):
        ...