我正在编写一个基本的模拟框架,所以我可以测试一些对peewee的调用。
我知道在peewee,你可以像where()
那样打电话
model.select().where(model.id == target_id). ...
为了检测模型的哪些字段正在进行比较,我将覆盖该字段的比较运算符。然后我会注射该模型代替peewee模型。它将提供与peewee模型相同的接口(尽管只需要尽可能多),但它不会访问数据库,而是记录比较和调用;但是在调用方法之前,它将取决于被评估的参数。
我使用anaconda运行一个例子,对于Linux Mint附带的任何python,它们似乎按照我的意愿运行。我不确定它是否是运行时的侥幸,或者python确实在需要之前评估比较。
因此,关于以下内容,我可以依赖model.id == target_id, ...
在调用第一个where()
之前运行比较吗?在调用第二个model.name == target_name
之前和第一个where()
之后,我可以依赖where()
运行其比较吗?
mockModel.select()
.where(model.id == target_id, model.number == target_number)
.where(model.name == target_name)
...
答案 0 :(得分:0)
是。来自docs:
主要必须求值为可调用对象(用户定义的函数,内置函数,内置对象的方法,类对象,类实例的方法,以及具有
Dictionary<string, ICommand> dictionary = new Dictionary<string, ICommand>(); dictionary.Add("Command1", new Command1()); dictionary.Add("Command2", new Command2());
方法的所有对象都可以调用)。 在尝试调用之前评估所有参数表达式。
答案 1 :(得分:0)
方法参数在为调用编组时被解析。由于在调用第一个where
时未查找第二个where
,因此其参数尚未解析。该陈述的顺序
mockModel.select()\
.where(model.id == target_id, model.number == target_number)\
.where(model.name == target_name)
是
mockModel
select
where
where