mirror of
https://github.com/boostorg/python.git
synced 2026-01-19 04:22:16 +00:00
https://svn.boost.org/svn/boost/trunk ........ r43206 | danieljames | 2008-02-10 09:55:03 +0000 (Sun, 10 Feb 2008) | 1 line Fix some broken links. ........ r43209 | danieljames | 2008-02-10 14:56:22 +0000 (Sun, 10 Feb 2008) | 1 line Link to people pages on the website, as they've been removed from the download. ........ r43210 | danieljames | 2008-02-10 15:02:17 +0000 (Sun, 10 Feb 2008) | 1 line Point links to the pages that used to be in 'more' to the site. ........ r43212 | danieljames | 2008-02-10 16:10:16 +0000 (Sun, 10 Feb 2008) | 1 line Fix links on the home page as well. ........ r43213 | danieljames | 2008-02-10 16:21:22 +0000 (Sun, 10 Feb 2008) | 1 line Generated documentation which is no longer generated. ........ [SVN r43214]
230 lines
9.0 KiB
HTML
230 lines
9.0 KiB
HTML
<!-- Copyright David Abrahams 2006. Distributed under the Boost -->
|
|
<!-- Software License, Version 1.0. (See accompanying -->
|
|
<!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
|
<title>Boost.Python - June 2002 Progress Report</title>
|
|
</head>
|
|
<body link="#0000ff" vlink="#800080">
|
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
|
"header">
|
|
<tr>
|
|
<td valign="top" width="300">
|
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
|
"C++ Boost" src="../../../../boost.png" border="0"></a></h3>
|
|
</td>
|
|
<td valign="top">
|
|
<h1 align="center"><a href="../index.html">Boost.Python</a></h1>
|
|
<h2 align="center">June 2002 Progress Report</h2>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<hr>
|
|
<h2>Contents</h2>
|
|
<dl class="index">
|
|
<dt><a href="#intro">Introduction</a></dt>
|
|
<dt><a href="#handle"><code>handle<T></code></a></dt>
|
|
<dt><a href="#object"><code>object</code></a></dt>
|
|
<dl class="index">
|
|
<dt><a href="#operators"><code>object</code> operators</a></dt>
|
|
<dt><a href="#conversions"><code>object</code> conversions</a></dt>
|
|
</dl>
|
|
<dt><a href="#list"><code>list</code></a></dt>
|
|
<dt><a href="#numerics"><code>Numerics</code></a></dt>
|
|
<dt><a href="#community">Community</a></dt>
|
|
<dt><a href="#next">What's Next</a></dt>
|
|
</dl>
|
|
|
|
<h2><a name="intro">Introduction</a></h2>
|
|
|
|
July was mostly focused on allowing expressive manipulation of
|
|
individual Python objects, or what Ralf Grosse-Kunstleve calls
|
|
"Writing Python in C++". The work began with this <a
|
|
href="http://mail.python.org/pipermail/c++-sig/2002-June/001311.html">posting</a>,
|
|
which outlines the issues and intention.
|
|
|
|
<h2><a name="handle"><code>handle<T></code></a></h2>
|
|
|
|
The most basic element needed was a replacement for the
|
|
<code>reference<></code> class template and the
|
|
<code>ref</code> typedef from Boost.Python v1, a simple smart
|
|
pointer to a Python object. The old v1 typedef
|
|
"<code>ref</code>" (for
|
|
<code>reference<PyObject></code>) had to be retired because I
|
|
thought it would be too confusing given the importance of <code><a
|
|
href="../../../bind/ref.html">boost::ref</a>()</code> to this
|
|
library. I began a <a
|
|
href="http://mail.python.org/pipermail/c++-sig/2002-June/001311.html">discussion</a>of
|
|
possible names, and it was eventually <a
|
|
href="http://mail.python.org/pipermail/c++-sig/2002-June/001337.html">decided</a>
|
|
to rename <code>reference</code> to <code>handle</code> and supply a
|
|
default argument so that <code>ref</code> could be spelled
|
|
<code>handle<></code> without an additional typedef. There
|
|
were also some interface changes to make it safer and more-efficient
|
|
to interface with the raw
|
|
<code>PyObject*</code>s forced on us by Python's 'C' API. A
|
|
discussion of those protocols can be found <a
|
|
href="http://mail.python.org/pipermail/c++-sig/2002-June/001401.html">here</a>.
|
|
|
|
<h2><a name="handle"><code>object</code></a></h2>
|
|
|
|
It is intended that users will seldom need or want to work with
|
|
<code>handle<></code>; its major distinguishing features are
|
|
that it gives direct access to the underlying object representation
|
|
through <code>operator*</code> and <code>operator-></code>, and
|
|
that can be <code>NULL</code>, both sources of danger. Instead the
|
|
library provides a class called <code>object</code>, which
|
|
encapsulates a valid Python object and provides a similar interface to
|
|
Python's.
|
|
|
|
<h3><a name="operators"><code>object</code> operators</a></h3>
|
|
|
|
The first challenge was to provide support for object manipulations
|
|
using a Python-like syntax, mostly in the form of operator overloads:
|
|
|
|
<table border="1">
|
|
<tr><th>Python <th>C++
|
|
|
|
<tr>
|
|
<td><code>y = x.foo</code> <td><code>y = x.attr("foo");
|
|
<tr>
|
|
<td><code>x.foo = 1</code> <td><code>x.attr("foo") = 1;
|
|
|
|
<tr>
|
|
<td><code>y = x[z]</code> <td><code>y = x[z];
|
|
<tr>
|
|
<td><code>x[z] = 1</code> <td><code>x[z] = 1;
|
|
|
|
<tr>
|
|
<td><code>y = x[3:-1]</code> <td><code>y = x.slice(3,-1);
|
|
|
|
<tr>
|
|
<td><code>y = x[3:]</code> <td><code>y = x.slice(3,_);
|
|
|
|
<tr>
|
|
<td><code>y = x[:-2]</code> <td><code>y = x.slice(_,-2);
|
|
|
|
<tr>
|
|
<td><code>z = x(1, y)</code> <td><code>z = x(1, y);
|
|
<tr>
|
|
<td><code>z = x.f(1, y)</code> <td><code>z = x.attr("f")(1, y);
|
|
|
|
<tr>
|
|
<td><code>not x</code> <td><code>!x
|
|
|
|
<tr>
|
|
<td><code>x and y</code> <td><code>x and y
|
|
</table>
|
|
|
|
I'm still a unsatisfied with the interface for attribute access. There
|
|
original proposal used a syntax like this one:
|
|
<pre>
|
|
y = x._("foo");
|
|
x._("foo") = 1;
|
|
</pre>
|
|
|
|
which was only marginally better than what we've got. Niki Spahiev
|
|
then <a
|
|
href="http://mail.python.org/pipermail/c++-sig/2002-June/001447.html">pointed
|
|
out</a> a potential conflict with the macro which GNU Gettext <a
|
|
href="http://www.gnu.org/manual/gettext/html_mono/gettext.html#SEC6">suggests</a>
|
|
people define. This unfortunate state of affairs forced us into using
|
|
<code>attr</code> instead. I'd still like to find a better interface,
|
|
but the lack of overloadable C++ operators which aren't already used
|
|
in Python is an obstacle. The comma operator is still a possibility,
|
|
but it has the wrong precedence:
|
|
<pre>
|
|
y = x,"foo" // error
|
|
x,"foo" = 1; // error
|
|
|
|
y = (x,"foo"); // ok
|
|
(x,"foo") = 1; // ok
|
|
</pre>
|
|
|
|
Well, I guess we could consider adding that to the interface without
|
|
removing <code>attr()</code>, to see how it plays out...
|
|
|
|
<h3><a name="operators"><code>object</code> conversions</a></h3>
|
|
|
|
The <code>object</code> class also provided an opportunity to replace
|
|
Boost.Python v1's <code>to_python()</code> as a user-level
|
|
interface. Instead, <code>object</code> has a templated constructor
|
|
which can be used to convert any C++ object to Python using the same
|
|
underlying mechanisms used for the arguments to <code><a
|
|
href="call.html">call</a><></code>.
|
|
|
|
<p>Incidentally, the implementation of operator and conversion support
|
|
for object uncovered an inordinate number of compiler bugs in our
|
|
targeted platforms. It was a lot more "interesting" than it
|
|
should have been.
|
|
|
|
<h2><a name="list"><code>list</code></a></h2>
|
|
|
|
With <code>object</code> implemented, it was time to begin replacing
|
|
the ad-hoc implementations of <code>list</code>, <code>string</code>,
|
|
and <code>dictionary</code> supplied by Boost.Python v1 with something
|
|
more robust. I started with <code>list</code> as an example. Because
|
|
<code>object</code> already provides all of the requisite operators,
|
|
publicly deriving <code>list</code> from object seemed like a good
|
|
choice. The remaining issues were what do do about the one-argument
|
|
list constructor (which in Python attempts to convert its argument to
|
|
a list), and how to deal converting with <code>list</code> arguments
|
|
to wrapped functions. Some of the issues are laid out in <a
|
|
href="http://mail.python.org/pipermail/c++-sig/2002-June/001551.html">this
|
|
thread</a>. Ultimately, it was decided that <code>list(x)</code>
|
|
should do the same thing in C++ as in Python (conversion), while
|
|
<code>list</code> arguments should only match Python
|
|
<code>list</code>s (and <code>list</code> subclasses). The
|
|
implementation worked well, and provided a <a
|
|
href="http://mail.python.org/pipermail/c++-sig/2002-June/001586.html">roadmap</a>
|
|
for the protocol to be used for implementation of the other built-in
|
|
types.
|
|
|
|
<h2><a name="numerics">Numerics</a></h2>
|
|
|
|
Support for C++ <code>long long</code> and <code>unsigned long
|
|
long</code>
|
|
(and <code>__int64</code> on MSVC) to/from python conversions was
|
|
added this month. We also improved handling of numeric overflows when
|
|
converting, e.g., a Python int to a type with a more limited range of
|
|
representation.
|
|
|
|
<h2><a name="community">Community</a></h2>
|
|
|
|
<ul>
|
|
<li>Ralf W. Grosse-Kunstleve and Nick Sauter have implemented
|
|
<a href="http://cci.lbl.gov/boost/">multiplatform nightly
|
|
build-and-test</a> runs for Boost.Python V2 at LBL.
|
|
|
|
<li>Dave Hawkes has made significant progress on generating the
|
|
Python <a
|
|
href="http://mail.python.org/pipermail/c++-sig/2002-June/001503.html">built-in
|
|
function and API wrappers</a>
|
|
|
|
<li>Achim Domma has agreed to take up the job of implementing the
|
|
<code>str</code>, <code>dict</code>, and <code>tuple</code> classes.
|
|
</ul>
|
|
|
|
Deep thanks to all the Boost.Python contributors! This project
|
|
wouldn't be possible without your participation.
|
|
|
|
<h2><a name="next">What's Next</a></h2>
|
|
|
|
As I write this we are already well into the month of July, so I
|
|
suggest you consult the <a
|
|
href="http://mail.python.org/pipermail/c++-sig/2002-July/">Mailing
|
|
List Archive</a> if you want to know what's been happening. Otherwise
|
|
you'll just have to wait till next month (hopefully the beginning).
|
|
|
|
<p>Revised
|
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
|
13 November, 2002
|
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
|
</p>
|
|
<p><i>© Copyright <a href="http://www.boost.org/people/dave_abrahams.htm">Dave Abrahams</a>
|
|
2002. </i></p>
|
|
</body>
|
|
</html>
|