我是Python的新手,并且被Boto项目中的这段代码所困扰:
class SubdomainCallingFormat(_CallingFormat):
@assert_case_insensitive
def get_bucket_server(self, server, bucket):
return '%s.%s' % (bucket, server)
def assert_case_insensitive(f):
def wrapper(*args, **kwargs):
if len(args) == 3 and not (args[2].islower() or args[2].isalnum()):
raise BotoClientError("Bucket names cannot contain upper-case " \
"characters when using either the sub-domain or virtual " \
"hosting calling format.")
return f(*args, **kwargs)
return wrapper
Run Code Online (Sandbox Code Playgroud)
试图了解这里发生了什么.
@assert_case_sensitive?*args, **kwargs是什么意思?f代表什么?谢谢!
@符号用于表示装饰器的应用.
这些星号表示参数是放在列表/字典中的多余位置/关键字参数.
"f"表示作为第一类对象传入装饰器的函数.有人写的时候
@decorate
def whizbang(): pass
Run Code Online (Sandbox Code Playgroud)
它真的相当于
def whizbang(): pass
whizbang = decorate(whizbang)
Run Code Online (Sandbox Code Playgroud)
手册更详细,但装饰器基本上是一种用现有代码包围的现有代码片段的方法,可以在它之前和之后执行,而无需修改你正在装饰的代码.一切都具有一流功能的魔力.