函数调用中的双括号是什么意思?例如函数(foo)(bar)

问题描述 投票:0回答:3

我一直使用这个习惯用法在 Python 2 中以 utf-8 标准输出一堆内容:

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

但老实说,我不知道

(sys.stdout)
在做什么。这让我想起了 Javascript 闭包之类的东西。但我不知道如何在 Python 文档中查找这个习语。

你们中的任何一个好人都可以解释这里发生了什么吗?谢谢!

python function-call
3个回答
37
投票

.getwriter
返回一个 function 可调用对象;你只是在同一行中调用它。

这个问题(非常恭敬)像

x+y+z
是什么意思?我见过
x+y
用过,但这是什么
+z
?.

想想“操作顺序”。

例子:

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

演示:

>>> returnFunction()()
hello!

你也可以这样做:

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

也许这让这个更清楚?

>>> ( returnFunction() )()
hello!

可视化:

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

x
'('
y
')' 和大多数东西一样,是一个非终结句法表达式...与终结表达式(即无法修饰的表达式)或编译器指令(如 # pragma 或打印语句)。在数学方面,它只是一个表达式。

所以当然在 python2 中,

print print 5
会出现语法错误(因为 print 语句基本上是一个终端表达式)。然而,函数调用是非终结符表达式(可以有很多种,但这可能是一个“python 表达式”),就像它们受到启发的纯数学函数一样。您可以将“python 表达式”与运算符和语法结合起来,从而为您提供“python 表达式”,从而从小表达式构建更复杂的表达式。这是编程的本质之一。 (用任何编程语言替换上面的“python”。有些语言在定义它们的语法时将这些称为 EXPR。这是一个粗略但准确的概括。我不确定我的解释如何改变,因为你考虑了运算符固定性,关联性,非-语法语言或预解析扩展等)


7
投票

codecs.getwriter('utf-8')
返回一个具有
StreamWriter
行为的类,其对象可以用流初始化。

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

因此,您正在做类似的事情:

sys.stdout = StreamWriter(sys.stdout)

0
投票

用python灵活的双括号调用wrapper函数

例子:

  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)
    
© www.soinside.com 2019 - 2024. All rights reserved.