我在github链接中看到以下语句,并希望了解如何执行此条件。或的右侧表达式检查条件,而左侧则更多是附条件声明。
shape.fill = shape.selected or shape == self.hShape
答案 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.hShape
。 or
表达式的结果就是分配给shape.fill
的内容。
答案 3 :(得分:1)
它正在评估与您在if
语句中看到的语句相同的类型。
他们正在创建布尔并将其分配给shape.fill
。大概shape.selected
是True
或False
。然后,他们将逻辑or
与另一个布尔语句shape == self.hShape
一起应用。
最后是
shape.fill = (boolean variable) or (boolean expression)
while评估为布尔值。