在python中传递参数之前,我可以依赖参数的求值吗?

在python中传递参数之前,我可以依赖参数的求值吗?,python,mocking,peewee,Python,Mocking,Peewee,我正在编写一个基本的模拟框架,以便测试对peewee的一些调用 我知道在peewee中,您可以进行where()调用,如 model.select()。其中(model.id==target\u id) 为了检测正在比较模型的哪些字段,我将覆盖该字段的比较运算符。然后我将注入该模型来代替peewee模型。它将提供与peewee模型相同的接口(尽管只提供所需的接口),但它不会访问数据库,而是记录比较和调用;但这一切都取决于调用该方法之前所计算的参数 我使用anaconda运行了一个示例,对于Lin

我正在编写一个基本的模拟框架,以便测试对peewee的一些调用

我知道在peewee中,您可以进行
where()
调用,如
model.select()。其中(model.id==target\u id)

为了检测正在比较模型的哪些字段,我将覆盖该字段的比较运算符。然后我将注入该模型来代替peewee模型。它将提供与peewee模型相同的接口(尽管只提供所需的接口),但它不会访问数据库,而是记录比较和调用;但这一切都取决于调用该方法之前所计算的参数

我使用anaconda运行了一个示例,对于LinuxMint附带的任何python,它们似乎都按照我的意愿运行。我不确定这是否是运行时的侥幸,或者python真的在需要比较之前对比较进行了评估

因此,关于以下内容,我可以依靠
model.id==target\u id,
在调用第一个
where()
之前运行比较吗?我能否依靠
model.name==target\u name
在调用第二个
where()
之前和第一个
where()
之后运行比较

mockModel.select()
         .where(model.id == target_id, model.number == target_number)
         .where(model.name == target_name)
         ...
对。从:

主对象必须计算为可调用对象(用户定义的函数、内置函数、内置对象的方法、类对象、类实例的方法,以及所有具有
\u call\u()
方法的对象都是可调用的)所有参数表达式在尝试调用之前都会进行求值。


方法参数在为调用编组时解析。由于调用第一个
where
时未查找第二个
where
,因此尚未解析其参数。此语句的顺序

mockModel.select()\
         .where(model.id == target_id, model.number == target_number)\
         .where(model.name == target_name)

  • 查找
    mockModel
  • 在该对象上查找
    选择
  • 它没有参数,所以调用它并获取其结果对象
  • 查找结果对象上的
    ,其中
  • 它是一个函数,所以从左到右计算它的参数
  • 调用函数并获取其结果对象
  • 查找结果对象上的
    ,其中
  • 这是一个函数调用,所以从左到右计算它的参数
  • 调用函数

参数中的表达式将完全执行到结果对象中,并将该对象传递给函数。所以,是的,在打电话之前必须完全解决这些问题;但这一决定的时间有多早?在包含行之前?在方法链中的第一次调用之前?在调用任何方法之前,是否在方法链中对所有表达式求值?因此,可以肯定的是,根据示例,
model.name==target\u name
将在第一个
where()
之后,但在第二个
where()
之前运行