Что означают двойные скобки в вызове функции? например FUNC (материал) (материал)? - PullRequest
19 голосов
/ 25 июня 2011

Оригинальное название:

" Помогите мне понять эту странную идиому Python? sys.stdout = codecs.getwriter('utf-8')(sys.stdout)"

Я все время использую эту идиомувывести стандартную часть содержимого в utf-8 в Python 2. *:

sys.stdout = codecs.getwriter('utf-8')(sys.stdout)

Но, если честно, я понятия не имею, что делает (sys.stdout).Это напоминает мне закрытие Javascript или что-то в этом роде.Но я не знаю, как найти эту идиому в документации по Python.

Может кто-нибудь из вас, замечательные люди, объяснить, что здесь происходит?Спасибо!

Ответы [ 3 ]

28 голосов
/ 25 июня 2011

.getwriter возвращает функцию вызываемый объект; Вы просто называете это в той же строке.

Пример:

def returnFunction():
    def myFunction():
        print('hello!')
    return myFunction

Демо-версия:

>>> returnFunction()()
hello!

Вы могли бы сделать альтернативно:

>>> result = returnFunction()
>>> result()
hello!

Визуализация:

evaluation step 0: returnSomeFunction()()
evaluation step 1: |<-somefunction>-->|()
evaluation step 2: |<----result-------->|
5 голосов
/ 25 июня 2011

codecs.getwriter('utf-8') возвращает класс с поведением StreamWriter, чьи объекты могут быть инициализированы потоком.

>>> codecs.getwriter('utf-8')
<class encodings.utf_8.StreamWriter at 0x1004b28f0>

Таким образом, вы делаете что-то похожее на:

sys.stdout = StreamWriter(sys.stdout)
0 голосов
/ 30 апреля 2019

Вызов функции-оболочки с двойными скобками гибкости Python.

Пример

1- funcWrapper

def funcwrapper(y):
    def abc(x):
        return x * y + 1
    return abc

result = funcwrapper(3)(5)
print(result)

2- funcWrapper

def xyz(z):
    return z + 1

def funcwrapper(y):
    def abc(x):
        return x * y + 1
    return abc

result = funcwrapper(3)(xyz(4))
print(result)
...