Tipos Opcionales (Optional)
Tipos Opcionales (Optional)
Sección titulada «Tipos Opcionales (Optional)»PyGo proporciona manejo explícito de nulidad a través de la sintaxis Type?. A diferencia de None en Python, que puede ser ambiguo (¿es un valor faltante o un valor intencionalmente sin establecer?), Type? de PyGo hace la nulidad explícita, verificada en tiempo de compilación, y transpilada consistentemente tanto a Go como a Python.
Uso Básico
Sección titulada «Uso Básico»model User: name: String nickname: String? # Optional (nullable), defaults to None age: Int? # Optional (nullable), no default updated: DateTime? # Optional DateTimeOptional vs Default
Sección titulada «Optional vs Default»model User: # Este campo DEBE proporcionarse (no se permite nulo) name: String
# Este campo puede ser nulo, por defecto None nickname: String?
# Este campo puede ser nulo, debe proporcionarse explícitamente age: Int?
# Este campo tiene un valor por defecto pero NO es nulable status: String = "active"Código Generado
Sección titulada «Código Generado»Go:
type User struct { Name string // no nulable Nickname *string // puntero para nulable (Optional) Age *int // puntero para nulable (Optional) Status string // no nulable, tiene valor por defecto Updated *time.Time // puntero para DateTime nulable}Python:
from typing import Optionalfrom datetime import datetime
class User(BaseModel): name: str nickname: Optional[str] = None age: Optional[int] status: str = "active" updated: Optional[datetime] = NoneRepresentación en Base de Datos
Sección titulada «Representación en Base de Datos»CREATE TABLE user ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, nickname TEXT, -- NULL permitido (String?) age INTEGER, -- NULL permitido (Int?) status TEXT NOT NULL -- NULL no permitido (String = "active"));Optional con Tipos Complejos
Sección titulada «Optional con Tipos Complejos»model Profile: tags: Array[String]? # Arreglo opcional metadata: Map[String, String]? # Mapa opcional config: Config? # Referencia de modelo opcionalValidación
Sección titulada «Validación»Los campos Optional se validan en tiempo de compilación:
user = User(name="Alice", age=30)
# Válido — age es Int?, 30 es un Intuser.age = 31
# Válido — asignar a None siempre es válido para tipos Optionaluser.age = NoneMejores Prácticas
Sección titulada «Mejores Prácticas»- Usa
Type?explícitamente cuando un campo pueda ser nulo - Usa
Type(sin?) cuando un campo siempre debe tener un valor - Siempre proporciona valores por defecto sensatos para campos opcionales cuando sea posible
- Usa
String?en lugar deString = Nonepara claridad - Prefiere la sintaxis
?sobreOptional[T]para nuevos proyectos
Migración desde Versiones Anteriores
Sección titulada «Migración desde Versiones Anteriores»# Estilo antiguo (todavía soportado, pero no recomendado)name: Optional[String]
# Nuevo estilo (recomendado)name: String?Ambos generan el mismo código — Go *T y Python Optional[T].