我应该扔掉boost :: python :: exec的返回值吗?

时间:2016-09-15 21:44:51

标签: c++ python-3.x boost boost-python

我正在用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的对象。

1 个答案:

答案 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

所以要回答你的问题,是的,你可以忽略返回值。