Los *args
Parte de la sección Object Oriented Programming del Journey de Python de Coddy — lección 42 de 64.
El parámetro *args permite que un método acepte cualquier número de argumentos posicionales. El asterisco recopila todos los argumentos posicionales adicionales en una tupla.
Aquí hay un ejemplo de un método que utiliza *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 números 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) # 150El *args recoge todos los argumentos en una tupla:
calc.show_numbers(5, 10, 15, 20)Resultado:
Number 1: 5
Number 2: 10
Number 3: 15
Number 4: 20Combina 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")Utiliza *args en 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
- DianaTambié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) # 15Punto clave: *args recopila cualquier número de argumentos posicionales en una tupla. Úselo cuando no sepa cuántos argumentos se pasarán a un método. El nombre args es convencional; podría usar cualquier nombre después del asterisco, pero args es el estándar.
Desafío
FácilEn 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 acepte cualquier cantidad de argumentos numéricos y devuelva su suma. La función debe:
- Devolver 0 si no se proporcionan argumentos
- Imprimir "Error: All arguments must be numbers" y devolver None si se proporciona cualquier argumento que no sea numérico
El archivo number_utils.py contiene comentarios TODO detallados para guiar tu implementación. Sigue estos comentarios cuidadosamente para asegurar que tu solución cumpla con todos los requisitos.
Hoja de referencia
El parámetro *args permite que un método acepte cualquier número de argumentos posicionales. El asterisco agrupa todos los argumentos posicionales adicionales en una tupla.
Uso básico de *args:
class Calculator:
def add_numbers(self, *args):
return sum(args)
calc = Calculator()
result1 = calc.add_numbers(1, 2, 3) # 6
result2 = calc.add_numbers(10, 20, 30, 40, 50) # 150Combinar 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()
logger = Logger()
logger.log_message("INFO", "User", "logged", "in")Usar *args en métodos constructores:
class Team:
def __init__(self, team_name, *players):
self.team_name = team_name
self.players = list(players)
team = Team("Warriors", "Alice", "Bob", "Charlie")Desempaquetar argumentos al llamar a métodos:
numbers = [1, 2, 3, 4, 5]
result = calc.add_numbers(*numbers) # Desempaqueta la listaPunto clave: *args agrupa cualquier número de argumentos posicionales en una tupla. El nombre args es convencional, pero puedes usar cualquier nombre después del asterisco.
Pruébalo tú mismo
from number_utils import sum_all_numbers
# Manejador de casos de prueba exhaustivo
test_case = input()
if test_case == "basic_test":
# Probar 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":
# Probar 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":
# Probar 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":
# Probar 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":
# Probar 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":
# Probar 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":
# Probar 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":
# Probar 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":
# Probar 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":
# Probar sin argumentos
print(sum_all_numbers()) # Debería devolver 0Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Object Oriented Programming
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases vs ObjetosEl parámetro selfMétodosAtributosMétodo constructor (__init__)Resumen - Calculadora simple4Herencia
Herencia básicaLa función super()Sobrescritura de métodosHerencia múltipleOrden de resolución de métodosResumen - Jerarquía de empleados7Métodos especiales
Introducción a los métodos mágicosSobrecarga de operadoresMétodos mágicos de contenedoresRepaso - Lista personalizada10Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy2Decoradores
Introducción a los decoradoresDecorador propertyDecorador de métodos estáticosDecorador de métodos de clase5Polimorfismo
Sobreescritura de métodos revisitadaDuck TypingClases y métodos abstractosDiseño de interfacesResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaMixinsMétodos estáticos y de claseDecoradores de claseGestores de contexto11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Propiedades de clase
Variables de instancia vs de claseDecoradores de propiedadesAtributos privadosResumen - Gestor de cuentas bancarias