Utilities¶
Evaluating Python expressions from strings¶
nanobind provides the eval()
and exec()
functions to
evaluate Python expressions and statements. The following example illustrates
how they can be used.
// At beginning of file
#include <nanobind/eval.h>
...
// Evaluate in scope of main module
nb::object scope = nb::module_::import_("__main__").attr("__dict__");
// Evaluate an isolated expression
int result = nb::eval("my_variable + 10", scope).cast<int>();
// Evaluate a sequence of statements
nb::exec(
"print('Hello')\n"
"print('world!');",
scope);
C++11 raw string literals are also supported and quite handy for this purpose.
The only requirement is that the first statement must be on a new line
following the raw string delimiter R"(
, ensuring all lines have common
leading indent:
nb::exec(R"(
x = get_answer()
if x == 42:
print('Hello World!')
else:
print('Bye!')
)", scope
);
Note
eval()
accepts a template parameter that describes how the
string/file should be interpreted. Possible choices include eval_expr
(isolated expression), eval_single_statement
(a single statement,
return value is always none
), and eval_statements
(sequence of
statements, return value is always none
). eval()
defaults to
eval_expr
and exec()
is just a shortcut for eval<eval_statements>
.