El *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: 20Combina los 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
- 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 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.
Desafío
FácilEn este desafío, implementarás una función flexible de utilidad numérica.
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 proporcionan argumentos
- Imprimir "Error: All arguments must be numbers" y devolver None si se proporcionan argumentos no numéricos
- Los valores booleanos (
True/False) no cuentan como números en este caso y también deben rechazarse, aunqueboolsea una subclase deint
El archivo number_utils.py contiene comentarios detallados de TODO para guiar tu implementación. Sigue estos comentarios con atención para asegurarte de que tu solución cumpla todos los requisitos.
Pruébalo tú mismo
from number_utils import sum_all_numbers
# Gestor integral de casos de prueba
test_case = input()
if test_case == "basic_test":
# Prueba la funcionalidad básica con números 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 mostrar un 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 números enteros y de punto flotante
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 mostrar un error y devolver None
print(sum_all_numbers([1, 2, 3])) # Debería mostrar un error y devolver None
print(sum_all_numbers({"key": "value"})) # Debería mostrar un error y devolver None
print(sum_all_numbers(True)) # Debería mostrar un error y devolver None
print(sum_all_numbers(None)) # Debería mostrar un 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 mostrar un error y devolver None
print(sum_all_numbers(1, [2, 3], 4)) # Debería mostrar un error y devolver None
print(sum_all_numbers(1.5, "two", 3)) # Debería mostrar un error y devolver None
elif test_case == "empty_args_test":
# Prueba 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 Programación orientada a objetos
1Fundamentos de la POO
Introducción a la POOArchivos externosClases vs. objetosEl parámetro selfMétodosAtributosMétodo constructor (__init__)Repaso: calculadora sencilla4Herencia
Herencia básicaLa función super()Sobrescritura de métodosHerencia múltipleOrden de resolución de métodosRepaso: 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 de propiedadDecorador de método estáticoDecorador de método de clase5Polimorfismo
Repaso de la sobrescritura de métodosTipado patoClases y métodos abstractosDiseño de interfacesRepaso: calculadora de formas8Conceptos avanzados de POO
Composición frente a 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. variables de claseDecoradores de propiedadesAtributos privadosRepaso: gestor de cuentas bancariasPractica por tu cuenta: Compilador de Python online