Boost.Python - <boost/python/object.hpp>

###  | # Boost.Python ## Header <boost/python/object.hpp>

## Contents

Introduction
Types
  slice_nil
Classes
  Class `const_attribute_policies`
    Class `const_attribute_policies` synopsis
    Class `const_attribute_policies` static functions
  Class `attribute_policies`
    Class `attribute_policies` synopsis
    Class `attribute_policies` static functions
  Class `const_objattribute_policies`
    Class `const_objattribute_policies` synopsis
    Class `const_objattribute_policies` static functions
  Class `objattribute_policies`
    Class `objattribute_policies` synopsis
    Class `objattribute_policies` static functions
  Class `const_item_policies`
    Class `const_item_policies` synopsis
    Class `const_item_policies` static functions
  Class `item_policies`
    Class `item_policies` synopsis
    Class `item_policies` static functions
  Class `const_slice_policies`
    Class `const_slice_policies` synopsis
    Class `const_slice_policies` static functions
  Class `slice_policies`
    Class `slice_policies` synopsis
    Class `slice_policies` static functions
  Class `object_operators`
    Class `object_operators` synopsis
    Class `object_operators` observer functions
  Class `object`
    Class `object` synopsis
    Class `object` constructors and destructor
    Class template `object` modifier functions
    Class template `object` observer functions
  Class template `proxy`
    Class template `proxy` synopsis
    Class template `proxy` modifier functions
    Class template `proxy` observer functions
Functions
  del
  comparisons
  binary operations
  assignment operations
  operators
  len()
Example

## Introduction

Exposes the generic Python object wrapper class `object`, and related classes. In order to avoid some potenential problems with argument-dependent lookup and the generalized operators defined on `object`, all these facilities are defined in `namespace boost::python::api`, and `object` is imported into `namespace boost::python` with a using-declaration.

## Types

    class slice_nil;
    static const _ = slice_nil();

A type that can be used to get the effect of leaving out an index in a Python slice expression:

    >>> x[:-1]
    >>> x[::-1]

C++ equivalent:

    x.slice(_,-1)
    x[slice(_,_,-1)]

## Classes

### Class `const_attribute_policies`

The policies which are used for proxies representing an attribute access to a `const object`.

#### Class `const_attribute_policies` synopsis

    namespace boost { namespace python { namespace api
    {
      struct const_attribute_policies
      {
          typedef char const* key_type;
          static object get(object const& target, char const* key);
      };
    }}}

#### Class `const_attribute_policies` static functions

    static object get(object const& target, char const* key);

Requires: `key` is an ntbs.
Effects: accesses the attribute of `target` named by `key`.
Returns: An `object` managing the result of the attribute access.
Throws: `error_already_set` if a Python exception is raised.

### Class `attribute_policies`

The policies which are used for proxies representing an attribute access to a mutable `object`.

#### Class `attribute_policies` synopsis

    namespace boost { namespace python { namespace api
    {
      struct attribute_policies : const_attribute_policies
      {
          static object const& set(object const& target, char const* key, object const& value);
          static void del(object const&target, char const* key);
      };
    }}}

#### Class `attribute_policies` static functions

    static object const& set(object const& target, char const* key, object const& value);

Requires: `key` is an ntbs.
Effects: sets the attribute of `target` named by `key` to `value`.
Throws: `error_already_set` if a Python exception is raised.

    static void del(object const&target, char const* key);

Requires: `key` is an ntbs.
Effects: deletes the attribute of `target` named by `key`.
Throws: `error_already_set` if a Python exception is raised.

### Class `const_objattribute_policies`

The policies which are used for proxies representing an attribute access to a `const object` when the attribute name is given as a `const object`.

#### Class `const_objattribute_policies` synopsis

    namespace boost { namespace python { namespace api
    {
      struct const_objattribute_policies
      {
          typedef object const& key_type;
          static object get(object const& target, object const& key);
      };
    }}}

#### Class `const_objattribute_policies` static functions

    static object get(object const& target, object const& key);

Requires: `key` is an `object` holding a string.
Effects: accesses the attribute of `target` named by `key`.
Returns: An `object` managing the result of the attribute access.
Throws: `error_already_set` if a Python exception is raised.

### Class `objattribute_policies`

The policies which are used for proxies representing an attribute access to a mutable `object` when the attribute name is given as a `const object`.

#### Class `objattribute_policies` synopsis

    namespace boost { namespace python { namespace api
    {
      struct objattribute_policies : const_objattribute_policies
      {
          static object const& set(object const& target, object const& key, object const& value);
          static void del(object const&target, object const& key);
      };
    }}}

#### Class `objattribute_policies` static functions

    static object const& set(object const& target, object const& key, object const& value);

Requires: `key` is an `object` holding a string.
Effects: sets the attribute of `target` named by `key` to `value`.
Throws: `error_already_set` if a Python exception is raised.

    static void del(object const&target, object const& key);

Requires: `key` is an `object` holding a string.
Effects: deletes the attribute of `target` named by `key`.
Throws: `error_already_set` if a Python exception is raised.

### Class `const_item_policies`

The policies which are used for proxies representing an item access (via the Python bracket operators `[]`) to a `const object`.

#### Class `const_item_policies` synopsis

    namespace boost { namespace python { namespace api
    {
      struct const_item_policies
      {
          typedef object key_type;
          static object get(object const& target, object const& key);
      };
    }}}

#### Class `const_item_policies` static functions

    static object get(object const& target, object const& key);

Effects: accesses the item of `target` specified by `key`.
Returns: An `object` managing the result of the item access.
Throws: `error_already_set` if a Python exception is raised.

### Class `item_policies`

The policies which are used for proxies representing an item access (via the Python bracket operators `[]`) to a mutable `object`.

#### Class `item_policies` synopsis

    namespace boost { namespace python { namespace api
    {
      struct item_policies : const_item_policies
      {
          static object const& set(object const& target, object const& key, object const& value);
          static void del(object const& target, object const& key);
      };
    }}}

#### Class `item_policies` static functions

    static object const& set(object const& target, object const& key, object const& value);

Effects: sets the item of `target` specified by `key` to `value`.
Throws: `error_already_set` if a Python exception is raised.

    static void del(object const& target, object const& key);

Effects: deletes the item of `target` specified by `key`.
Throws: `error_already_set` if a Python exception is raised.

### Class `const_slice_policies`

The policies which are used for proxies representing an slice access (via the Python slice notation `[`x`:`y`]`) to a `const object`.

#### Class `const_slice_policies` synopsis

    namespace boost { namespace python { namespace api
    {
      struct const_slice_policies
      {
          typedef std::pair<handle<>, handle<> > key_type;
          static object get(object const& target, key_type const& key);
      };
    }}}

#### Class `const_slice_policies` static functions

    static object get(object const& target, key_type const& key);

Effects: accesses the slice of `target` specified by `key`.
Returns: An `object` managing the result of the slice access.
Throws: `error_already_set` if a Python exception is raised.

### Class `slice_policies`

The policies which are used for proxies representing an slice access to a mutable `object`.

#### Class `slice_policies` synopsis

    namespace boost { namespace python { namespace api
    {
      struct slice_policies : const_slice_policies
      {
          static object const& set(object const& target, key_type const& key, object const& value);
          static void del(object const& target, key_type const& key);
      };
    }}}

#### Class `slice_policies` static functions

    static object const& set(object const& target, key_type const& key, object const& value);

Effects: sets the slice of `target` specified by `key` to `value`.
Throws: `error_already_set` if a Python exception is raised.

    static void del(object const& target, key_type const& key);

Effects: deletes the slice of `target` specified by `key`.
Throws: `error_already_set` if a Python exception is raised.

### Class template `object_operators<U>`

This is the base class of `object` and its `proxy` template used to supply common interface: member functions, and operators which must be defined within the class body. Its template parameter `U` is expected to be a class derived from `object_operators<U>`. In practice users should never use this class directly, but it is documented here because it supplies important interface to `object` and its proxies.

#### Class template `object_operators` synopsis

    namespace boost { namespace python { namespace api
    {
      template <class U>
      class object_operators
      {
       public:
          // function call
          //
          object operator()() const;

          template <class A0>
          object operator()(A0 const&) const;
          template <class A0, class A1>
          object operator()(A0 const&, A1 const&) const;
          ...
          template <class A0, class A1,...class An>
          object operator()(A0 const&, A1 const&,...An const&) const;

          detail::args_proxy operator* () const;
          object operator()(detail::args_proxy const &args) const;
          object operator()(detail::args_proxy const &args,
                            detail::kwds_proxy const &kwds) const;

          // truth value testing
          //
          typedef unspecified bool_type;
          operator bool_type() const;

          // Attribute access
          //
          proxy<const_object_attribute> attr(char const*) const;
          proxy<object_attribute> attr(char const*);
          proxy<const_object_objattribute> attr(object const&) const;
          proxy<object_objattribute> attr(object const&);

          // item access
          //
          template <class T>
          proxy<const_object_item> operator[](T const& key) const;

          template <class T>
          proxy<object_item> operator[](T const& key);

          // slicing
          //
          template <class T, class V>
          proxy<const_object_slice> slice(T const& start, V const& end) const

          template <class T, class V>
          proxy<object_slice> slice(T const& start, V const& end);
      };
    }}}

#### Class template `object_operators` observer functions

    object operator()() const;
    template <class A0>
    object operator()(A0 const&) const;
    template <class A0, class A1>
    object operator()(A0 const&, A1 const&) const;
    ...
    template <class A0, class A1,...class An>
    object operator()(A0 const& a1, A1 const& a2,...An const& aN) const;

Effects: call<object>(object(*static_cast<U*>(this)).ptr(), a1, a2,...aN)

    object operator()(detail::args_proxy const &args) const;

Effects: call object with arguments given by the tuple args

    object operator()(detail::args_proxy const &args,
                      detail::kwds_proxy const &kwds) const;

Effects: call object with arguments given by the tuple args, and named arguments given by the dictionary kwds

    operator bool_type() const;

Effects: Tests truth value of `*this`.
Returns: call<object>(object(*static_cast<U*>(this)).ptr(), a1, a2,...aN)

    proxy<const_object_attribute> attr(char const* name) const;
    proxy<object_attribute> attr(char const* name);

Requires: name is an ntbs.
Effects: accesses the named attribute of `*this`.
Returns: a proxy object which binds `object(*static_cast<U*>(this))` as its target, and `name` as its key.

    proxy<const_object_objattribute> attr(const object& name) const;
    proxy<object_objattribute> attr(const object& name);

Requires: name is a `object` holding a string.
Effects: accesses the named attribute of `*this`.
Returns: a proxy object which binds `object(*static_cast<U*>(this))` as its target, and `name` as its key.

    template <class T>
    proxy<const_object_item> operator[](T const& key) const;
    template <class T>
    proxy<object_item> operator[](T const& key);

Effects: accesses the item of `*this` indicated by `key`.
Returns: a proxy object which binds `object(*static_cast<U*>(this))` as its target, and `object(key)` as its key.

    template <class T, class V>
    proxy<const_object_slice> slice(T const& start; start, V const& finish) const
    template <class T, class V>
    proxy<object_slice> slice(T const& start; start, V const& finish);

Effects: accesses the slice of `*this` indicated by `std::make_pair(object(start), object(finish))`.
Returns: a proxy object which binds `object(*static_cast<U*>(this))` as its target, and `std::make_pair(object(start), object(finish))` as its key.

### Class `object`

The intention is that `object` acts as much like a Python variable as possible. Thus expressions you'd expect to work in Python should generally work in the same way from C++. Most of `object`'s interface is provided by its base class `object_operators<object>`, and the free functions defined in this header.

#### Class `object` synopsis

    namespace boost { namespace python { namespace api
    {
      class object : public object_operators<object>
      {
       public:
          object();

          object(object const&);

          template <class T>
          explicit object(T const& x);

          ~object();

          object& operator=(object const&);

          PyObject* ptr() const;

          bool is_none() const;
      };
    }}}

#### Class `object` constructors and destructor

    object();

Effects: Constructs an object managing a reference to the Python `None` object.
Throws: nothing.

    template <class T>
    explicit object(T const& x);

Effects: converts `x` to python and manages a reference to it.
Throws: `error_already_set` and sets a Python `TypeError` exception if no such conversion is possible.

    ~object();

Effects: decrements the reference count of the internally-held object.

#### Class `object` modifiers

    object& operator=(object const& rhs);

Effects: increments the reference count of the object held by `rhs` and decrements the reference count of the object held by `*this`.

#### Class `object` observers

    PyObject* ptr() const;

Returns: a pointer to the internally-held Python object.

    bool is_none() const;

Returns: result of (ptr() == Py_None)

### Class template `proxy`

This template is instantiated with various Policies described in this document in order to implement attribute, item, and slice access for `object`. It stores an object of type `Policies::key_type`.

#### Class template `proxy` synopsis

    namespace boost { namespace python { namespace api
    {
      template <class Policies>
      class proxy : public object_operators<proxy<Policies> >
      {
       public:
          operator object() const;

          proxy const& operator=(proxy const&) const;
          template <class T>
          inline proxy const& operator=(T const& rhs) const;

          void del() const;

          template <class R>
          proxy operator+=(R const& rhs);
          template <class R>
          proxy operator-=(R const& rhs);
          template <class R>
          proxy operator*=(R const& rhs);
          template <class R>
          proxy operator/=(R const& rhs);
          template <class R>
          proxy operator%=(R const& rhs);
          template <class R>
          proxy operator<<=(R const& rhs);
          template <class R>
          proxy operator>>=(R const& rhs);
          template <class R>
          proxy operator&=(R const& rhs);
          template <class R>
          proxy operator|=(R const& rhs);
      };
    }}}

#### Class template `proxy` observer functions

    operator object() const;

Effects: applies `Policies::get(`target`,` key `)` with the proxy's target and key objects.

#### Class template `proxy` modifier functions

    proxy const& operator=(proxy const& rhs) const;
    template <class T>
    inline proxy const& operator=(T const& rhs) const;

Effects: `Policies::set(`target`,` key `, object(rhs))` with the proxy's target and key objects.

    template <class R>
    proxy operator+=(R const& rhs);
    template <class R>
    proxy operator-=(R const& rhs);
    template <class R>
    proxy operator*=(R const& rhs);
    template <class R>
    proxy operator/=(R const& rhs);
    template <class R>
    proxy operator%=(R const& rhs);
    template <class R>
    proxy operator<<=(R const& rhs);
    template <class R>
    proxy operator>>=(R const& rhs);
    template <class R>
    proxy operator&=(R const& rhs);
    template <class R>
    proxy operator|=(R const& rhs);

Effects: for a given operator@=, `object(*this) @= rhs;`
Returns: `*this`

    void del() const;

Effects: `Policies::del(`target`,` key `)` with the proxy's target and key objects.

## Functions

    template <class T>
    void del(proxy<T> const& x);

Effects: x.del()

    template<class L,class R> object operator>(L const&l,R const&r);
    template<class L,class R> object operator>=(L const&l,R const&r);
    template<class L,class R> object operator<(L const&l,R const&r);
    template<class L,class R> object operator<=(L const&l,R const&r);
    template<class L,class R> object operator==(L const&l,R const&r);
    template<class L,class R> object operator!=(L const&l,R const&r);

Effects: returns the result of applying the operator to `object(l)` and `object(r)`, respectively, in Python.

    template<class L,class R> object operator+(L const&l,R const&r);
    template<class L,class R> object operator-(L const&l,R const&r);
    template<class L,class R> object operator*(L const&l,R const&r);
    template<class L,class R> object operator/(L const&l,R const&r);
    template<class L,class R> object operator%(L const&l,R const&r);
    template<class L,class R> object operator<<(L const&l,R const&r);
    template<class L,class R> object operator>>(L const&l,R const&r);
    template<class L,class R> object operator&(L const&l,R const&r);
    template<class L,class R> object operator^(L const&l,R const&r);
    template<class L,class R> object operator|(L const&l,R const&r);

Effects: returns the result of applying the operator to `object(l)` and `object(r)`, respectively, in Python.

    template<class R> object& operator+=(object&l,R const&r);
    template<class R> object& operator-=(object&l,R const&r);
    template<class R> object& operator*=(object&l,R const&r);
    template<class R> object& operator/=(object&l,R const&r);
    template<class R> object& operator%=(object&l,R const&r);
    template<class R> object& operator<<=(object&l,R const&r)
    template<class R> object& operator>>=(object&l,R const&r);
    template<class R> object& operator&=(object&l,R const&r);
    template<class R> object& operator^=(object&l,R const&r);
    template<class R> object& operator|=(object&l,R const&r);

Effects: assigns to l the result of applying the corresponding Python inplace operator to `l` and `object(r)`, respectively.
Returns: `l`.

    inline long len(object const& obj);

Effects: PyObject_Length(obj.ptr())
Returns: len() of object.

## Example

Python code:

    def sum_items(seq):
       result = 0
       for x in seq:
          result += x
       return result

C++ version:

    object sum_items(object seq)
    {
       object result = object(0);
       for (int i = 0; i < len(seq); ++i)
          result += seq[i];
       return result;
    }

Revised 15 March, 2010

© Copyright Dave Abrahams 2008.