我应该丢弃 boost::python::exec 的 return 值吗?

Should I throw away the return value of boost::python::exec?

我正在用 C++ 和 boost::python 编写程序,boost::python::exec return 对我来说似乎很奇怪。例如,在 docs here 中,它表示:

Effects

Execute Python source code from code in the context specified by the dictionaries globals and locals.

Returns

An instance of object which holds the result of executing the code.

然而 python 3's exec 函数的文档说:

The return value is None.

那么,如果函数总是 returns none,那么 returning 有什么意义呢?为什么不把它变成一个 void 函数,或者更好的是,如果出现问题,让它 return 一个 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 从未 return 编辑过 None 以外的对象。

任何情况下,是否有曾经保持return值[=14]的理由=] 打电话,还是我应该总是把它扔掉?

Python 中 void 函数的概念是没有 return 值的概念。如果您尝试分配 void 函数的结果,结果将始终为 None.

Boost::Python 似乎在 py::exec 的实现中遵循了这一点,尽管这并不奇怪,因为即使是 CPython PyRun_String 函数 py::exec 调用 returns 一个 PyObject 总是 None.

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