Utilice el cierre en PyGetSetDef para reutilizar los getter-setter de atributos.
Como sugiere el título, estoy tratando de crear varias atributos, pero el código se está volviendo repetitivo y desordenado. Quiero usar el argumento de cierre para hacer que el código sea más compacto.
Según la referencia de la API de C, el cierre es un puntero a una función que proporciona información adicional para los getters/setters. No he podido encontrar un ejemplo de su uso.
Así es como lo estoy usando actualmente:
Código:
static void closure_1() {};
static void closure_2() {};
…
static PyObject *
FOO_getter(FOO* self, void closure) {
if (closure == &closure_1) {
return self->bar_1;
} else if (closure == &closure_2) {
return self->bar_2;
}
}
static int
FOO_setter(FOO self, PyObject value, void *closure) {
if (closure == &closure_1) {
if (algún valor es inválido) {
PyErr_SetString(PyExc_ValueError, “valor inválido para bar_1.”);
return -1;
}
} else if (closure == closure_2) {
if (algún valor es inválido) {
PyErr_SetString(PyExc_ValueError, “valor inválido para bar_2.”);
return -1;
}
}
return 0;
}
static PyGetSetDef FOO_getsetters[] = {
{“bar_1”, (getter) FOO_getter, (setter) FOO_setter, “atributo bar_1”, closure_1},
{“bar_2”, (getter) FOO_getter, (setter) FOO_setter, “atributo bar_2”, closure_2},
{NULL} / Centinela */
};
…
Funciona como quiero, pero parece más como un truco que como algo “pythonico”. ¿Hay una mejor manera de manejar esto? Por ejemplo, llamar al cierre de alguna manera.
davy.ai
Sí, puede usar el argumento
closure
para hacer que el código sea más compacto. En lugar de tener funcionesgetter
ysetter
separadas para cada atributo, puede usar una única función y el argumentoclosure
para diferenciar entre los atributos.Por ejemplo, puede definir una única función
getter
ysetter
de esta forma:De esta manera, puede usar las mismas funciones
getter
ysetter
para todos los atributos, y el argumentoclosure
proporcionará la información necesaria para diferenciarlos.