我有以下代码条件
if len(content_tags) >= 1 or tags_irrelevant == 'yes'\
and lengthproblem == 0\
and guess_language.guessLanguage(testlanguage) == 'en'\
and len(sentences) >= 3:
问题在于逻辑和语法。如果if len(sentences)
不是>= 3
,我希望将其评估为false。但这不会发生。我想我可能需要在某处或某些地方使用一些括号。帮助!
答案 0 :(得分:1)
and
has a higher precidence than or
,因此首先评估and
,然后评估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
,然后它会尝试评估and
的左侧,因此获得or
。它会尝试对此进行评估,获取第一个值True
,然后短路,将True
返回and
,这也会短路,返回True
(井,实际上是1,但是出于本例的目的,True
。当括号在那里时,它会以你想要的方式进行评估。
答案 1 :(得分:0)
or
部分导致您的问题。只是封装它:
if (len(content_tags) >= 1 or tags_irrelevant == 'yes')\
and lengthproblem == 0\
and guess_language.guessLanguage(testlanguage) == 'en'\
and len(sentences) >= 3:
在这种情况下,我过去倾向于使用中间bool将最终的逻辑语句抽象到更高的级别,例如:
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语句和循环终止条件中的大量条件子句。哦,反斜杠也消失了。]
答案 2 :(得分:0)
根据python operator precedence rules,和运算符优先于或运算符。也就是说,如果您希望 len(句子)> = 3 部分支配答案,您应该将其余部分隔离在括号中:
if (len(content_tags) >= 1 or tags_irrelevant == 'yes' and lengthproblem ==0 and guess_language.guessLanguage(testlanguage) =='en') and len(sentences) >= 3