Ir al contenido

API del Transpiler

El transpiler de PyGo convierte archivos .pgo en código Python equivalente (gen_py) y Go (gen_go) utilizando un visitor de AST de Python.

El transpiler usa el módulo ast de Python para parsear archivos .pgo en un Árbol de Sintaxis Abstracta (AST), luego recorre el árbol para generar el código de salida.

Clase base de visitor AST que maneja todos los tipos de nodos AST de Python.

from pygo.transpiler import ASTVisitor
visitor = ASTVisitor()
visitor.visit(ast.parse(source_code))

Genera código Python 1:1.

from pygo.transpiler import PyGenerator
gen = PyGenerator()
gen.visit(tree)
output = gen.get_output()

Genera mecánicamente código Go.

from pygo.transpiler import GoGenerator
gen = GoGenerator()
gen.visit(tree)
output = gen.get_output()

El transpiler soporta todos los tipos de nodos AST estándar de Python:

Tipo de Nodo Descripción Equivalente Go
Module Módulo de nivel superior package main
ClassDef Definición de clase type ... struct
FunctionDef Definición de función func ...
Assign Asignación := o =
If Condicional if ... {}
For Bucle for for ... {}
While Bucle while for ... {}
Return Instrucción return return ...
Call Llamada a función func(args)
IfExp Expresión ternaria cond ? a : b
ListComp Comprensión de listas func() []T { for ... }
DictComp Comprensión de diccionarios make(map[K]V); for ...

El transpiler mapea tipos Python a tipos Go de manera determinista:

Tipo Python / PyGo Tipo Go
str string
int int
float float64
bool bool
list[T] / Array[T] []T
dict[K, V] / Map[K, V] map[K]V
UUID uuid.UUID
Email string
DateTime time.Time
Optional[T] *T
Enum type ... int

Directivas específicas de PyGo pueden incrustarse en archivos .pgo:

Marca una clase para generación de modelo de base de datos.

@model
class User:
name: str
email: Email

Registra una función como manejador HTTP.

@route("/users")
def list_users():
return User.all()

Personaliza un campo de modelo.

@model
class User:
name: str = field(max_length=100, unique=True)
email: Email = field(index=True)
from pygo.transpiler import Transpiler
transpiler = Transpiler(
py_output_dir="./pygo_py",
go_output_dir="./pygo_go",
verbose=True
)
transpiler.process_file("app.pgo")
transpiler.process_directory("./models")

Se pueden registrar visitors AST personalizados:

from pygo.transpiler import register_visitor
@register_visitor
class CustomVisitor(ast.NodeVisitor):
def visit_Call(self, node):
# Manejo personalizado
pass

El transpiler lanza TranspilerError para sintaxis no soportada:

try:
transpiler.process_file("app.pgo")
except TranspilerError as e:
print(f"Error de transpiler en línea {e.line}: {e.message}")

El transpiler se invoca desde la CLI:

Terminal window
pygo gen-py app.pgo --output ./pygo_py
pygo gen-go app.pgo --output ./pygo_go
pygo transpile app.pgo --py-output ./pygo_py --go-output ./pygo_go