summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2009-04-15 16:19:12 +0200
committerJulian Andres Klode <jak@debian.org>2009-04-15 16:19:12 +0200
commitc876c5095673a2f1c0f2c0eef6eadef2ce200e19 (patch)
treef0832dbbdeb688e0176294e9b487f996108555ad /python
parent97d985d73d12da5578628418aa787d78a33b652d (diff)
downloadpython-apt-c876c5095673a2f1c0f2c0eef6eadef2ce200e19.tar.gz
* Introduce support for Python 3 (Closes: #523645)
This is the first initial port to Python 3. The API is almost completely identical to the one found in Python 2, except that functions working with binary data require bytes (md5sum,sha1sum,sha256sum,Base64Encode). Using setup3.py to install the modules will not work, because the apt package still has to be converted to Python 3. For the package, we call 2to3-3.1 in debian/rules to do this automatically.
Diffstat (limited to 'python')
-rw-r--r--python/acquire.cc6
-rw-r--r--python/apt_instmodule.cc35
-rw-r--r--python/apt_pkgmodule.cc87
-rw-r--r--python/cache.cc18
-rw-r--r--python/cdrom.cc2
-rw-r--r--python/configuration.cc6
-rw-r--r--python/depcache.cc6
-rw-r--r--python/generic.h25
-rw-r--r--python/indexfile.cc2
-rw-r--r--python/metaindex.cc2
-rw-r--r--python/pkgmanager.cc2
-rw-r--r--python/pkgrecords.cc2
-rw-r--r--python/pkgsrcrecords.cc2
-rw-r--r--python/sourcelist.cc2
-rw-r--r--python/string.cc16
-rw-r--r--python/tag.cc4
16 files changed, 192 insertions, 25 deletions
diff --git a/python/acquire.cc b/python/acquire.cc
index d39ee495..053753cd 100644
--- a/python/acquire.cc
+++ b/python/acquire.cc
@@ -72,7 +72,9 @@ static PyObject *AcquireItemRepr(PyObject *Self)
PyTypeObject AcquireItemType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"pkgAcquire::ItemIterator", // tp_name
sizeof(CppOwnedPyObject<pkgAcquire::ItemIterator>), // tp_basicsize
0, // tp_itemsize
@@ -175,7 +177,9 @@ static PyGetSetDef PkgAcquireGetSet[] = {
PyTypeObject PkgAcquireType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"Acquire", // tp_name
sizeof(CppPyObject<pkgAcquire*>), // tp_basicsize
0, // tp_itemsize
@@ -234,7 +238,9 @@ PyObject *GetAcquire(PyObject *Self,PyObject *Args)
PyTypeObject PkgAcquireFileType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"pkgAcquireFile", // tp_name
sizeof(CppPyObject<pkgAcqFile*>),// tp_basicsize
0, // tp_itemsize
diff --git a/python/apt_instmodule.cc b/python/apt_instmodule.cc
index a9d81be4..09e3937e 100644
--- a/python/apt_instmodule.cc
+++ b/python/apt_instmodule.cc
@@ -162,8 +162,41 @@ static PyMethodDef methods[] =
{}
};
+#if PY_MAJOR_VERSION >= 3
+struct module_state {
+ PyObject *error;
+};
+#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
+
+static int apt_inst_traverse(PyObject *m, visitproc visit, void *arg) {
+ Py_VISIT(GETSTATE(m)->error);
+ return 0;
+}
+
+static int apt_inst_clear(PyObject *m) {
+ Py_CLEAR(GETSTATE(m)->error);
+ return 0;
+}
+
+static struct PyModuleDef moduledef = {
+ PyModuleDef_HEAD_INIT,
+ "apt_inst",
+ NULL,
+ sizeof(struct module_state),
+ methods,
+ NULL,
+ apt_inst_traverse,
+ apt_inst_clear,
+ NULL
+};
+
+extern "C" PyObject * PyInit_apt_inst()
+{
+ return PyModule_Create(&moduledef);
+}
+#else
extern "C" void initapt_inst()
{
Py_InitModule("apt_inst",methods);
}
- /*}}}*/
+#endif /*}}}*/
diff --git a/python/apt_pkgmodule.cc b/python/apt_pkgmodule.cc
index fe6a739e..e71d8ee6 100644
--- a/python/apt_pkgmodule.cc
+++ b/python/apt_pkgmodule.cc
@@ -173,12 +173,12 @@ static PyObject *md5sum(PyObject *Self,PyObject *Args)
return 0;
// Digest of a string.
- if (PyString_Check(Obj) != 0)
+ if (PyBytes_Check(Obj) != 0)
{
char *s;
Py_ssize_t len;
MD5Summation Sum;
- PyString_AsStringAndSize(Obj, &s, &len);
+ PyBytes_AsStringAndSize(Obj, &s, &len);
Sum.Add((const unsigned char*)s, len);
return CppPyString(Sum.Result().Value());
}
@@ -213,12 +213,12 @@ static PyObject *sha1sum(PyObject *Self,PyObject *Args)
return 0;
// Digest of a string.
- if (PyString_Check(Obj) != 0)
+ if (PyBytes_Check(Obj) != 0)
{
char *s;
Py_ssize_t len;
SHA1Summation Sum;
- PyString_AsStringAndSize(Obj, &s, &len);
+ PyBytes_AsStringAndSize(Obj, &s, &len);
Sum.Add((const unsigned char*)s, len);
return CppPyString(Sum.Result().Value());
}
@@ -253,12 +253,12 @@ static PyObject *sha256sum(PyObject *Self,PyObject *Args)
return 0;
// Digest of a string.
- if (PyString_Check(Obj) != 0)
+ if (PyBytes_Check(Obj) != 0)
{
char *s;
Py_ssize_t len;
SHA256Summation Sum;
- PyString_AsStringAndSize(Obj, &s, &len);
+ PyBytes_AsStringAndSize(Obj, &s, &len);
Sum.Add((const unsigned char*)s, len);
return CppPyString(Sum.Result().Value());
}
@@ -470,30 +470,68 @@ static void AddInt(PyObject *Dict,const char *Itm,unsigned long I)
Py_DECREF(Obj);
}
+#if PY_MAJOR_VERSION >= 3
+struct module_state {
+ PyObject *error;
+};
+
+#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
+
+static int apt_inst_traverse(PyObject *m, visitproc visit, void *arg) {
+ Py_VISIT(GETSTATE(m)->error);
+ return 0;
+}
+
+static int apt_inst_clear(PyObject *m) {
+ Py_CLEAR(GETSTATE(m)->error);
+ return 0;
+}
+
+static struct PyModuleDef moduledef = {
+ PyModuleDef_HEAD_INIT,
+ "apt_inst",
+ NULL,
+ sizeof(struct module_state),
+ methods,
+ NULL,
+ apt_inst_traverse,
+ apt_inst_clear,
+ NULL
+};
+
+#define INIT_ERROR return 0
+extern "C" PyObject * PyInit_apt_pkg()
+#else
+#define INIT_ERROR return
extern "C" void initapt_pkg()
+#endif
{
// Finalize our types to add slots, etc.
- if (PyType_Ready(&TagSecType) == -1) return;
- if (PyType_Ready(&TagFileType) == -1) return;
- if (PyType_Ready(&ConfigurationType) == -1) return;
- if (PyType_Ready(&ConfigurationPtrType) == -1) return;
- if (PyType_Ready(&ConfigurationSubType) == -1) return;
- if (PyType_Ready(&PkgCdromType) == -1) return;
- if (PyType_Ready(&PkgProblemResolverType) == -1) return;
- if (PyType_Ready(&PkgActionGroupType) == -1) return;
- if (PyType_Ready(&PkgSourceListType) == -1) return;
- if (PyType_Ready(&PkgCacheType) == -1) return;
- if (PyType_Ready(&DependencyType) == -1) return;
- if (PyType_Ready(&PkgDepCacheType) == -1) return;
- if (PyType_Ready(&PkgAcquireType) == -1) return;
- if (PyType_Ready(&PackageIndexFileType) == -1) return;
- if (PyType_Ready(&PkgManagerType) == -1) return;
- if (PyType_Ready(&PkgSrcRecordsType) == -1) return;
- if (PyType_Ready(&PkgRecordsType) == -1) return;
+ if (PyType_Ready(&TagSecType) == -1) INIT_ERROR;
+ if (PyType_Ready(&TagFileType) == -1) INIT_ERROR;
+ if (PyType_Ready(&ConfigurationType) == -1) INIT_ERROR;
+ if (PyType_Ready(&ConfigurationPtrType) == -1) INIT_ERROR;
+ if (PyType_Ready(&ConfigurationSubType) == -1) INIT_ERROR;
+ if (PyType_Ready(&PkgCdromType) == -1) INIT_ERROR;
+ if (PyType_Ready(&PkgProblemResolverType) == -1) INIT_ERROR;
+ if (PyType_Ready(&PkgActionGroupType) == -1) INIT_ERROR;
+ if (PyType_Ready(&PkgSourceListType) == -1) INIT_ERROR;
+ if (PyType_Ready(&PkgCacheType) == -1) INIT_ERROR;
+ if (PyType_Ready(&DependencyType) == -1) INIT_ERROR;
+ if (PyType_Ready(&PkgDepCacheType) == -1) INIT_ERROR;
+ if (PyType_Ready(&PkgAcquireType) == -1) INIT_ERROR;
+ if (PyType_Ready(&PackageIndexFileType) == -1) INIT_ERROR;
+ if (PyType_Ready(&PkgManagerType) == -1) INIT_ERROR;
+ if (PyType_Ready(&PkgSrcRecordsType) == -1) INIT_ERROR;
+ if (PyType_Ready(&PkgRecordsType) == -1) INIT_ERROR;
// Initialize the module
+ #if PY_MAJOR_VERSION >= 3
+ PyObject *Module = PyModule_Create(&moduledef);
+ #else
PyObject *Module = Py_InitModule("apt_pkg",methods);
+ #endif
PyObject *Dict = PyModule_GetDict(Module);
// Global variable linked to the global configuration class
@@ -549,6 +587,9 @@ extern "C" void initapt_pkg()
AddInt(Dict,"InstStateReInstReq",pkgCache::State::ReInstReq);
AddInt(Dict,"InstStateHold",pkgCache::State::Hold);
AddInt(Dict,"InstStateHoldReInstReq",pkgCache::State::HoldReInstReq);
+ #if PY_MAJOR_VERSION >= 3
+ return Module;
+ #endif
}
/*}}}*/
diff --git a/python/cache.cc b/python/cache.cc
index 2d8b8db7..957681ba 100644
--- a/python/cache.cc
+++ b/python/cache.cc
@@ -239,7 +239,9 @@ static PyMappingMethods CacheMap = {0,CacheMapOp,0};
PyTypeObject PkgCacheType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"pkgCache", // tp_name
sizeof(CppOwnedPyObject<pkgCache *>), // tp_basicsize
0, // tp_itemsize
@@ -277,7 +279,9 @@ PyTypeObject PkgCacheType =
PyTypeObject PkgCacheFileType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"pkgCacheFile", // tp_name
sizeof(CppOwnedPyObject<pkgCacheFile*>), // tp_basicsize
0, // tp_itemsize
@@ -345,7 +349,9 @@ static PySequenceMethods PkgListSeq =
PyTypeObject PkgListType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"pkgCache::PkgIterator", // tp_name
sizeof(CppOwnedPyObject<PkgListStruct>), // tp_basicsize
0, // tp_itemsize
@@ -435,7 +441,9 @@ static PyObject *PackageRepr(PyObject *Self)
PyTypeObject PackageType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"pkgCache::Package", // tp_name
sizeof(CppOwnedPyObject<pkgCache::PkgIterator>), // tp_basicsize
0, // tp_itemsize
@@ -498,7 +506,9 @@ static PyObject *DescriptionRepr(PyObject *Self)
PyTypeObject DescriptionType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"pkgCache::DescIterator", // tp_name
sizeof(CppOwnedPyObject<pkgCache::DescIterator>), // tp_basicsize
0, // tp_itemsize
@@ -684,7 +694,9 @@ static PyObject *VersionRepr(PyObject *Self)
PyTypeObject VersionType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"pkgCache::VerIterator", // tp_name
sizeof(CppOwnedPyObject<pkgCache::VerIterator>), // tp_basicsize
0, // tp_itemsize
@@ -759,7 +771,9 @@ static PyObject *PackageFileRepr(PyObject *Self)
PyTypeObject PackageFileType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"pkgCache::PkgFileIterator", // tp_name
sizeof(CppOwnedPyObject<pkgCache::PkgFileIterator>), // tp_basicsize
0, // tp_itemsize
@@ -905,7 +919,9 @@ static PyGetSetDef DependencyGetSet[] = {
PyTypeObject DependencyType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"pkgCache::DepIterator", // tp_name
sizeof(CppOwnedPyObject<pkgCache::DepIterator>), // tp_basicsize
0, // tp_itemsize
@@ -991,7 +1007,9 @@ static PySequenceMethods RDepListSeq =
PyTypeObject RDepListType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"pkgCache::DepIterator", // tp_name
sizeof(CppOwnedPyObject<RDepListStruct>), // tp_basicsize
0, // tp_itemsize
diff --git a/python/cdrom.cc b/python/cdrom.cc
index 0816d93e..b3a38438 100644
--- a/python/cdrom.cc
+++ b/python/cdrom.cc
@@ -67,7 +67,9 @@ static PyMethodDef PkgCdromMethods[] =
PyTypeObject PkgCdromType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"Cdrom", // tp_name
sizeof(CppOwnedPyObject<PkgCdromStruct>), // tp_basicsize
0, // tp_itemsize
diff --git a/python/configuration.cc b/python/configuration.cc
index b4adf357..eaac48ec 100644
--- a/python/configuration.cc
+++ b/python/configuration.cc
@@ -481,7 +481,9 @@ static PyMappingMethods ConfigurationMap = {0,CnfMap,CnfMapSet};
PyTypeObject ConfigurationType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"Configuration", // tp_name
sizeof(CppPyObject<Configuration>), // tp_basicsize
0, // tp_itemsize
@@ -515,7 +517,9 @@ PyTypeObject ConfigurationType =
PyTypeObject ConfigurationPtrType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"ConfigurationPtr", // tp_name
sizeof(CppPyObject<Configuration *>), // tp_basicsize
0, // tp_itemsize
@@ -549,7 +553,9 @@ PyTypeObject ConfigurationPtrType =
PyTypeObject ConfigurationSubType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"ConfigurationSub", // tp_name
sizeof(SubConfiguration), // tp_basicsize
0, // tp_itemsize
diff --git a/python/depcache.cc b/python/depcache.cc
index ade3d4f5..1c9eeff7 100644
--- a/python/depcache.cc
+++ b/python/depcache.cc
@@ -594,7 +594,9 @@ static PyGetSetDef PkgDepCacheGetSet[] = {
PyTypeObject PkgDepCacheType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"pkgDepCache", // tp_name
sizeof(CppOwnedPyObject<pkgDepCache *>), // tp_basicsize
0, // tp_itemsize
@@ -773,7 +775,9 @@ static PyMethodDef PkgProblemResolverMethods[] =
PyTypeObject PkgProblemResolverType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"pkgProblemResolver", // tp_name
sizeof(CppOwnedPyObject<pkgProblemResolver *>), // tp_basicsize
0, // tp_itemsize
@@ -829,7 +833,9 @@ static PyMethodDef PkgActionGroupMethods[] =
PyTypeObject PkgActionGroupType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"pkgActionGroup", // tp_name
sizeof(CppOwnedPyObject<pkgDepCache::ActionGroup*>), // tp_basicsize
0, // tp_itemsize
diff --git a/python/generic.h b/python/generic.h
index ce79a54c..6e66d24c 100644
--- a/python/generic.h
+++ b/python/generic.h
@@ -35,6 +35,31 @@
typedef int Py_ssize_t;
#endif
+/* Define compatibility for Python 3.
+ *
+ * We will use the names PyString_* to refer to the default string type
+ * of the current Python version (PyString on 2.X, PyUnicode on 3.X).
+ *
+ * When we really need unicode strings, we will use PyUnicode_* directly, as
+ * long as it exists in Python 2 and Python 3.
+ *
+ * When we want bytes in Python 3, we use PyBytes*_ instead of PyString_* and
+ * define aliases from PyBytes_* to PyString_* for Python 2.
+ */
+
+#if PY_MAJOR_VERSION >= 3
+#define PyString_Check PyUnicode_Check
+#define PyString_FromString PyUnicode_FromString
+#define PyString_FromStringAndSize PyUnicode_FromStringAndSize
+#define PyString_AsString(op) PyBytes_AsString(PyUnicode_AsUTF8String(op))
+#define PyInt_Check PyLong_Check
+#define PyInt_AsLong PyLong_AsLong
+#else
+#define PyBytes_Check PyString_Check
+#define PyBytes_AsString PyString_AsString
+#define PyBytes_AsStringAndSize PyString_AsStringAndSize
+#endif
+
template <class T> struct CppPyObject : public PyObject
{
// We are only using CppPyObject and friends as dumb structs only, ie the
diff --git a/python/indexfile.cc b/python/indexfile.cc
index dc55634f..bb40cdd0 100644
--- a/python/indexfile.cc
+++ b/python/indexfile.cc
@@ -81,7 +81,9 @@ static PyGetSetDef PackageIndexFileGetSet[] = {
PyTypeObject PackageIndexFileType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"pkgIndexFile", // tp_name
sizeof(CppOwnedPyObject<pkgIndexFile*>), // tp_basicsize
0, // tp_itemsize
diff --git a/python/metaindex.cc b/python/metaindex.cc
index efbc38af..cbaeafbd 100644
--- a/python/metaindex.cc
+++ b/python/metaindex.cc
@@ -59,7 +59,9 @@ static PyObject *MetaIndexRepr(PyObject *Self)
PyTypeObject MetaIndexType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"metaIndex", // tp_name
sizeof(CppOwnedPyObject<metaIndex*>), // tp_basicsize
0, // tp_itemsize
diff --git a/python/pkgmanager.cc b/python/pkgmanager.cc
index 52f86228..8f56cddc 100644
--- a/python/pkgmanager.cc
+++ b/python/pkgmanager.cc
@@ -95,7 +95,9 @@ static PyGetSetDef PkgManagerGetSet[] = {
PyTypeObject PkgManagerType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"PackageManager", // tp_name
sizeof(CppPyObject<pkgPackageManager*>), // tp_basicsize
0, // tp_itemsize
diff --git a/python/pkgrecords.cc b/python/pkgrecords.cc
index 577aaf1c..978de6b7 100644
--- a/python/pkgrecords.cc
+++ b/python/pkgrecords.cc
@@ -135,7 +135,9 @@ static PyGetSetDef PkgRecordsGetSet[] = {
PyTypeObject PkgRecordsType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"pkgRecords", // tp_name
sizeof(CppOwnedPyObject<PkgRecordsStruct>), // tp_basicsize
0, // tp_itemsize
diff --git a/python/pkgsrcrecords.cc b/python/pkgsrcrecords.cc
index c830f8d2..97667d7a 100644
--- a/python/pkgsrcrecords.cc
+++ b/python/pkgsrcrecords.cc
@@ -183,7 +183,9 @@ static PyGetSetDef PkgSrcRecordsGetSet[] = {
PyTypeObject PkgSrcRecordsType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"pkgSrcRecords", // tp_name
sizeof(CppPyObject<PkgSrcRecordsStruct>), // tp_basicsize
0, // tp_itemsize
diff --git a/python/sourcelist.cc b/python/sourcelist.cc
index 9f8f8878..48b3b7c8 100644
--- a/python/sourcelist.cc
+++ b/python/sourcelist.cc
@@ -100,7 +100,9 @@ static PyGetSetDef PkgSourceListGetSet[] = {
PyTypeObject PkgSourceListType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"pkgSourceList", // tp_name
sizeof(CppPyObject<pkgSourceList*>), // tp_basicsize
0, // tp_itemsize
diff --git a/python/string.cc b/python/string.cc
index 8168ea5b..b95ee3eb 100644
--- a/python/string.cc
+++ b/python/string.cc
@@ -38,7 +38,21 @@ PyObject *Python(PyObject *Self,PyObject *Args) \
}
MkStr(StrDeQuote,DeQuoteString);
-MkStr(StrBase64Encode,Base64Encode);
+
+/*
+ * Input bytes(Py3k)/str(Py2), output str.
+ */
+PyObject *StrBase64Encode(PyObject *Self,PyObject *Args) {
+ char *Str = 0;
+ #if PY_MAJOR_VERSION >= 3
+ if (PyArg_ParseTuple(Args,"y",&Str) == 0)
+ #else
+ if (PyArg_ParseTuple(Args,"s",&Str) == 0)
+ #endif
+ return 0;
+ return CppPyString(Base64Encode(Str));
+}
+
MkStr(StrURItoFileName,URItoFileName);
//MkFloat(StrSizeToStr,SizeToStr);
diff --git a/python/tag.cc b/python/tag.cc
index cdea3e03..18d08580 100644
--- a/python/tag.cc
+++ b/python/tag.cc
@@ -384,7 +384,9 @@ PyMappingMethods TagSecMapMeth = {TagSecLength,TagSecMap,0};
PyTypeObject TagSecType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"TagSection", // tp_name
sizeof(TagSecData), // tp_basicsize
0, // tp_itemsize
@@ -442,7 +444,9 @@ static PyGetSetDef TagFileGetSet[] = {
PyTypeObject TagFileType =
{
PyObject_HEAD_INIT(&PyType_Type)
+ #if PY_MAJOR_VERSION < 3
0, // ob_size
+ #endif
"TagFile", // tp_name
sizeof(TagFileData), // tp_basicsize
0, // tp_itemsize