summaryrefslogtreecommitdiffstats
path: root/Doc/faq/extending.rst
diff options
context:
space:
mode:
Diffstat (limited to 'Doc/faq/extending.rst')
-rw-r--r--Doc/faq/extending.rst28
1 files changed, 16 insertions, 12 deletions
diff --git a/Doc/faq/extending.rst b/Doc/faq/extending.rst
index 7adedf5..fa245c7 100644
--- a/Doc/faq/extending.rst
+++ b/Doc/faq/extending.rst
@@ -99,12 +99,7 @@ many other useful protocols.
How do I use Py_BuildValue() to create a tuple of arbitrary length?
-------------------------------------------------------------------
-You can't. Use ``t = PyTuple_New(n)`` instead, and fill it with objects using
-``PyTuple_SetItem(t, i, o)`` -- note that this "eats" a reference count of
-``o``, so you have to :c:func:`Py_INCREF` it. Lists have similar functions
-``PyList_New(n)`` and ``PyList_SetItem(l, i, o)``. Note that you *must* set all
-the tuple items to some value before you pass the tuple to Python code --
-``PyTuple_New(n)`` initializes them to NULL, which isn't a valid Python value.
+You can't. Use :c:func:`PyTuple_Pack` instead.
How do I call an object's method from C?
@@ -147,21 +142,30 @@ this object to :data:`sys.stdout` and :data:`sys.stderr`. Call print_error, or
just allow the standard traceback mechanism to work. Then, the output will go
wherever your ``write()`` method sends it.
-The easiest way to do this is to use the StringIO class in the standard library.
+The easiest way to do this is to use the :class:`io.StringIO` class::
-Sample code and use for catching stdout:
+ >>> import io, sys
+ >>> sys.stdout = io.StringIO()
+ >>> print('foo')
+ >>> print('hello world!')
+ >>> sys.stderr.write(sys.stdout.getvalue())
+ foo
+ hello world!
+
+A custom object to do the same would look like this::
- >>> class StdoutCatcher:
+ >>> import io, sys
+ >>> class StdoutCatcher(io.TextIOBase):
... def __init__(self):
- ... self.data = ''
+ ... self.data = []
... def write(self, stuff):
- ... self.data = self.data + stuff
+ ... self.data.append(stuff)
...
>>> import sys
>>> sys.stdout = StdoutCatcher()
>>> print('foo')
>>> print('hello world!')
- >>> sys.stderr.write(sys.stdout.data)
+ >>> sys.stderr.write(''.join(sys.stdout.data))
foo
hello world!