[PyKDE] Static (why?) PyDateTimeAPI and SIP
Gerard Vermeulen
gerard.vermeulen at grenoble.cnrs.fr
Sat Jun 18 18:50:53 BST 2005
On Sat, 18 Jun 2005 19:52:20 +0400
"Denis S. Otkidach" <ods at strana.ru> wrote:
> I use datetime C API in extension module generated with SIP. But SIP
> break the code into several .cpp files compiled separately and
> PyDateTimeAPI used by all macros constituting public interface is
> declared static.
>
> The current solution is to define my own functions in main module as
> workaround:
>
> %ModuleHeaderCode
> PyObject * mxo_PyDateTime_FromDateAndTime(int year, int month, int day,
> int hour, int minute, int seconds,
> int usecs);
> %End
>
> %ModuleCode
> PyObject * mxo_PyDateTime_FromDateAndTime(int year, int month, int day,
> int hour, int minute, int seconds,
> int usecs) {
> return PyDateTime_FromDateAndTime(year, month, day, hour, minute, seconds,
> usecs);
> }
> // and so on for each macro used
> %End
>
> %PostInitialisationCode
> PyDateTime_IMPORT;
> %End
>
> But I wonder why PyDateTimeAPI is declared static, and is the a better
> solution?
To prevent namespace pollution.
Numeric and numarray have a different solution. From Numeric/arrayobject.h:
/* C API address pointer */
#if defined(NO_IMPORT) || defined(NO_IMPORT_ARRAY)
extern void **PyArray_API;
#else
#if defined(PY_ARRAY_UNIQUE_SYMBOL)
void **PyArray_API;
#else
static void **PyArray_API;
#endif
which lets you use whatever you like and even rename the C API address pointer.
However, keep in mind that SIP can concatenate all C++ files which breaks
clever #defines that work if SIP generates separate C++ source files.
In fact, I use your method, when wrapping the Numeric and numarray files for
PyQwt. The only difference is that I put all access to the C-API in handwritten
C++ files to use the conflicting APIs of Numeric and numarray in the same Python
extension.
Gerard
More information about the PyQt
mailing list