在python中传递之前,我可以依赖于被评估的参数吗?

时间:2017-05-02 17:01:43

标签: python mocking peewee

我正在编写一个基本的模拟框架,所以我可以测试一些对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)
         ...

2 个答案:

答案 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
  • 是一个函数调用,因此从左到右评估其参数
  • 调用函数