需要帮助理解一些使用@,*args和**kwargs的Python代码

Yar*_*rin 3 python

我是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)

试图了解这里发生了什么.

  1. 什么是'@'符号@assert_case_sensitive
  2. args *args, **kwargs是什么意思?
  3. 什么f代表什么?

谢谢!

hao*_*hao 6

@符号用于表示装饰器的应用.

这些星号表示参数是放在列表/字典中的多余位置/关键字参数.

"f"表示作为第一类对象传入装饰器的函数.有人写的时候

@decorate
def whizbang(): pass
Run Code Online (Sandbox Code Playgroud)

它真的相当于

def whizbang(): pass
whizbang = decorate(whizbang)
Run Code Online (Sandbox Code Playgroud)

手册更详细,但装饰器基本上是一种用现有代码包围的现有代码片段的方法,可以在它之前和之后执行,而无需修改你正在装饰的代码.一切都具有一流功能的魔力.