| <!-- 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> |