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

syntax – 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 youll run into are:

@property

@classmethod

@staticmethod

If you see an @ in the middle of a line, thats 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()

@pizza
def cheese():
    return cheese
@pizza
def sauce():
    return sauce

print pizza
# [cheese, sauce]

This shows that the function/method/class youre 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 Flask
app = 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.

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

This code snippet:

def decorator(func):
   return func

@decorator
def some_func():
    pass

Is equivalent to this code:

def decorator(func):
    return func

def some_func():
    pass

some_func = decorator(some_func)

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

Leave a Reply

Your email address will not be published. Required fields are marked *