Что означает «если я не есть None» в методе? - PullRequest
2 голосов
/ 09 апреля 2020
class omnimethod(object):
    def __init__(self, func):
        self.func = func

    def __get__(self, instance, owner):
        return functools.partial(self.func, instance)

class Geocoder(object):
        def __init__(self, api_key=None, client_id=None, private_key=None):
            # omitted
            pass

        @omnimethod
        def geocode(
            self,
            address,
            sensor='false',
            bounds='',
            region='',
            language='',
            components=''):
                if self is not None:  # <-- here
                    return GeocoderResult(self.get_data(params=params))
                else:
                    return GeocoderResult(Geocoder.get_data(params=params))

Именно в этом случае.

Я не понял. Что означает этот фрагмент кода «если я не есть None»? Какое его место в деле? Это само является параметром, в параметре функции. Но в одиночку.

1 Ответ

1 голос
/ 09 апреля 2020

omnimethod выглядит как декоратор, предназначенный для функции, к которой он применяется, для вызова в качестве экземпляра или метода класса.

Давайте назовем исходную функцию original и результат применения декоратор, который становится атрибутом geocode класса Geocoder, decorated.

. Рассмотрим два вызова:

Geocoder.geocode("some address")  # 1
geocoder = Geocoder()
geocoder.geocode("some address")  # 2

В соответствии с протоколом дескриптора :

Вызов (1) преобразуется в:

  • decorated.__get__(None, Geocoder)("some address"), что возвращает исходную функцию, частично примененную к None:
  • functools.partial(original, None)("some address"), который, согласно реализации partial, совпадает с:
  • original(None, "some address")

Вызов (2) будет разрешен в:

  • decorated.__get__(geocoder, Geocoder)("some address") (где geocoder является экземпляром Geocoder)
  • functools.partial(original, geocoder)("some address")
  • original(geocoder, "some address")

Таким образом, self будет быть None внутри исходной функции, если она вызывается как метод класса, что требует проверки.

...