Estoy tratando de usar una función con un parámetro de namedTuple que tiene valores predeterminados. Intenté esto. ¿Es eso posible de alguna manera?
from typing import Optional, NamedTuple Stats = NamedTuple("Stats", [("min", Optional[int]), ("max", Optional[int])]) def print(value1: Stats=None, value2: Stats=None): print("min: ", value1.min) print("max: ", value1.max) print()
Cambie el nombre de su función print()
, primero está usando el nombre de la función incorporada print
que es de mal estilo, en segundo lugar, luego realiza una llamada recursiva a print()
dentro print()
(y estoy seguro de que tenía la intención de llamar al print()
dentro del cuerpo de la función).
En segundo lugar, use la clase collection.namedtuple
para implementar el tipo real de tupla, como sigue:
Tampoco se necesitan anotaciones de tipo.
from collections import namedtuple StatsTup = namedtuple('Stats', ['min', 'max'], defaults = [3, 7]) def printf(value1 = StatsTup(), value2 = StatsTup(max = 10)): print("min1: ", value1.min) print("max1: ", value1.max) print("min2: ", value2.min) print("max2: ", value2.max) printf() printf(StatsTup(12, 14), StatsTup(16, 18))
Producción:
min1: 3 max1: 7 min2: 3 max2: 10 min1: 12 max1: 14 min2: 16 max2: 18
Como puede ver en el código y la salida anterior, paso la tupla nombrada como parámetros predeterminados para la función. Puede omitir los valores de los campos de tupla si proporciona defaults = [...]
como hice yo. Si proporciona dichos valores predeterminados, es posible que no proporcione valores para la tupla como StatsTup()
o algunos valores como StatsTup(max = 123)
o todos los valores como StatsTup(min = 20, max = 35)
.
La solución anterior solo funciona a partir de Python 3.7
, para versiones anteriores de Python, haga lo siguiente:
from collections import namedtuple StatsTup = namedtuple('Stats', 'min max') StatsTup.__new__.__defaults__ = (3, 7) def printf(value1 = StatsTup(), value2 = StatsTup(max = 10)): print("min1: ", value1.min) print("max1: ", value1.max) print("min2: ", value2.min) print("max2: ", value2.max) printf() printf(StatsTup(12, 14), StatsTup(16, 18))