我的问题可以通过简单的是或否回答:
是的,italic's"封闭样式"是编写python闭包的更好方法 - 换句话说 - italic's"封闭符号"不会破坏并且没有任何警告
不,italic关闭是有问题的,bold"封闭符号"是唯一的方法
为了以防万一,如果有人想知道"这件事是什么",那么为什么"他"不使用标准封口 - 标准形式,它让我想要逃跑.
def example():
# The standard X_x closure...
#
def bold(predecessor):
def successor():
return "<bold/>" + predecessor() + "</bold>"
return successor
# ...this looks sooo much better ^.^
#
def italic(predecessor):
x = predecessor
def successor():
return "<italic/>" + x() + "</italic>"
return successor
def underline(predecessor):
x = predecessor
def successor():
return "<underline/>" + x() + "</underline>"
return successor
@italic
@bold
@underline
def trademark():
return "This trademark cant be changed."
print(trademark())
#example() prints <italic/><bold/><underline/>This trademark cant be changed.</underline></bold</italic>
Run Code Online (Sandbox Code Playgroud)
当然,你可以这样做:
def italic(predecessor):
x = predecessor
def successor():
return "<italic/>" + x() + "</italic>"
return successor
Run Code Online (Sandbox Code Playgroud)
就像你能做的那样:
def italic(predecessor):
x = predecessor
x2 = x
def successor():
return "<italic/>" + x2() + "</italic>"
return successor
Run Code Online (Sandbox Code Playgroud)
要么
def italic(predecessor):
x = predecessor
x2 = x
x3 = x2
def successor():
return "<italic/>" + x3() + "</italic>"
return successor
Run Code Online (Sandbox Code Playgroud)
但你为什么要这样做?
编写装饰器的最佳方法是functools.wraps:
from functools import wraps
def italic(f):
@wraps(f)
def decorated():
return "<italic/>" + f() + "</italic>"
return decorated
Run Code Online (Sandbox Code Playgroud)
但如果你真的想要与众不同:
import functools
def italic(f):
return functools.update_wrapper(lambda: "<italic/>" + f() + "</italic>", f)
Run Code Online (Sandbox Code Playgroud)