带有or语句的python表达式

时间:2018-07-03 20:00:34

标签: python

我在github链接中看到以下语句,并希望了解如何执行此条件。或的右侧表达式检查条件,而左侧则更多是附条件声明。

https://github.com/wkentaro/labelme/blob/30a29a4a9c1f355cdbd69e65a0f3aad6948f458d/labelme/canvas.py#L464

shape.fill = shape.selected or shape == self.hShape

4 个答案:

答案 0 :(得分:3)

您弄错了优先级。 1

这是一条赋值语句,其中左侧是名称shape.fill,右侧是or表达式。这不是or语句,左边是赋值,右边是比较。

换句话说,它等同于:

shape.fill = (shape.selected or shape == self.hShape)

为避免其他混乱,==or之前进行评估,因此最终等同于此:

shape.fill = (shape.selected or (shape == self.hShape))

希望您理解这意味着什么。


每个操作符,符号和关键字的隐式优先级规则 2 可以通过阅读《参考手册》中的语法(从Top-level components开始并向下遍历语句)来推断出(简单和复杂)和表达式。或者,您可以阅读Full Grammar specification以获得更简洁但解释较少的版本。

但是,由于您使用的是Python,因此您可能更喜欢通过实验而不是手册来学习。在这种情况下,请查看ast模块:

>>> import ast
>>> statement = 'shape.fill = (shape.selected or shape == self.hShape)'
>>> print(ast.dump(ast.parse(statement)), annotate_fields=False)
("Module([Assign([Attribute(Name('shape', Load()), 'fill', Store())], "
 "BoolOp(Or(), [Attribute(Name('shape', Load()), 'selected', Load()), "
 "Compare(Name('shape', Load()), [Eq()], [Attribute(Name('self', Load()), "
 "'hShape', Load())])]))])")

好的,可能很难遵循,但是有一些不错的第三方库可以更清晰地格式化树。归结为:

Module
    Assign
        Attribute
            Name('shape')
            'fill'
        BoolOp
            Or
            Attribute
                Name('shape')
                'selected'
            Compare
                Name('shape')
                Eq
                Attribute
                    Name('self')
                    'hShape'

因此,您可以看到有一个赋值(Assign),其中左侧是属性(Attribute,而右侧是or表达式({{1} }。


1。从技术上讲,没有优先级,因为BoolOp甚至不是Python中的运算符。但是用这种方法考虑起来更容易,并且只有一点点误导,希望下句话可以解决它。

2。同样,唯一的显式优先级规则是适用于运算符的规则,在您的示例中不包括=。因此,您必须弄清楚解析语句的方式,实际上是解析器执行解析的方式一样。

答案 1 :(得分:3)

在这种情况下,=是一个布尔属性,因此代码等效于此:

shape.selected

有帮助吗?

答案 2 :(得分:2)

or操作符的绑定不如您在左侧看到的=紧密。添加一些括号可以使情况更清楚:

 shape.fill = ((shape.selected) or (shape == self.hShape))

我添加的括号在语句的评估方式上没有任何改变。 or的两个参数是shape.selected(大概是bool)和表达式shape == self.hShapeor表达式的结果就是分配给shape.fill的内容。

答案 3 :(得分:1)

它正在评估与您在if语句中看到的语句相同的类型。

他们正在创建布尔并将其分配给shape.fill。大概shape.selectedTrueFalse。然后,他们将逻辑or与另一个布尔语句shape == self.hShape一起应用。

最后是

shape.fill = (boolean variable) or (boolean expression)

while评估为布尔值。