Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python/SQLAlchemy“;或;功能_Python_Sqlalchemy_Wtforms_Flask Sqlalchemy - Fatal编程技术网

Python/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)

我似乎不明白为什么“或”会这样。我正在使用SQLAlchemy和
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()