¿Qué es el ‘@’ en Python? Decoradores, operaciones matriciales y uso de pandas explicados a fondo

Introducción

Al aprender Python, es probable que te encuentres con «@» (arroba) en el código. En particular, los decoradores (@staticmethod, etc.) o el operador @ utilizado en operaciones matriciales son ejemplos representativos. Sin embargo, para quienes lo ven por primera vez, puede surgir la duda de «¿qué significa este símbolo?».

En este artículo, explicaremos en detalle el rol y el uso del «@» en Python. Específicamente, introduciremos métodos de uso en decoradores, operaciones matriciales, el método query() de pandas, etc., explicándolo de manera clara y comprensible para principiantes.

¿Qué es el «@» en Python?

En Python, el «@» se utiliza principalmente como «decorador». Un decorador es un mecanismo para modificar el comportamiento de funciones o métodos. Además, desde Python 3.5 se introdujo el operador «@», que permite expresar el producto de matrices de manera concisa. Además, en el método query() de pandas hay una forma de usar «@» para referenciar variables.

A continuación, explicamos ejemplos de uso del «@» desde tres puntos de vista.

  1. Decorador (Decorator): Agrega funcionalidades específicas a funciones o clases.
  2. Operaciones matriciales (Operador @): Calcula el producto de matrices en NumPy, etc.
  3. Método query() de pandas: Referencia variables dentro de las consultas de un DataFrame.
侍エンジニア塾

¿Qué es un decorador (Decorator)?

Lo básico de los decoradores

Un decorador es un mecanismo que modifica el comportamiento de una función o método colocando «@» antes de ella. Se utiliza principalmente para los siguientes fines.

  • Registro de logs
  • Medición del tiempo de ejecución
  • Restricción del comportamiento de la función (por ejemplo, función de autenticación)

Sintaxis de los decoradores

La sintaxis básica para usar decoradores en Python es la siguiente.

def my_decorator(func):
    def wrapper():
        print("Antes de ejecutar el procesamiento")
        func()
        print("Después de ejecutar el procesamiento")
    return wrapper

@my_decorator
def my_function():
    print("La función principal se ha ejecutado")

my_function()

Resultado de ejecución de los decoradores

Antes de ejecutar el procesamiento
La función principal se ha ejecutado
Después de ejecutar el procesamiento

Ejemplos prácticos de uso de decoradores

Los decoradores también se incluyen en gran medida en la biblioteca estándar. Por ejemplo, se utiliza «@» al definir métodos de clase o métodos estáticos.

@classmethod

Al definir un método de clase, se utiliza @classmethod.

class MyClass:
    class_variable = "variable de clase"

    @classmethod
    def class_method(cls):
        return f"Se llamó al método de clase: {cls.class_variable}"

print(MyClass.class_method())

@staticmethod

Al definir un método estático, se utiliza @staticmethod.

class MyClass:
    @staticmethod
    def static_method():
        return "Se llamó al método estático"

print(MyClass.static_method())

El operador «@» en operaciones de matrices

Desde Python 3.5, @ se introdujo el operador. Esto es un operador para expresar de manera concisa el producto de matrices.

Producto de matrices usando NumPy

import numpy as np

A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

C = A @ B
print(C)

Uso de «@» en el método query() de pandas

En el método query() de pandas, se puede referenciar variables usando @.

Filtrado con variables

import pandas as pd

df = pd.DataFrame({'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 35]})
threshold = 30

# Referencia al valor de threshold
filtered_df = df.query('age > @threshold')
print(filtered_df)

Resumen

  • Los decoradores se utilizan para modificar el comportamiento de funciones o clases.
  • El operador «@» de operaciones matriciales simplifica el cálculo del producto matricial en NumPy, etc.
  • El método query() de pandas permite usar «@» para referenciar variables.

Al entender los usos de «@» y aprovecharlo adecuadamente, se puede lograr una programación en Python más eficiente.