如何强制所有“或”

时间:2016-04-06 07:38:26

标签: python

由于“短路运算符”,如果第一个参数为False,Python只会计算第二个参数。

我有这样的功能:

def calcule_deplacements_possibles(self, y, x, idx, pp):
    idp = pp['id']
    if pp['piece'] == 'abeille':
        o = False
        o = self.glissement_test(y, x, -2, 0, -1, -1, -1, +1, idp) or o
        o = self.glissement_test(y, x, -1, +1, -2, 0, +1, +1, idp) or o
        o = self.glissement_test(y, x, +1, +1, -1, +1, +2, 0, idp) or o
        o = self.glissement_test(y, x, +2, 0, +1, +1, +1, -1, idp) or o
        o = self.glissement_test(y, x, +1, -1, +2, 0, -1, -1, idp) or o
        o = self.glissement_test(y, x, -1, -1, +1, -1, -2, 0, idp) or o
        if o:
            self.board[y][x]['b'][idx]['m'] = True

这是六边形类型的单元格,因此我需要尝试所有这些单元格,因为glissement_test()会添加一些标记,因此它会始终被调用(此处为6次)。

如何“强制”这些调用并使用我的代码中的结果?

3 个答案:

答案 0 :(得分:3)

循环浏览您要使用的每组值,然后查看它们是否全部发生:

tests = [self.glissement_test(y, x, *vals, idp) for vals in ((-2, 0, -1, -1, -1, 1),
                                                             (-1, 1, -2, 0, 1, 1),
                                                             (1, 1, -1, 1, 2, 0),
                                                             (2, 0, 1, 1, 1, -1),
                                                             (1, -1, 2, 0, -1, -1),
                                                             (-1, -1, 1, -1, -2, 0))]

if any(tests):
    self.board[y][x]['b'][idx]['m'] = True

请注意,默认情况下整数文字为正数,因此您无需指定例如: +1获得积极的一面。

答案 1 :(得分:0)

据我所知,没有办法在Python中关闭短路(也没有无短路的操作员)。

条件中的代码不应该""做"无论如何,因此大多数语言中的短路惯例。

首先计算self.glissement_test 的结果,将其分配给变量,然后选中<that variable> or o

答案 2 :(得分:0)

如果glissement_test()以某种方式改变self的状态,请不要在条件中使用它。它会使阅读代码的人感到困惑,并使你的意图不明确。

显式调用所有值,然后运行检查:

t1 = self.glissement_test(y, x, -2, 0, -1, -1, -1, +1, idp)
t2 = self.glissement_test(y, x, -1, +1, -2, 0, +1, +1, idp)
t3 = self.glissement_test(y, x, +1, +1, -1, +1, +2, 0, idp)
t4 = self.glissement_test(y, x, +2, 0, +1, +1, +1, -1, idp)
t5 = self.glissement_test(y, x, +1, -1, +2, 0, -1, -1, idp)
t6 = self.glissement_test(y, x, -1, -1, +1, -1, -2, 0, idp)

# Now do the check
if t1 or t2 or t3 or t4 or t5 or t6:
    self.board[y][x]['b'][idx]['m'] = True