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: 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")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 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, aunqueboolsea una subclase deint
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 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
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 bancariasPractica por tu cuenta: Compilador de Python online