Python参数类型c++签名

Python argument types C++ signature

本文关键字:签名 c++ 类型 参数 Python      更新时间:2023-10-16

我有两个问题,都与Python和c++之间的参数如何混合有关…我有一个从python调用的c++函数,我的函数接受日期和字符串。

python str是否与c++

相同?
class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >

其次,我的函数需要class boost::gregorian::date类型的日期,有人知道我如何在python中给出一个将被正确签名读取的日期吗?

帮助非常感谢!我希望这是一个相当简单的问题,我只是对不同类型的签名不是很有经验(这对我目前链接Python和c++的实验来说不是一个好兆头)!

假设您正在使用boost::python,让我给您一个如何在这些情况下进行的想法。不是让boost::python自动包装您的函数,而是提供您自己的包装:

    namespace {
        void Foo_methodUsingDate( Foo* pointer, const object& dateObject )
        {
            boost::gregorian::date date = convertFromPython( dateObject );
            pointer->methodUsingDate( date );
        }
    }
    void wrap_Foo()
    {
        class_< Foo >( "Foo" )
            .def( "bar",
                & Foo::bar
                )
            .def( "foobar",
                & Foo::foobar
                )
            .def( "methodUsingDate",
                & Foo_methodUsingDate
                )
            ;
    }

当然你需要提供一个将boost::python::object对象转换为boost::gregorian::date对象的方法。你得决定怎么处理这件事。例如,你可以假设参数是一个由三个整数组成的序列,或者你可以允许更复杂的方式传递参数,或者定义一个新的类来包装阳历日期和它的所有方法,并直接将其公开给Python。

关于你的第一个问题,当使用boost::python时,std::string s会自动从Python字符串转换为/。

No。为了从C或c++调用Python函数,您必须使用Python C API。在c++字符串的情况下,这意味着first使用PyString_FromStringAndSize( cppString.data(), cppString.size() )将其转换为Python字符串,并传入结果PyObject。如果你想调用任意函数,你必须使用PyImport_Import加载模块,然后使用PyObject_GetAttrString来获取函数(Python函数是属性,就像其他所有内容),然后使用PyObject_CallObject在之后调用它转换所有参数并将它们放入元组(都通过Python C API中的函数)。