Saltar a contenido

Anotaciones

La API de una extensión vcraft es un fichero fuente V. Marcas con anotaciones @[vc_*] las declaraciones que Python debe ver; el generador las lee de la fuente y escribe el pegamento, los stubs de tipos y el módulo.

module my_extension_native

import vcraft

// greet devuelve un saludo para `name`.
//
// El comentario de documentación pasa a ser el `__doc__` de Python.
@[vc_fn]
pub fn greet(name string) string {
    return 'Hello, ${name}!'
}

// Counter es una clase. Los campos son escalares y pasan a ser atributos de
// lectura/escritura; los métodos son métodos; una propiedad es un atributo de
// sólo lectura.
@[vc_class]
pub struct Counter {
mut:
    @[vc_field] value int
    @[vc_field] step  int
}

// new_counter es el constructor. Se crea una instancia llamando al tipo.
@[vc_fn]
pub fn new_counter() &Counter {
    return &Counter{ step: 1 }
}

// increment suma step a value y devuelve el total nuevo.
@[vc_method]
pub fn (mut c Counter) increment() int {
    c.value += c.step
    return c.value
}

Cómo funcionan los nombres

Los nombres en Python se toman de la declaración V, tal cual. El receptor de un método declara la clase a la que pertenece, y new_<clase> es el constructor. Los comentarios de documentación pasan a __doc__, la firma marshalizada a __text_signature__, y la misma fuente produce un stub .pyi, así que help() y un type checker ven lo mismo.

El vocabulario de un vistazo

Anotación Aplica a Efecto
@[vc_fn] pub fn Exporta la función como un callable de módulo
@[vc_class] pub struct Crea un tipo Python respaldado por el struct V
@[vc_method] métodos Añade el método a la clase de su receptor
@[vc_field] campos Expone el campo como atributo
@[vc_property] métodos Registra el método como property
@[vc_static] métodos Registra el método como staticmethod
@[vc_classmethod] métodos Registra el método como classmethod
@[vc_base] pub struct Hereda de la clase indicada
@[vc_ref] campos Una referencia fuerte a otra instancia
@[vc_buffer] campos Un []T nativo persistente de escalares
@[vc_error] pub struct Un tipo de error !T con msg()/code()
@[vc_len] / @[vc_getitem] / @[vc_contains] métodos len(), obj[i], x in obj
@[vc_iter] / @[vc_next] métodos __iter__ / __next__
@[vc_eq] / @[vc_lt] … pub fn Comparación y orden
@[vc_hash] pub fn __hash__
@[vc_add] … @[vc_invert] pub fn Operadores aritméticos, de bits y unarios
@[vc_const] pub const Una constante de módulo
@[vc_defaults] pub fn, métodos Valores por defecto de argumentos
@[vc_nogil] pub fn Se ejecuta con el GIL liberado
@[vc_raw] pub fn Sin marshalling; tú manejas PyObject *
@[vc_memoryview] pub fn, métodos Devuelve un slice nativo como memoryview escribible

La lista completa, con la firma exacta que espera cada una, está en la referencia de anotaciones.

Siguiente