1

我似乎无法找出为什么“或”的行为方式是这样的。我正在使用 SQLAlchemy 并且WTForms.ext.sqlalchemy.QuerySelectField可以QuerySelectField设置query_factory,但是如果缺少它应该回退到 fieldsquery方法:

例如

class Form1(Form):
    fielda = QuerySelectField('Field A')

您还可以query_factory像这样设置参数:

class Form1(Form):
    fielda = QuerySelectField('Field A', query_factory=somefunction)

然后在其他地方你使用这样的表格:

form = Form1(request.form)
form.fielda.query = MyObjects.query.all()

我看到的是,如果MyObjects.query.all()返回一个空列表,我会NoneType not callable在 QuerySelectField _get_object_list() 方法的这一行上得到一个异常:

query = self.query or self.query_factory()

基本上,无论 的值是多少self.query,即使它被分配给 ,它or仍然在调用。self.query_factory()None

所以,我的问题是,这是预期的行为or吗?它似乎对两者都进行了评估,然后决定是否需要使用第二个值(如果第一个值是 )None。这个对吗?

4

3 回答 3

1

这是正确的,在布尔上下文中 None 是错误的。如果 self.query 为 None 则值由 self.query_factory() 确定

关于什么是真假的 Python 文档

于 2012-10-26T13:59:48.083 回答
1

or短路。这意味着

query = self.query or self.query_factory()

评估如下:

  1. 检查是否self.query评估为False. 如果不是,则引用的对象self.query绑定到query. 在这种情况下self.query_factory() 不调用。
  2. 如果它一个Falsey 值(包括None),则self.query_factory()调用 then 并将其结果绑定到query
于 2012-10-26T13:59:03.757 回答
0

您可以简明扼要地说明以下行为or

如果左对象是 True-like,则返回左对象,否则返回右对象。


在这种情况下,left 对象是 false-like ( None),因此它需要调用该函数才能让 right 对象返回。

于 2012-10-26T13:57:03.430 回答