2017-05-02 90 views
0

我正在写一个基本的嘲笑框架,所以我可以测试一些调用peewee。我可以依靠在传入python之前进行评估的参数吗?

我知道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

参数中的表达式被完全执行到结果对象中,并且该对象被传递给函数。所以,是的,他们必须在通话之前完全解决。 – tdelaney

+0

好的,很酷;但这种解决有多早?包含行之前?在方法链中第一次调用之前?在调用任何方法之前,是否在方法链中评估了所有表达式? –

回答

0

方法参数在调用时被解析。由于在调用第一个where时尚未查找第二个where,因此其参数尚未解决。对于这一说法

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

的顺序是

  • 查找mockModel
  • 查找select该对象上
  • 它没有参数,所以调用它,得到它的结果对象
  • 查找where对结果对象
  • 其功能如此评估其参数左至右
  • 通话功能和结果对象
  • 其函数调用上得到它的结果对象
  • 查找where,使评估其参数左至右
  • 通话功能
0

是的。从docs

主要结果必须为可调用对象(用户定义的函数,内置函数,方法内置对象,类对象,类实例的方法,以及具有__call__()所有对象方法可调用)。 在尝试调用之前评估所有参数表达式。

+0

所以,可以肯定的是,就这个例子而言,'model.name == target_name'将在第一个'where()'后面运行'__eq __(self,other)',但是_before_第二个'where() '? –

+0

@ D.Joe:是的,没错。 – user2357112

相关问题