mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	 ab32fec83c
			
		
	
	
		ab32fec83c
		
	
	
	
	
		
			
			svn+ssh://svn.python.org/python/branches/py3k ........ r85572 | georg.brandl | 2010-10-16 20:51:05 +0200 (Sa, 16 Okt 2010) | 1 line #10122: typo fix. ........ r85573 | georg.brandl | 2010-10-16 20:53:08 +0200 (Sa, 16 Okt 2010) | 1 line #10124: typo fix. ........ r85606 | georg.brandl | 2010-10-17 08:32:59 +0200 (So, 17 Okt 2010) | 1 line #10058: tweak wording about exception returns. ........ r85609 | georg.brandl | 2010-10-17 11:19:03 +0200 (So, 17 Okt 2010) | 1 line #8556: use less confusing mapping key in example. ........ r85610 | georg.brandl | 2010-10-17 11:23:05 +0200 (So, 17 Okt 2010) | 1 line #8686: remove potentially confusing wording that does not add any value. ........ r85611 | georg.brandl | 2010-10-17 11:33:24 +0200 (So, 17 Okt 2010) | 1 line #8811: small fixes to sqlite3 docs. ........ r85612 | georg.brandl | 2010-10-17 11:37:54 +0200 (So, 17 Okt 2010) | 1 line #8855: add shelve security warning. ........ r85613 | georg.brandl | 2010-10-17 11:43:35 +0200 (So, 17 Okt 2010) | 1 line Fix hmac docs: it takes and returns bytes, except for hexdigest(). ........ r85614 | georg.brandl | 2010-10-17 11:46:11 +0200 (So, 17 Okt 2010) | 1 line #8968: add actual name of token constants. ........ r85615 | georg.brandl | 2010-10-17 12:05:13 +0200 (So, 17 Okt 2010) | 1 line #459007: merge info from PC/getpathp.c and using/windows.rst to document the forming of sys.path under Windows. ........ r85616 | georg.brandl | 2010-10-17 12:07:29 +0200 (So, 17 Okt 2010) | 1 line Fix copy-paste error in example. ........ r85617 | georg.brandl | 2010-10-17 12:09:06 +0200 (So, 17 Okt 2010) | 1 line #5212: md5 weaknesses do not affect hmac, so remove the note about that. ........ r85618 | georg.brandl | 2010-10-17 12:14:38 +0200 (So, 17 Okt 2010) | 1 line #9086: correct wrong terminology about linking with pythonXY.dll. ........ r85619 | georg.brandl | 2010-10-17 12:15:50 +0200 (So, 17 Okt 2010) | 1 line Make file names consistent. ........ r85620 | georg.brandl | 2010-10-17 12:22:28 +0200 (So, 17 Okt 2010) | 1 line Remove second parser module example; it referred to non-readily-available example files, and this kind of discovery is much better done with the AST nowadays anyway. ........ r85621 | georg.brandl | 2010-10-17 12:24:54 +0200 (So, 17 Okt 2010) | 1 line #9105: move pickle warning to a bit more prominent location. ........ r85622 | georg.brandl | 2010-10-17 12:28:04 +0200 (So, 17 Okt 2010) | 1 line #9112: document error() and exit() methods of ArgumentParser. ........ r85624 | georg.brandl | 2010-10-17 12:34:28 +0200 (So, 17 Okt 2010) | 1 line Some markup and style fixes in argparse docs. ........ r85626 | georg.brandl | 2010-10-17 12:38:20 +0200 (So, 17 Okt 2010) | 1 line #9117: fix syntax for class definition. ........ r85627 | georg.brandl | 2010-10-17 12:44:11 +0200 (So, 17 Okt 2010) | 1 line #9138: reword introduction to classes in Python. ........ r85629 | georg.brandl | 2010-10-17 12:51:45 +0200 (So, 17 Okt 2010) | 1 line #5962: clarify sys.exit() vs. threads. ........ r85631 | georg.brandl | 2010-10-17 12:53:54 +0200 (So, 17 Okt 2010) | 1 line Fix capitalization. ........ r85633 | georg.brandl | 2010-10-17 12:59:41 +0200 (So, 17 Okt 2010) | 1 line #9204: remove mentions of removed types in the types module. ........ r85635 | georg.brandl | 2010-10-17 13:03:22 +0200 (So, 17 Okt 2010) | 1 line #5121: fix claims about default values leading to segfaults. ........ r85636 | georg.brandl | 2010-10-17 13:06:14 +0200 (So, 17 Okt 2010) | 1 line #9237: document sys.call_tracing(). ........ r85638 | georg.brandl | 2010-10-17 13:13:37 +0200 (So, 17 Okt 2010) | 1 line Port changes to pickle docs apparently lost in py3k. ........ r85639 | georg.brandl | 2010-10-17 13:23:56 +0200 (So, 17 Okt 2010) | 1 line Make twisted example a bit more logical. ........ r85641 | georg.brandl | 2010-10-17 13:29:07 +0200 (So, 17 Okt 2010) | 1 line Fix documentation of dis.opmap direction. ........ r85642 | georg.brandl | 2010-10-17 13:36:28 +0200 (So, 17 Okt 2010) | 1 line #9730: fix example. ........
		
			
				
	
	
		
			218 lines
		
	
	
	
		
			5.7 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			218 lines
		
	
	
	
		
			5.7 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| .. highlightlang:: c
 | |
| 
 | |
| .. _cporting-howto:
 | |
| 
 | |
| ********************************
 | |
| Porting Extension Modules to 3.0
 | |
| ********************************
 | |
| 
 | |
| :author: Benjamin Peterson
 | |
| 
 | |
| 
 | |
| .. topic:: Abstract
 | |
| 
 | |
|    Although changing the C-API was not one of Python 3.0's objectives, the many
 | |
|    Python level changes made leaving 2.x's API intact impossible.  In fact, some
 | |
|    changes such as :func:`int` and :func:`long` unification are more obvious on
 | |
|    the C level.  This document endeavors to document incompatibilities and how
 | |
|    they can be worked around.
 | |
| 
 | |
| 
 | |
| Conditional compilation
 | |
| =======================
 | |
| 
 | |
| The easiest way to compile only some code for 3.0 is to check if
 | |
| :c:macro:`PY_MAJOR_VERSION` is greater than or equal to 3. ::
 | |
| 
 | |
|    #if PY_MAJOR_VERSION >= 3
 | |
|    #define IS_PY3K
 | |
|    #endif
 | |
| 
 | |
| API functions that are not present can be aliased to their equivalents within
 | |
| conditional blocks.
 | |
| 
 | |
| 
 | |
| Changes to Object APIs
 | |
| ======================
 | |
| 
 | |
| Python 3.0 merged together some types with similar functions while cleanly
 | |
| separating others.
 | |
| 
 | |
| 
 | |
| str/unicode Unification
 | |
| -----------------------
 | |
| 
 | |
| 
 | |
| Python 3.0's :func:`str` (``PyString_*`` functions in C) type is equivalent to
 | |
| 2.x's :func:`unicode` (``PyUnicode_*``).  The old 8-bit string type has become
 | |
| :func:`bytes`.  Python 2.6 and later provide a compatibility header,
 | |
| :file:`bytesobject.h`, mapping ``PyBytes`` names to ``PyString`` ones.  For best
 | |
| compatibility with 3.0, :c:type:`PyUnicode` should be used for textual data and
 | |
| :c:type:`PyBytes` for binary data.  It's also important to remember that
 | |
| :c:type:`PyBytes` and :c:type:`PyUnicode` in 3.0 are not interchangeable like
 | |
| :c:type:`PyString` and :c:type:`PyUnicode` are in 2.x.  The following example
 | |
| shows best practices with regards to :c:type:`PyUnicode`, :c:type:`PyString`,
 | |
| and :c:type:`PyBytes`. ::
 | |
| 
 | |
|    #include "stdlib.h"
 | |
|    #include "Python.h"
 | |
|    #include "bytesobject.h"
 | |
| 
 | |
|    /* text example */
 | |
|    static PyObject *
 | |
|    say_hello(PyObject *self, PyObject *args) {
 | |
|        PyObject *name, *result;
 | |
| 
 | |
|        if (!PyArg_ParseTuple(args, "U:say_hello", &name))
 | |
|            return NULL;
 | |
| 
 | |
|        result = PyUnicode_FromFormat("Hello, %S!", name);
 | |
|        return result;
 | |
|    }
 | |
| 
 | |
|    /* just a forward */
 | |
|    static char * do_encode(PyObject *);
 | |
| 
 | |
|    /* bytes example */
 | |
|    static PyObject *
 | |
|    encode_object(PyObject *self, PyObject *args) {
 | |
|        char *encoded;
 | |
|        PyObject *result, *myobj;
 | |
| 
 | |
|        if (!PyArg_ParseTuple(args, "O:encode_object", &myobj))
 | |
|            return NULL;
 | |
| 
 | |
|        encoded = do_encode(myobj);
 | |
|        if (encoded == NULL)
 | |
|            return NULL;
 | |
|        result = PyBytes_FromString(encoded);
 | |
|        free(encoded);
 | |
|        return result;
 | |
|    }
 | |
| 
 | |
| 
 | |
| long/int Unification
 | |
| --------------------
 | |
| 
 | |
| In Python 3.0, there is only one integer type.  It is called :func:`int` on the
 | |
| Python level, but actually corresponds to 2.x's :func:`long` type.  In the
 | |
| C-API, ``PyInt_*`` functions are replaced by their ``PyLong_*`` neighbors.  The
 | |
| best course of action here is using the ``PyInt_*`` functions aliased to
 | |
| ``PyLong_*`` found in :file:`intobject.h`.  The abstract ``PyNumber_*`` APIs
 | |
| can also be used in some cases. ::
 | |
| 
 | |
|    #include "Python.h"
 | |
|    #include "intobject.h"
 | |
| 
 | |
|    static PyObject *
 | |
|    add_ints(PyObject *self, PyObject *args) {
 | |
|        int one, two;
 | |
|        PyObject *result;
 | |
| 
 | |
|        if (!PyArg_ParseTuple(args, "ii:add_ints", &one, &two))
 | |
|            return NULL;
 | |
| 
 | |
|        return PyInt_FromLong(one + two);
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| Module initialization and state
 | |
| ===============================
 | |
| 
 | |
| Python 3.0 has a revamped extension module initialization system.  (See
 | |
| :pep:`3121`.)  Instead of storing module state in globals, they should be stored
 | |
| in an interpreter specific structure.  Creating modules that act correctly in
 | |
| both 2.x and 3.0 is tricky.  The following simple example demonstrates how. ::
 | |
| 
 | |
|    #include "Python.h"
 | |
| 
 | |
|    struct module_state {
 | |
|        PyObject *error;
 | |
|    };
 | |
| 
 | |
|    #if PY_MAJOR_VERSION >= 3
 | |
|    #define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
 | |
|    #else
 | |
|    #define GETSTATE(m) (&_state)
 | |
|    static struct module_state _state;
 | |
|    #endif
 | |
| 
 | |
|    static PyObject *
 | |
|    error_out(PyObject *m) {
 | |
|        struct module_state *st = GETSTATE(m);
 | |
|        PyErr_SetString(st->error, "something bad happened");
 | |
|        return NULL;
 | |
|    }
 | |
| 
 | |
|    static PyMethodDef myextension_methods[] = {
 | |
|        {"error_out", (PyCFunction)error_out, METH_NOARGS, NULL},
 | |
|        {NULL, NULL}
 | |
|    };
 | |
| 
 | |
|    #if PY_MAJOR_VERSION >= 3
 | |
| 
 | |
|    static int myextension_traverse(PyObject *m, visitproc visit, void *arg) {
 | |
|        Py_VISIT(GETSTATE(m)->error);
 | |
|        return 0;
 | |
|    }
 | |
| 
 | |
|    static int myextension_clear(PyObject *m) {
 | |
|        Py_CLEAR(GETSTATE(m)->error);
 | |
|        return 0;
 | |
|    }
 | |
| 
 | |
| 
 | |
|    static struct PyModuleDef moduledef = {
 | |
|            PyModuleDef_HEAD_INIT,
 | |
|            "myextension",
 | |
|            NULL,
 | |
|            sizeof(struct module_state),
 | |
|            myextension_methods,
 | |
|            NULL,
 | |
|            myextension_traverse,
 | |
|            myextension_clear,
 | |
|            NULL
 | |
|    };
 | |
| 
 | |
|    #define INITERROR return NULL
 | |
| 
 | |
|    PyObject *
 | |
|    PyInit_myextension(void)
 | |
| 
 | |
|    #else
 | |
|    #define INITERROR return
 | |
| 
 | |
|    void
 | |
|    initmyextension(void)
 | |
|    #endif
 | |
|    {
 | |
|    #if PY_MAJOR_VERSION >= 3
 | |
|        PyObject *module = PyModule_Create(&moduledef);
 | |
|    #else
 | |
|        PyObject *module = Py_InitModule("myextension", myextension_methods);
 | |
|    #endif
 | |
| 
 | |
|        if (module == NULL)
 | |
|            INITERROR;
 | |
|        struct module_state *st = GETSTATE(module);
 | |
| 
 | |
|        st->error = PyErr_NewException("myextension.Error", NULL, NULL);
 | |
|        if (st->error == NULL) {
 | |
|            Py_DECREF(module);
 | |
|            INITERROR;
 | |
|        }
 | |
| 
 | |
|    #if PY_MAJOR_VERSION >= 3
 | |
|        return module;
 | |
|    #endif
 | |
|    }
 | |
| 
 | |
| 
 | |
| Other options
 | |
| =============
 | |
| 
 | |
| If you are writing a new extension module, you might consider `Cython
 | |
| <http://www.cython.org>`_.  It translates a Python-like language to C.  The
 | |
| extension modules it creates are compatible with Python 3.x and 2.x.
 | |
| 
 |