0

私は次のコード条件を持っています

 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)そうでなくても、これをfalseと評価してほしい>= 3。しかし、これは起こっていません。どこかかっこが必要かもしれないと思います。ヘルプ!

4

3 に答える 3

1

andはよりも精度が高いorため、andsが最初に評価され、次に、が評価さ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、この例では)。角かっこがある場合は、希望どおりに評価されます。

于 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:

このような場合、私は過去に中間の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ステートメントと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 に答える