12

私のサイトの1つで、いくつかのクラス属性が定義されていて、空ではないかどうかを確認する必要があります。これまでのところ、私は喜んで使用if self.attr:してきました。これは、私の考えでは、の省略形if self.attr is not None and self.attr is not '':、または属性の未定義の値が何であれです。

これは正常に機能しますが、複数の文字列属性をチェックすると驚くべき動作になります。(私が予想したように)で'' and ''はありませんが、 。False''

これは疑問を投げかけます:andオペレーターが型キャストを強制しない他のタイプはありboolますか?この振る舞いの違いが-clauseの実際の異なる結果を引き起こす例を思いつくことはできませんがif(結局のところ、''それでも評価されFalseます)、トラップとなる可能性のあるエッジケースがあるという直感が残ります。

最後に、なぜそれがそのように実装されたのか誰かが知っているかどうか知りたいと思いますか?Zen of Pythonは一方向と一方向のみを推奨していると思いましたが、+演算子はすでに文字列連結の直感的な方法のようです。

4

1 に答える 1

13

andブール値にタイプキャストしないでください。むしろ、式の結果をif要求します。bool()

and(および、さらに言えば)を使用orする式は、式が最初のオペランドに基づいてTrueまたはFalseに評価されないと判断できる場合に短絡し、最後に評価された値を返します。

>>> 0 and 'string'
0
>>> 1 and 'string'
'string'
>>> 'string' or 10
'string'
>>> '' or 10
10

この「副作用」は、Pythonコードでよく使用されます。ブール値を返すことに注意しnot てください。詳細については、ブール演算子に関するPythonのドキュメントを参照してください。

ドキュメントでは、、、空のコンテナなど、さまざまなタイプのまたは同等のものを構成するものについても説明していますが、他Trueのほとんどすべては。と同等です。FalseNone0''FalseTrue

カスタムクラスの場合、ブール値に影響を与えるために、.__nonzero__()メソッド(returnsTrueまたはFalse)または.__len__()メソッド(intを返します。ここで0isFalseおよびその他すべては)を定義する必要があります。そうしないと、常にデフォルトで。になります。TrueTrue

于 2012-08-07T12:49:19.257 に答える