c++ - 我应该丢弃 boost::python::exec 的返回值吗?

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

我正在用 C++ 和 boost::python 编写一个程序,我觉得 boost::python::exec 返回任何东西似乎很奇怪.例如,在 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.

那么,如果函数始终不返回任何值,那么返回任何值有什么意义呢?为什么不让它成为一个 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 对象。

那么曾经,在任何情况下是否有理由保留boost::python::exec调用的返回值,还是我应该总是把它扔掉?

最佳答案

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

Boost::Python 在 py::exec 的实现中似乎遵循了这一点,尽管这并不奇怪,因为即使是 py 的 CPython PyRun_String 函数::exec 调用返回一个始终为 NonePyObject

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

关于c++ - 我应该丢弃 boost::python::exec 的返回值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39520823/

相关文章:

python - 如何获取 FFMPEG Progress 以创建进度条?

c - g++-4.6.real : error: unrecognized option '-R'

c++ - 在 std::map 中插入一个 boost::unique_ptr

c++ - 如何在 3D 中对 QML 旋转变换进行动画处理和属性插值

python-3.x - 为什么它说从未等待过获取功能?

python - 在 numpy 数组中按最大值或最小值分组

c++ - boost 共享内存 : vector of char *

c++ - 从函数返回时对象被销毁

c++ - Doxygen 没有为函数添加文档

c++ - 所有边的edge_index都为零?