我正在用C ++和boost::python
编写一个程序,对我来说,boost::python::exec
返回任何内容似乎很奇怪。例如,在docs here中,它说:
效果
从字典全局和本地语言指定的上下文中的代码执行Python源代码。
返回
保存执行代码结果的对象实例。
然而python 3's exec
函数的文档说:
返回值为
None
。
那么如果函数总是返回任何东西,返回任何内容的重点是什么?为什么不让它成为void
函数,或者甚至更好,如果出现问题它会返回python错误?或许,我只是误解了文档,毕竟有一些有用的东西。这就是我问这个问题的原因。
当我试图解决这个问题时,我尝试了这个示例程序:
#include <boost\python.hpp>
#include <iostream>
int main()
{
using namespace boost::python;
Py_Initialize();
object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
while (true)
{
try
{
std::cout << ">>> ";
std::string comm;
std::getline(std::cin, comm);
if (comm == "exit")
break;
object bar = exec(comm.c_str(), main_namespace);
if (bar.is_none())
std::cout << "None\n";
}
catch (error_already_set const &)
{
PyErr_Print();
}
}
}
似乎exec
从未返回不是None
的对象。
?
答案 0 :(得分:0)
Python中的void函数的概念是没有返回值的概念。如果您尝试分配void函数的结果,结果将始终为var elems = document.querySelectorAll('li > div[name ^= "abc"][id].someClass');
。
Boost :: Python似乎在None
的实现中遵循这一点,尽管这并不奇怪,即使py::exec
调用的CPython PyRun_String
函数返回py::exec
总是PyObject
。
所以要回答你的问题,是的,你可以忽略返回值。