来自另一个模块的Python补丁方法
我需要为RejectDB的来自另一个模块的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
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)。