Python:如何使用猴子补丁避免递归



我正试图应用猴子补丁来修复一个问题。然而,问题是它创建了递归。

库代码

base_hook.py

class BaseHook(object):
def __init__(self, source):
pass

ssh_hook.py

class SSHHook(BaseHook):
def __init__(self, source, timeout=10):
super(SSHHook, self).__init__(source)
def get_conn(self):
print("SSH Hook")

猴子修补

class CustomSSHHook(SSHHook):
def __init__(self):
super(CustomSSHHook, self).__init__(
source="abc",
timeout=20
)
def get_conn(self):
try:
print("custom ssh Hook")
return super(CustomSSHHook, self).get_conn()
except Exception as e:
print("retry mechanism")
raise e

initpy

print "running monkey patching ssh hook get_conn"
ssh_hook.SSHHook = custom_ssh_hook.CustomSSHHook
# ssh_hook.SSHHook.get_conn = custom_ssh_hook.CustomSSHHook.get_conn
print "completed monkey patching ssh hook get_conn"

误差

File "ssh_hook.py", line 5, in __init__
super(SSHHook, self).__init__()
RuntimeError: maximum recursion depth exceeded while calling a Python object

尝试添加自定义init方法:

class CustomSSHHook(SSHHook):
def __init__(self):
super(SSHHook, self).__init__()

您可以通过向类中添加新变量来检测递归,对其进行自增并检查值。

*通常你不需要在python3

中为super指定参数

您可以将原始类(在monkey补丁之前)保存在一个变量中,并使用该变量代替super():

OriginalSSHHook = SSHHook
class CustomSSHHook(SSHHook):
def get_conn(self):
try:
print("custom ssh Hook")
return OriginalSSHHook.get_conn(self)
except Exception as e:
print("retry mechanism")
raise e

最新更新