795 votes

Que fait le symbole "at" (@) en Python ?

Je regarde un code Python qui utilisait la fonction @ mais je n'ai aucune idée de ce qu'il fait. Je ne sais pas non plus ce qu'il faut rechercher car la recherche dans les documents Python ou sur Google ne donne pas de résultats pertinents lorsque le symbole @ est inclus.

451voto

FogleBird Points 23405

Un site @ en début de ligne est utilisé pour les classes, les fonctions et les méthodes. décorateurs .

Plus d'informations ici :

PEP 318 : Décorateurs

Décorateurs Python

Les décorateurs Python les plus courants que vous rencontrerez sont les suivants :

@propriété

@classmethod

@staticmethod

Si vous voyez un @ au milieu d'une ligne, c'est une autre chose, la multiplication de la matrice. Voir cette réponse montrant l'utilisation de @ comme un opérateur binaire.

75 votes

Il semble qu'il puisse également être un opérateur de multiplication de matrice : stackoverflow.com/a/21563036/5049813

0 votes

On peut aussi ajouter des @décorateurs

0 votes

Ce sont des informations utiles, merci ! J'ai réussi à travailler @ avec ma propre variable définie dans df.query() .

413voto

Morgan Wilde Points 2648

Exemple

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']

Cela montre que le function / method / class que vous définissez après un décorateur est simplement transmis comme un argument à la function / method immédiatement après le @ signe.

Première observation

Le micro-cadre Flacon présente décorateurs depuis le tout début dans le format suivant :

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

Cela se traduit à son tour par :

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

Réaliser cela m'a finalement permis de me sentir en paix avec Flask.

13 votes

Dans le cas de Flasks app.route("/") cette fonction renvoie une fonction, que vous invoquez avec votre hello() comme argument

6 votes

Quel est l'avantage syntaxique ou pratique d'avoir des décorateurs ici, au lieu de (par exemple) simplement appeler quelque chose comme app.route("/", hello) immédiatement après avoir défini hello ou encore de définir hello comme un lambda dans les arguments de app.route ? (Ce dernier exemple est courant avec Node.js. http.Server et les voies express).

242voto

Matheus Araujo Points 141

Cet extrait de code :

def decorator(func):
   return func

@decorator
def some_func():
    pass

est équivalent à ce code :

def decorator(func):
    return func

def some_func():
    pass

some_func = decorator(some_func)

Dans la définition d'un décorateur, vous pouvez ajouter des éléments modifiés qui ne seraient pas renvoyés par une fonction normale.

4 votes

Dans cette ligne s "ome_func = decorator(some_func)", le premier some_func est une variable = à la fonction some_func, correct ?

1 votes

@Viragos vous définissez le nom some_func égale à une fonction donnée par decorator(some_func) . Donc les deux some_func Les instances sont des fonctions, la première est juste enregistrée comme la version décorée.

5voto

Peter Rowell Points 12444

Cela indique que vous utilisez un décorateur. Voici L'exemple de Bruce Eckel de 2008.

2voto

xavierds Points 26

Quand j'ai commencé à répondre, je n'ai pas vu la première réponse, c'est exactement ce dont vous avez besoin, respectueusement en java est un concept différent et comme vous pouvez le lire par exemple ici. java, tutoriel sur les annotations

En java, il s'agit d'une annotation et, comme vous pouvez le lire, son utilisation est complètement différente de celle de python, désolé pour le problème.

Edit : Post original et comme dit dans les commentaires j'ai fait une erreur avec l'option que j'ai choisi. C'est un décorateur comme dans le langage Java que vous utilisez pour la déclaration et l'utilisation de méthodes abstraites. La différence est qu'en Python la méthode abstraite peut avoir une implémentation.

Définition tirée de docs.python.org

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X