What does the "at" (@) symbol do in Python? What does the "at" (@) symbol do in Python? python python

What does the "at" (@) symbol do in Python?


An @ symbol at the beginning of a line is used for class, function and method decorators.

Read more here:

PEP 318: Decorators

Python Decorators

The most common Python decorators you'll run into are:

@property

@classmethod

@staticmethod

If you see an @ in the middle of a line, that's a different thing, matrix multiplication. See this answer showing the use of @ as a binary operator.


Example

class Pizza(object):    def __init__(self):        self.toppings = []    def __call__(self, topping):        # When using '@instance_of_pizza' before a function definition        # the function gets passed onto 'topping'.        self.toppings.append(topping())    def __repr__(self):        return str(self.toppings)pizza = Pizza()@pizzadef cheese():    return 'cheese'@pizzadef sauce():    return 'sauce'print pizza# ['cheese', 'sauce']

This shows that the function/method/class you're defining after a decorator is just basically passed on as an argument to the function/method immediately after the @ sign.

First sighting

The microframework Flask introduces decorators from the very beginning in the following format:

from flask import Flaskapp = Flask(__name__)@app.route("/")def hello():    return "Hello World!"

This in turn translates to:

rule      = "/"view_func = hello# They go as arguments here in 'flask/app.py'def add_url_rule(self, rule, endpoint=None, view_func=None, **options):    pass

Realizing this finally allowed me to feel at peace with Flask.


This code snippet:

def decorator(func):   return func@decoratordef some_func():    pass

Is equivalent to this code:

def decorator(func):    return funcdef some_func():    passsome_func = decorator(some_func)

In the definition of a decorator you can add some modified things that wouldn't be returned by a function normally.