Подтвердить что ты не робот

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

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

" Помогите мне понять эту странную идиому 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.

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

4b9b3361

Ответ 1

.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-------->|

Ответ 2

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

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

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

sys.stdout = StreamWriter(sys.stdout)

Ответ 3

Вызов функции-оболочки с двойными скобками гибкости 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)