原标题:
“帮助我理解这个奇怪的Python习惯用法?
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
”
我一直用这个习惯用法在Python 2的utf-8中打印出一堆标准的内容。*:
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
但说实话,我不知道(sys.stdout)
正在做什么。它让我想起了一个Javascript闭包或其他东西。但我不知道如何在Python文档中查找这个习语。
你们这些优秀的人能解释这里发生了什么吗?谢谢!
答案 0 :(得分:27)
.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-------->|
答案 1 :(得分:5)
codecs.getwriter('utf-8')
返回一个行为为StreamWriter
的类,其对象可以使用流初始化。
>>> codecs.getwriter('utf-8')
<class encodings.utf_8.StreamWriter at 0x1004b28f0>
因此,您正在做类似的事情:
sys.stdout = StreamWriter(sys.stdout)
答案 2 :(得分:0)
使用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)