Wrapping C++ control objects¶
C++ control objects defined using the LSST_CONTROL_FIELD
macro in lsst/pex/config.h
can be wrapped using pybind11 and the functions in lsst.pex.config.wrap
, creating an equivalent Python Config
object.
The Config
will automatically create and set values in the C++ object, will provide access to the doc strings from C++, and will even call the C++ class’s validate
method, if one exists.
This helps to minimize duplication of code.
For example, here is a C++ control object:
struct FooControl {
LSST_CONTROL_FIELD(bar, int, "documentation for field 'bar'");
LSST_CONTROL_FIELD(baz, double, "documentation for field 'baz'");
FooControl() : bar(0), baz(0.0) {}
};
Note that only bool
, int
, double
, and std::string
fields, along with std::list
and std::vector
objects of those types, are fully supported.
Nested control objects are not supported.
After using pybind11, the preferred way to create the Config
is via the wrap
decorator:
import lsst.pex.config as pexConfig
@pexConfig.wrap(FooControl)
class FooConfig(pexConfig.Config):
pass