Need help understanding some Python code with @, *args and **kwargs
<p>I'm new to Python, and stumped by this piece of code from the Boto project:</p>

<pre><code>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
</code></pre>

<p>Trying to understand what's going on here.</p>

<ol>
<li>What is the '@' symbol in <code>@assert_case_sensitive</code> ?</li>
<li>What do the args <code>*args, **kwargs</code> mean?</li>
<li>What does '<code>f</code>' represent?</li>
</ol>

<p>Thanks!</p>
