来自另一个模块的Python补丁方法

来自另一个模块的Python补丁方法,python,monkeypatching,rethinkdb,Python,Monkeypatching,Rethinkdb,我需要为RejectDB的run()方法添加一些额外的功能。以下是我的想法: from rethinkdb.ast import RqlQuery class ExtendedRqlQuery(RqlQuery): def run(self, c=None, **global_optargs): if not c: with connection.get_conn() as conn: return super(E

我需要为RejectDB的
run()
方法添加一些额外的功能。以下是我的想法:

from rethinkdb.ast import RqlQuery

class ExtendedRqlQuery(RqlQuery):
    def run(self, c=None, **global_optargs):
        if not c:
            with connection.get_conn() as conn:
                return super(ExtendedRqlQuery, self).run(conn, **global_optargs)
        else:
            return super(ExtendedRqlQuery, self).run(c, **global_optargs)
RqlQuery = ExtendedRqlQuery
问题是,如果我在没有任何连接参数的情况下运行查询,就会出现错误,就好像我的补丁没有生效一样。我做错了什么

编辑:

我做了一个测试,我觉得很奇怪:

import rethinkdb as r
# Here is where I do my patching
import .utils

class Test(TestCase):
    def test(self):
        print r.ast.RqlQuery
        r.table('table').insert({'a': 1}).run()

print语句说的是
(这是对的),但是下面的语句仍然使用了
rejectDB/ast.py

中的原始文件
连接
参数来自哪里?它是我编写的一个模块,上面导入了一些行。您是否先尝试导入了
utils
?现在,您已经导入了该模块,然后才在其他地方对其进行修补。另外,您可能需要设置monkeypatched模块,如
rejectdb.ast.RqlQuery=ExtendedRqlQuery
。我首先导入了它,它也是一样的。这很奇怪,因为print语句说它导入了我的补丁类。在我尝试修补之前,可能会将其他方法(
table
insert
)作为超级类与原始类一起导入?作为一种解决方法,您是否可以改为使用重载的_start()方法实现您自己的连接类?然后可以将该连接注册为repl连接,对查询调用默认run()只需对其调用_start(self,optargs)。