我一直使用这个习惯用法在 Python 2 中以 utf-8 标准输出一堆内容:
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
但老实说,我不知道
(sys.stdout)
在做什么。这让我想起了 Javascript 闭包之类的东西。但我不知道如何在 Python 文档中查找这个习语。
你们中的任何一个好人都可以解释这里发生了什么吗?谢谢!
.getwriter
返回一个 这个问题(非常恭敬)像
是什么意思?我见过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。这是一个粗略但准确的概括。我不确定我的解释如何改变,因为你考虑了运算符固定性,关联性,非-语法语言或预解析扩展等)
codecs.getwriter('utf-8')
返回一个具有 StreamWriter
行为的类,其对象可以用流初始化。
>>> codecs.getwriter('utf-8')
<class encodings.utf_8.StreamWriter at 0x1004b28f0>
因此,您正在做类似的事情:
sys.stdout = StreamWriter(sys.stdout)
用python灵活的双括号调用wrapper函数
例子:
funcwrapper
def funcwrapper(y):
def abc(x):
return x * y + 1
return abc
result = funcwrapper(3)(5)
print(result)
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)