0

我有以下代码条件

 if len(content_tags) >= 1 or tags_irrelevant == 'yes'\
   and lengthproblem == 0\
   and guess_language.guessLanguage(testlanguage) == 'en'\
   and len(sentences) >= 3:

问题在于逻辑和语法。我希望这被评估为 false 不管是否if len(sentences)不是>= 3。但这并没有发生。我想我可能在某处需要一些括号或其他东西。帮助!

4

3 回答 3

1

and具有比 更高or的优先级,因此and首先评估 s,然后评估or,这意味着您在文本中描述的逻辑不是您在代码中描述的逻辑。

如果您希望将第or一个案例视为单个案例,请在其周围使用括号。

if (len(content_tags) >= 1 or tags_irrelevant == 'yes')\
   and lengthproblem == 0\
   and guess_language.guessLanguage(testlanguage) == 'en'\
   and len(sentences) >= 3:

也就是说,您还没有向我们详细解释您想要从中获得的逻辑行为,所以我建议您坐下来好好地解决这个问题。

如果你需要测试你的逻辑,那么使用一个简单的测试函数打印出来,这样你就知道什么时候被评估了。

>>> def test(bool):
...    print(bool)
...    return bool
... 
>>> if test(1) or test(2) and test(3) and test(4) and test(False):
...    print("Success")
... 
1
Success
>>> if (test(1) or test(2)) and test(3) and test(4) and test(False):
...     print("Success")
... 
1
3
4
False

你可以清楚地看到第一个被评估的是第一个and,然后它会尝试评估左边的 theand等等or。它尝试对此进行评估,获取True第一个值,然后短路,返回Trueand,它也短路,返回True(嗯,实际上是 1,但True出于本示例的目的)。当括号在那里时,它会以您想要的方式进行评估。

于 2012-05-17T21:51:52.427 回答
0

or部分导致您的问题。只需封装它:

if (len(content_tags) >= 1 or tags_irrelevant == 'yes')\
   and lengthproblem == 0\
   and guess_language.guessLanguage(testlanguage) == 'en'\
   and len(sentences) >= 3:

在这种情况下,我过去倾向于使用中间布尔值将最终的逻辑语句抽象到更高的层次,例如:

multi_tags = len(content_tags) >= 1
ignore_tags = tags_irrelevant == 'yes'
tags_ok = multi_tags or ignore_tags 

length_ok = lengthproblem == 0
is_english = guess_language.guessLanguage(testlanguage) == 'en'
enough_sentences = len(sentences) >= 3

# Notice how much easier the following is to read!
if tags_ok and length_ok and is_english and enough_sentences:
    pass

[这不是从博客中学到的,而是从调试可怕的、几十年前的遗留代码的痛苦中学到的,这些代码在 if 语句和 while 循环终止条件中散布着大量的条件子句。哦,反斜杠也消失了。]

于 2012-05-17T21:52:17.087 回答
0

根据python 运算符优先级规则and运算符优先于or运算符。也就是说,如果您希望len(sentences) >= 3部分主导答案,则应将其余部分隔离在括号中:

if (len(content_tags) >= 1 or tags_irrelevant == 'yes' and lengthproblem ==0 and guess_language.guessLanguage(testlanguage) =='en') and len(sentences) >= 3
于 2012-05-17T22:01:43.863 回答