почему функция может вернуть саму функцию - PullRequest
2 голосов
/ 23 октября 2019

Я читаю исходный код django, и я не могу понять, что делает этот код.

def check_password(self, raw_password):
        """
        Return a boolean of whether the raw_password was correct. Handles
        hashing formats behind the scenes.
        """
        def setter(raw_password):
            self.set_password(raw_password)
            # Password hash upgrades shouldn't be considered password changes.
            self._password = None
            self.save(update_fields=["password"])
        return check_password(raw_password, self.password, setter)

почему функция возвращает сама себя, почему нет бесконечного цикла? это фрагмент кода из django / contrib / auth / base_user.py

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Они обе разные функции, даже если они имеют общее имя. Один в классе, другой нет. Также подпись отличается.

1 параметр (исключая self)

def check_password(self, raw_password):
        ...
        return check_password(raw_password, self.password, setter)

3 параметра

check_password(raw_password, self.password, setter)
0 голосов
/ 23 октября 2019

Он не вызывает ту же функцию. check_password определяется как атрибут класса AbstractBaseUser. Но если вы вызовете эту функцию, это разрешит импортированную функцию check_password модуля django.contrib.auth.hashers:

from django.contrib.auth.hashers import (
    <b>check_password</b>, is_password_usable, make_password,
)

# &hellip;

class AbstractBaseUser(models.Model):

    # &hellip;

    def check_password(self, raw_password):
        """
        Return a boolean of whether the raw_password was correct. Handles
        hashing formats behind the scenes.
        """
        def setter(raw_password):
            self.set_password(raw_password)
            # Password hash upgrades shouldn't be considered password changes.
            self._password = None
            self.save(update_fields=["password"])
        return <b>check_password</b>(raw_password, self.password, setter)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...