What do double parentheses mean in a function call

2019-03-17 23:21发布

问题:

Original title:

"Help me understand this weird Python idiom? sys.stdout = codecs.getwriter('utf-8')(sys.stdout)"

I use this idiom all the time to print a bunch of content to standard out in utf-8 in Python 2.*:

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

But to be honest, I have no idea what the (sys.stdout) is doing. It sort of reminds me of a Javascript closure or something. But I don't know how to look up this idiom in the Python docs.

Can any of you fine folks explain what's going on here? Thanks!

回答1:

.getwriter returns a functioncallable object; you are merely calling it in the same line.

Example:

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

Demo:

>>> returnFunction()()
hello!

You could have alternatively done:

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

Visualization:

evaluation step 0: returnSomeFunction()()
evaluation step 1: |<-somefunction>-->|()
evaluation step 2: |<----result-------->|


回答2:

codecs.getwriter('utf-8') returns a class with StreamWriter behaviour and whose objects can be initialized with a stream.

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

Thus, you are doing something similar to:

sys.stdout = StreamWriter(sys.stdout)