Menu
Coddy logo textTech

Los *args

Parte de la sección Programación orientada a objetos del Journey de Python de Coddy. Lección 42 de 64.

El parámetro *args permite que un método acepte cualquier cantidad de argumentos posicionales. El asterisco recopila todos los argumentos posicionales adicionales en una tupla.

Aquí tienes un ejemplo de un método que usa *args:

class Calculator:
    def add_numbers(self, *args):
        return sum(args)
    
    def show_numbers(self, *args):
        for i, num in enumerate(args):
            print(f"Number {i+1}: {num}")

Llama al método con diferentes cantidades de argumentos:

calc = Calculator()
result1 = calc.add_numbers(1, 2, 3)
result2 = calc.add_numbers(10, 20, 30, 40, 50)
print(result1)  # 6
print(result2)  # 150

*args recopila todos los argumentos en una tupla:

calc.show_numbers(5, 10, 15, 20)

Salida:

Number 1: 5
Number 2: 10
Number 3: 15
Number 4: 20

Combina parámetros regulares con *args:

class Logger:
    def log_message(self, level, *messages):
        print(f"[{level}]", end=" ")
        for message in messages:
            print(message, end=" ")
        print()  # Nueva línea

logger = Logger()
logger.log_message("INFO", "User", "logged", "in")
logger.log_message("ERROR", "Connection", "failed")

Usa *args en los métodos constructores:

class Team:
    def __init__(self, team_name, *players):
        self.team_name = team_name
        self.players = list(players)
    
    def show_team(self):
        print(f"Team: {self.team_name}")
        for player in self.players:
            print(f"- {player}")

team = Team("Warriors", "Alice", "Bob", "Charlie", "Diana")
team.show_team()

Salida:

6
150
Number 1: 5
Number 2: 10
Number 3: 15
Number 4: 20
[INFO] User logged in 
[ERROR] Connection failed 
Team: Warriors
- Alice
- Bob
- Charlie
- Diana

También puedes desempaquetar argumentos al llamar a métodos:

numbers = [1, 2, 3, 4, 5]
result = calc.add_numbers(*numbers)  # Desempaqueta la lista
print(result)  # 15

Punto clave: *args recopila cualquier cantidad de argumentos posicionales en una tupla. Úsalo cuando no sepas cuántos argumentos se pasarán a un método. El nombre args es convencional: podrías usar cualquier nombre después del asterisco, pero args es el estándar.

challenge icon

Desafío

Fácil

En este desafío, implementarás una función de utilidad numérica flexible.

Edita el archivo number_utils.py para implementar la función sum_all_numbers, que acepta cualquier cantidad de argumentos numéricos y devuelve su suma. La función debe:

  • Devolver 0 si no se proporciona ningún argumento
  • Imprimir "Error: All arguments must be numbers" y devolver None si se proporciona algún argumento no numérico
  • Los booleanos (True / False) no cuentan como números aquí y también deben rechazarse, aunque bool sea una subclase de int

El archivo number_utils.py contiene comentarios detallados de TODO para guiar tu implementación. Sigue estos comentarios cuidadosamente para asegurarte de que tu solución cumpla todos los requisitos.

Pruébalo tú mismo

from number_utils import sum_all_numbers

# Manejador integral de casos de prueba
test_case = input()

if test_case == "basic_test":
    # Prueba la funcionalidad básica con enteros positivos
    print(sum_all_numbers(1, 2, 3))  # Debería devolver 6
    print(sum_all_numbers())  # Debería devolver 0
    print(sum_all_numbers(10, 20, 30, 40))  # Debería devolver 100
    print(sum_all_numbers(1, 2, "three"))  # Debería imprimir error y devolver None

elif test_case == "float_test":
    # Prueba con números de punto flotante
    print(sum_all_numbers(1.1, 2.2, 3.3))  # Debería devolver 6.6
    print(sum_all_numbers(5.5, 5.0))  # Debería devolver 10.5

elif test_case == "mixed_numbers_test":
    # Prueba con una mezcla de enteros y flotantes
    print(sum_all_numbers(5, 5.5))  # Debería devolver 10.5
    print(sum_all_numbers(10, 20.5, 30, 40))  # Debería devolver 100.5

elif test_case == "zero_values_test":
    # Prueba con valores cero
    print(sum_all_numbers(0, 0, 0))  # Debería devolver 0
    print(sum_all_numbers(0))  # Debería devolver 0
    print(sum_all_numbers())  # Debería devolver 0

elif test_case == "negative_values_test":
    # Prueba con valores negativos
    print(sum_all_numbers(-1, -2, -3))  # Debería devolver -6
    print(sum_all_numbers(-5, -5))  # Debería devolver -10
    print(sum_all_numbers(-5, 5))  # Debería devolver 0

elif test_case == "large_values_test":
    # Prueba con valores muy grandes
    print(sum_all_numbers(1000000000, 1000000000))  # Debería devolver 2000000000
    print(sum_all_numbers(1000000000, 2000000000.5))  # Debería devolver 3000000000.5

elif test_case == "single_value_test":
    # Prueba con un solo valor
    print(sum_all_numbers(5))  # Debería devolver 5
    print(sum_all_numbers(-10))  # Debería devolver -10
    print(sum_all_numbers(3.5))  # Debería devolver 3.5

elif test_case == "error_handling_test":
    # Prueba con varios valores no numéricos
    print(sum_all_numbers("string"))  # Debería imprimir error y devolver None
    print(sum_all_numbers([1, 2, 3]))  # Debería imprimir error y devolver None
    print(sum_all_numbers({"key": "value"}))  # Debería imprimir error y devolver None
    print(sum_all_numbers(True))  # Debería imprimir error y devolver None
    print(sum_all_numbers(None))  # Debería imprimir error y devolver None

elif test_case == "mixed_valid_invalid_test":
    # Prueba con una mezcla de valores válidos e inválidos
    print(sum_all_numbers(1, 2, "three"))  # Debería imprimir error y devolver None
    print(sum_all_numbers(1, [2, 3], 4))  # Debería imprimir error y devolver None
    print(sum_all_numbers(1.5, "two", 3))  # Debería imprimir error y devolver None

elif test_case == "empty_args_test":
    # Prueba sin argumentos
    print(sum_all_numbers())  # Debería devolver 0
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de Python online