Python/SQLAlchemy“;或;功能
我似乎不明白为什么“或”会这样。我正在使用SQLAlchemy和Python/SQLAlchemy“;或;功能,python,sqlalchemy,wtforms,flask-sqlalchemy,Python,Sqlalchemy,Wtforms,Flask Sqlalchemy,我似乎不明白为什么“或”会这样。我正在使用SQLAlchemy和WTForms.ext.SQLAlchemy.QuerySelectField和QuerySelectField可以设置query\u工厂,但是如果缺少它,应该返回到字段query方法: e、 g 您还可以设置query\u factory参数,如下所示: class Form1(Form): fielda = QuerySelectField('Field A', query_factory=somefunction)
WTForms.ext.SQLAlchemy.QuerySelectField
和QuerySelectField
可以设置query\u工厂
,但是如果缺少它,应该返回到字段query
方法:
e、 g
您还可以设置query\u factory
参数,如下所示:
class Form1(Form):
fielda = QuerySelectField('Field A', query_factory=somefunction)
然后在其他地方使用如下形式:
form = Form1(request.form)
form.fielda.query = MyObjects.query.all()
我看到的是,如果MyObjects.query.all()
返回一个空列表,我在QuerySelectField\u get\u object\u list()方法的这一行上得到一个NoneType not callable
异常:
基本上,无论self.query
的值是多少,或
仍然在调用self.query\u factory()
,即使它被分配到None
所以,我的问题是,这是
或的预期行为吗?它似乎会计算这两个值,然后决定如果第一个值为None
,是否需要使用第二个值。这是否正确?您可以简明扼要地将或的行为表述为:
如果左对象为True like,则返回左对象,否则返回右对象
在这种情况下,left对象是false,比如(None
),因此它需要调用该函数才能让right对象返回。或
短路。这意味着
query = self.query or self.query_factory()
评估结果如下:
检查self.query
的计算结果是否为False
。如果不是,则self.query
引用的对象绑定到query
<在这种情况下,不调用code>self.query\u factory()
如果它是False
y值(包括None
),则调用self.query\u factory()
,并将其结果绑定到query
这是正确的,在布尔上下文中没有一个是错误的。如果self.query为None,则该值由self.query\u factory()确定
实际上,如果左侧的对象为false,则会将对象返回右侧。例如:0或“
返回”
和0或'a'
返回'a'
。您确定是或在这里调用self.query\u factory()
?你确定没有其他东西在调用self.query\u factory()
?我在测试中没有看到这一点。当我运行它时,无论self.query的值是多少(None或正值),self.query\u factory()总是被计算的。那么,肯定还有其他东西在调用该方法。尝试def test():打印“Bzzt!”
,然后执行1或test()
vs.0或test()
或None或test()
。
query = self.query or self.query_factory()
query = self.query or self.query_factory()