¿Qué significa el último argumento para SWIG_NewPointerObj?

Tengo una biblioteca de compatibilidad que utiliza SWIG para acceder a una biblioteca de C ++. Me resultaría útil poder crear un objeto Python envuelto en SWIG dentro de esta capa (en lugar de aceptar el objeto C ++ como un argumento o devolver uno). Es decir, quiero el PyObject* que apunta al objeto C ++ envuelto en SWIG.

Descubrí que la función SWIG_NewPointerObj hace exactamente esto. El archivo xx_wrap.cpp generado por xx_wrap.cpp utiliza esta función, pero también está disponible en el encabezado emitido por swig -python -external-runtime swigpyrun.h

SIN EMBARGO, no puedo encontrar ninguna referencia a cuál es el último argumento de esta función. Parece que especifica la propiedad del objeto, pero no hay documentación que indique qué significan cada una de las opciones (o incluso qué son todas). Parece que los siguientes son valores aceptables:

  • 0
  • SWIG_POINTER_OWN
  • SWIG_POINTER_NOSHADOW
  • SWIG_POINTER_NEW = OWN + NOSHADOW
  • SWIG_POINTER_DISOWN (No estoy seguro de si SWIG_NewPointerObj acepta esto)
  • SWIG_POINTER_IMPLICIT_CONV (No estoy seguro de si SWIG_NewPointerObj acepta esto)

Quiero crear un objeto que se usa solo en mi capa de envoltura. Quiero crearlo desde mi propio puntero al objeto C ++ (para poder cambiar el valor del objeto C ++ y que se refleje en el objeto Python. Lo necesito para poder pasarlo a una función de callback de Python. mantenga esta instancia durante toda la vida del progtwig para que no pierda el tiempo creando / destruyendo objetos idénticos para cada callback. ¿Qué opción es apropiada y qué hago para Py_INCREF ?

    Cuando crea nuevos objetos de puntero con SWIG_NewPointerObj , puede pasar las siguientes banderas:

     SWIG_POINTER_OWN SWIG_POINTER_NOSHADOW 

    Si se establece SWIG_POINTER_OWN, se llamará al destructor de la clase C ++ subyacente cuando se finalice el puntero de Python. Por defecto, el destructor no será llamado. Ver gestión de memoria

    Para su caso de uso, no necesita establecer ninguna bandera en absoluto.

    Por lo que puedo ver en las fonts, si se establece SWIG_POINTER_NOSHADOW, se devuelve un puntero envuelto básico. No podrá acceder a las variables miembro en Python. Todo lo que tendrás es un puntero opaco.

    Referencia: /usr/share/swig/2.0.7/python/pyrun.swg