Ir al contenido

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.

model User:
name: String
nickname: String? # Optional (nullable), defaults to None
age: Int? # Optional (nullable), no default
updated: DateTime? # Optional DateTime
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"

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 Optional
from datetime import datetime
class User(BaseModel):
name: str
nickname: Optional[str] = None
age: Optional[int]
status: str = "active"
updated: Optional[datetime] = None
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")
);
model Profile:
tags: Array[String]? # Arreglo opcional
metadata: Map[String, String]? # Mapa opcional
config: Config? # Referencia de modelo opcional

Los campos Optional se validan en tiempo de compilación:

user = User(name="Alice", age=30)
# Válido — age es Int?, 30 es un Int
user.age = 31
# Válido — asignar a None siempre es válido para tipos Optional
user.age = None
  • 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 de String = None para claridad
  • Prefiere la sintaxis ? sobre Optional[T] para nuevos proyectos
# 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].