10

私は、次の python コードと、著者がリターンで「AND」ステートメントを使用した理由をよりよく理解しようとしています。

def valid_password(self, password):
        PASS_RE = re.compile(r'^.{6,128}$')
        return password and PASS_RE.match(password)

さらにコードを下に...

if not self.valid_password(self.password):
    params['error_password'] = "Please enter a valid password."

呼び出し元に返される結果のオブジェクトを調べてみましたが、それがどのように機能するかはまだ完全にはわかりません。

これはパスワードを呼び出し元に返し、パスワードが有効かどうかのブール値を返すようですが、呼び出し元の関数がオブジェクトのブール値をチェックする方法がわかりませんか? これは私が見逃したPythonの基本的なことですか?

これの隣に同様の使用例がありますが、それは「または」ステートメントを使用しているため、さらに混乱します。

def valid_email(self, email):
    EMAIL_RE  = re.compile(r'^[\S]+@[\S]+\.[\S]+$')
    return not email or EMAIL_RE.match(email)

ここで何が起こっているのかについてのアドバイスをいただければ幸いです。コードは機能し、期待どおりの動作を行い、正規表現に対して入力を検証し、True または False を返しますが、単純に bool を返すのではなく、このように記述されていることを本当に理解したいと思います。

4

3 に答える 3

16

Python では、andとの両方orがオペランドの 1 つを返します。を使用orすると、Python は最初のオペランドをチェックし、それが「真の」値である場合 (真偽については後で詳しく説明します)、2 番目の値をチェックせずに最初の値を返します (これはブール ショートカット評価と呼ばれ、重要な場合があります)。最初のオペランドが「falsey」の場合、Python はそれが何であれ、2 番目のオペランドを返します。

Python 2.7.3 (default, Jan  2 2013, 13:56:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 2 or 3
2
>>> 0 or 3
3

"and" を使用しても、ほぼ同じことが起こります。最初のオペランドが最初にチェックされ、それが "falsey" の場合、Python は 2 番目のオペランドをチェックしません。最初のオペランドが「真」の場合、Python はそれが何であれ、2 番目のオペランドを返します。

>>> 2 and 3
3
>>> 0 and 3
0
>>> 3 and 0
0
>>> 3 and []
[]
>>> 0 and []
0

ここで、「真実」と「虚偽」について話しましょう。Python は、ブール コンテキストで物事を評価するために次の規則を使用します。

  • 次の値は「falsey」です: False、None、0 (ゼロ)、[] (空のリスト)、() (空のタプル)、{} (空の辞書)、空のセット、"" (空のリスト)ストリング)
  • それ以外は「真実」

password and PASS_RE.match(password)そのため、Python の短絡評価を利用しているようなものです。passwordが None の場合、and演算子は単に None を返し、後半を評価しません。PASS_RE.match(None)例外がスローされるため、これは良いことです。これを見て:

>>> 3 or []
3
>>> [] or 3
3
>>> 0 or []
[]
>>> [] or 0
0
>>> 0 and []
0
>>> [] and 0
[]

短絡がどのように機能するかを参照してください。これを見てください:

>>> value = "hello"
>>> print (value.upper())
HELLO
>>> print (value and value.upper())
HELLO
>>> value = None
>>> print (value.upper())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'upper'
>>> print (value and value.upper())
None

の短絡機能がandトレースバックの回避にどのように役立ったかがわかりますか? それがこの関数で行われていることです。

于 2013-06-25T03:23:43.210 に答える
7

問題の行は、パスワードが「真実」であり、事前定義されたパスワードの正規表現と一致することを確認します。

分解方法は次のとおりです。

  • 関数は'falsey' のpassword場合に戻ります。password

  • パスワードが「真実」であるが、パスワードがパスワードの正規表現と一致しない場合、関数は を返しますNone

  • 「真実の」パスワードがあり、それが正規表現と一致する場合、一致オブジェクトが返されます。

演算子は「and短絡」演算子です。最初の値が「真実」の場合、2 番目の値を返します。それ以外の場合は、最初の値を返します。

このページをチェックアウトして、python で「真実」となるものの種類を確認できます。

于 2013-06-25T03:01:42.677 に答える