Возвращение "я"?что это действительно делает и когда нам нужно вернуть себя - PullRequest
0 голосов
/ 30 мая 2018

Я столкнулся с кодом, который выглядит примерно так:

from contextlib import contextmanager, ContextDecorator

class makepara(ContextDecorator):
     def __enter__(self):
        print ("<p>")
        return self

     def __exit__(self, *args):
         print ("</p>")
         return False

@makepara()
def emit_data():
    print (" here is HTML code")

    emit_data()

Я нашел соответствующий ответ this , но когда я изменяю приведенный выше код на

from contextlib import contextmanager, ContextDecorator

class makepara(ContextDecorator):
    def __enter__(self):
        print ("<p>")

    def __exit__(self, *args):
        print ("</p>")

@makepara()
def emit_data():
    print (" here is HTML code")

emit_data()

нет никаких изменений в выводе, что заставляет меня задуматься, что на самом деле делает return self и как его использовать?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

return self не только полезен в операторе with, но также полезен во многих других ситуациях.

Например, когда вы открываете файл, используя:

with open("file") as f:
    ....

Функцияopen фактически возвращает объект, который реализует __enter__, и в его __enter__ он использует return self, чтобы позволить вам связать этот экземпляр с переменной f, чтобы вы могли сделать f.read или что-то еще после.

В других ситуациях, например, если вы хотите позвонить в цепочку (может быть data = a.connect().get("key").to_dict()).Вам нужно добавить return self к connect и get.

Но, в конце концов, return self - это не что иное, как возвращение нормальной переменной.

0 голосов
/ 30 мая 2018

Вы решили вернуть self (или какой-либо другой объект, но обычно это экземпляр диспетчера контекста, это self), чтобы имя могло быть связано с этим синтаксисом:

with makepara() as var:
    ...

Возвращенный объект__enter__ будет связан с именем var в контексте (и, фактически, останется связанным с var после выхода из контекста).

Если вам не нужно будет связывать какое-либо значение послевходя в контекст, можно опустить явное возвращение (в этом случае будет использоваться неявное возвращение None в любом случае), но в любом случае нет никакого вреда и никакого недостатка в возвращении self.

...