3

evalPythonで熱心にブール式を評価する方法はありますか?

これを見てみましょう:

>>> x = 3
>>> 5 < x < y
False

うわぁ!yの値に関係なくこれはfalseになるため、これは非常に便利です。問題は、y未定義でさえあり得るということです、そして私はその例外を取得したいと思います。事前に結果を知っている場合でも、Pythonにすべての式を評価させるにはどうすればよいですか?

私が自分自身を明確にしたことを願っています!ありがとう、
マヌエル

編集:式は変更してはならず、評価手法だけを変更してはならないことに注意してください。

4

6 に答える 6

6
(5 < x) & (x < y)

ビットアンド演算子を使用することにより、(、、チェーニング、/で&得られるように)短絡動作は発生しません。短絡は通常望ましいと考えられていますが(高速&c)、本当に必要な場合は短絡なしで行うのは難しくありません;-)。andorallany

于 2010-02-16T06:23:49.103 に答える
5
all([5 < x, x < y])
于 2010-02-16T06:21:06.410 に答える
5

最も自然な方法は、前の行の式を評価することでしょう。

a = foo()
b = bar()
if a and b:
    ...

hide のようなソリューションall([5 < x, x < y])は、副作用が重要であることを隠し、bitwise と ( ) を使用するソリューションは巧妙で誤用のように見えるため、これらはどちらも、評価を強制していることを明らかにするためにコード内にコメントを必要&し、コードを読んでいる人々に考えさせます。彼は考えていましたか?. 重要な計算を独自の行に配置することは、微妙で一見醜いコード内にそれらを隠すよりも理にかなっています。

私の解決策はNameErrorifbが存在しない (つまり、タイプミスがある) ことを防げずa、誤りですが、これは、コードを読んで、必要に応じてバグファインダーを使用することで把握できるはずです。

于 2010-02-16T06:33:34.603 に答える
3
>>> x = 3
>>> y> x> 5
トレースバック(最後の最後の呼び出し):
  ファイル""、1行目、
NameError:名前'y'が定義されていません
于 2010-02-16T06:23:59.257 に答える
2

排除したいプログラマーエラーの可能性だけの場合、式を熱心に評価してもあまり効果はありません。たとえば、x or y()代わりに誤って実行したx() or y() ことは検出されません。おそらく、あなたは実際にpylint、pyflakes、pycheckerのようなツール探します

于 2010-02-16T06:51:44.180 に答える
1

ユーザーからステートメントを受け取り、独自のセマンティクスでステートメントを実行する場合は、などのツールを使用して自分で解析する必要がありますpyparsing。あなたの真ん中で他の誰かのコードを評価し、その結果をあなたの結果と混ぜ合わせるのは面倒で安全ではなく、Pythonコードのように見えるがセマンティクスが異なるものを評価するのは混乱します。

于 2010-02-16T17:46:36.467 に答える