0Pricing
Python Academy · Lección

Valores predeterminados y field()

Establezca valores predeterminados y use las opciones de field()

Valores predeterminados y field() es una lección gratuita de Python Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Python Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Python Academy incluye 4 lecciones en total.

Asignar valores predeterminados a los campos

Al igual que los parámetros de una función, los campos de una dataclass pueden tener valores predeterminados. Un campo con un valor predeterminado puede omitirse al crear una instancia.

from dataclasses import dataclass

@dataclass
class Server:
    host: str
    port: int = 8080

print(Server('localhost'))
print(Server('example.com', 443))

El orden es importante

Los campos con valores predeterminados deben aparecer después de los campos sin valores predeterminados, exactamente igual que los argumentos de una función. De lo contrario, Python genera un TypeError al definir la clase.

from dataclasses import dataclass

@dataclass
class User:
    name: str       # required
    active: bool = True   # optional

print(User('Alice'))

La trampa de los valores predeterminados mutables

No puede usar directamente un objeto mutable, como una lista o un diccionario, como valor predeterminado. Todas las instancias compartirían el mismo objeto. Python lo detecta y genera un ValueError para protegerle.

from dataclasses import dataclass
from typing import List

# This raises ValueError at class definition time:
try:
    @dataclass
    class Bad:
        items: List[int] = []
except ValueError as e:
    print('Error:', e)

field(default_factory=...)

Para proporcionar un valor predeterminado mutable, use field(default_factory=...). La fábrica se llama para cada instancia nueva, de modo que cada instancia obtiene su propio objeto independiente.

from dataclasses import dataclass, field
from typing import List

@dataclass
class Cart:
    items: List[str] = field(default_factory=list)

a = Cart()
a.items.append('apple')
b = Cart()
print(a.items, b.items)

default frente a default_factory

Use field(default=...) para valores inmutables cuando también necesite otras opciones de field(). Use default_factory para cualquier valor mutable. No puede pasar ambos a la vez.

from dataclasses import dataclass, field

@dataclass
class Config:
    retries: int = field(default=3)
    tags: list = field(default_factory=list)

print(Config())

Excluir un campo de repr

La opción repr=False oculta un campo del __repr__ generado. Resulta útil para secretos o búferes internos grandes.

from dataclasses import dataclass, field

@dataclass
class Account:
    user: str
    token: str = field(repr=False, default='secret')

print(Account('alice'))

Excluir un campo de las comparaciones

Con compare=False, el __eq__ generado (y el ordenamiento) ignora un campo. Dos instancias pueden ser iguales aunque ese campo sea diferente.

from dataclasses import dataclass, field

@dataclass
class Event:
    name: str
    timestamp: float = field(compare=False, default=0.0)

print(Event('login', 1.0) == Event('login', 99.0))

Campos init=False

Establecer init=False excluye un campo de __init__. Normalmente se combina con un valor predeterminado o se establece en __post_init__.

from dataclasses import dataclass, field

@dataclass
class Circle:
    radius: float
    area: float = field(init=False, default=0.0)

c = Circle(2.0)
print(c)

__post_init__ para valores derivados

Defina __post_init__ para ejecutar código justo después del __init__ generado. Es el lugar natural para calcular campos derivados de otros.

from dataclasses import dataclass, field

@dataclass
class Circle:
    radius: float
    area: float = field(init=False, default=0.0)

    def __post_init__(self):
        self.area = 3.14159 * self.radius ** 2

print(Circle(2.0))

Almacenar metadatos

El argumento metadata asocia un mapeo arbitrario a un campo. Python lo ignora, pero las herramientas y su propio código pueden leerlo para obtener documentación o indicaciones de validación.

from dataclasses import dataclass, field, fields

@dataclass
class Product:
    price: float = field(metadata={'unit': 'USD'})

for f in fields(Product):
    print(f.name, f.metadata)

Combinar opciones de field()

Las opciones se pueden combinar. Un mismo campo puede ocultarse de repr, excluirse de las comparaciones y tener un valor predeterminado al mismo tiempo.

from dataclasses import dataclass, field

@dataclass
class Session:
    user: str
    token: str = field(default='x', repr=False, compare=False)

print(Session('alice'))
print(Session('alice') == Session('alice', token='different'))

Comprobación rápida

¿Cómo debe proporcionar a un campo de dataclass una lista vacía como valor predeterminado?

Resumen

Ha aprendido a establecer valores predeterminados y a usar las opciones de field().

  • Los campos con valores predeterminados aparecen después de los campos obligatorios.
  • Use default_factory para los valores predeterminados mutables.
  • repr, compare, init y metadata permiten ajustar cada campo.
  • __post_init__ calcula valores derivados.

Preguntas frecuentes

¿La lección «Valores predeterminados y field()» es gratis?

Sí — el texto completo de «Valores predeterminados y field()» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Python Academy, actualiza a CoddyKit PRO. El curso de Python Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Valores predeterminados y field()»?

Establezca valores predeterminados y use las opciones de field() Practicas Python Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Python Academy?

No se requiere experiencia previa. Python Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Valores predeterminados y field()»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Python Academy?

Sí. Cada lección de Python Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Definir una dataclass
  2. Valores predeterminados y field()
  3. Opciones de inmutabilidad y comparación
  4. La biblioteca attrs
← Volver a Python Academy