在运行时修改循环函数的内部

时间:2015-05-15 04:27:28

标签: python python-3.x

这是一个很麻烦的,但请耐心等待。

我正在调用一个具有无限期等待某种输入的函数的库。不幸的是,这个函数以这样的方式被窃听:它允许它从中读取的管道填充不相关的输入,导致程序在等待它自己失明的输入时锁定。该库完全是关键的,非常难以复制,维护者不接受拉取请求或错误报告。

我需要注入一个"冲洗管道"函数调用此函数的主体。以前我通过利用具有回调参数的类似函数来解决这个问题,但是这个特定的函数没有这样的参数。

我该怎么办?

1 个答案:

答案 0 :(得分:3)

您似乎可以查看源代码,因此您可以执行的是查看源代码并找到在错误方法中调用的方法并monkey patch

class OtherGuysClass:

    def buggedMethod(self, items):
        for item in items:
            a = self.convert(item)
            print(a * 5)

    def convert(self, str):
        return int(str)

if __name__ == "__main__":
    try:
        OtherGuysClass().buggedMethod([1, 2, None, 5])
    except Exception as e:
        print("Bugged method crashed: " + str(e))

    # Replace convert with our own method that returns 0 for None and ""
    o = OtherGuysClass()
    original_convert = o.convert
    def float_convert(str):
        if str:
            return original_convert(str)
        return 0
    o.convert = float_convert
    o.buggedMethod(["1", "2", None, "5"])
  

5
  10个
  Bugged方法崩溃:int()参数必须是字符串,类似字节的对象或数字,而不是' NoneType'
  5
  10个
  0
  25