gpt4 book ai didi

python - Boost.Python : __init__ accepting None argument

转载 作者:行者123 更新时间:2023-12-01 06:18:42 25 4
gpt4 key购买 nike

我有一个用 Boost.Python 包装的 C++ 值类型,它有 NULL 值的概念。包装器代码的相关部分如下所示:

class_<TCurrency> currency( "TCurrency" )
.def( init<long>() )
.def( init<const std::string&>() )
<...>;

目前,尝试通过将 None 传递给 __init__() 方法来在 Python 中创建 NULL 实例,会导致接受 const 字符串引用的 C++ 构造函数被调用无效引用。 (&arg == NULL)

是否可以捕获将 None 传递给构造函数的情况并优雅地处理它,或者至少在我的程序崩溃之前抛出一个有意义的异常?

使用 Boost 1.36 和 Python 2.6.2。

最佳答案

添加 init<void*>如果使用 None ,重载将传递 NULL,但我不确定这会如何影响极端情况下的其他因素。如果我离开 init<void*> ,我也不会得到您提到的相同的 None 到 string const& 转换出去。使用Boost.Python 1.37和Python 2.6.2。

示例:

#include <iostream>
#include <string>

#include <boost/python.hpp>


struct A {
#define BODY { std::cout << __PRETTY_FUNCTION__ << '\n'; }
A() BODY
A(long) BODY
A(std::string const&) BODY
A(void* p) BODY
#undef BODY
};

BOOST_PYTHON_MODULE(ex) {
using namespace boost::python;
class_<A>("A")
.def(init<long>())
.def(init<std::string const&>())
.def(init<void*>())
;
}
>>> import ex>>> ex.A()A::A()<ex.A object at 0x839bf7c>>>> ex.A(42)A::A(long int)<ex.A object at 0x839bfcc>>>> ex.A("abc")A::A(const std::string&)<ex.A object at 0x839bf7c>>>> ex.A(None)A::A(void*)<ex.A object at 0x839bfcc>

如果init<void*>被遗漏了:

>>> ex.A(None)Traceback (most recent call last):  File "<stdin>", line 1, in <module>Boost.Python.ArgumentError: Python argument types in    A.__init__(A, NoneType)did not match C++ signature:    __init__(_object*, std::string)    __init__(_object*, long)    __init__(_object*)

关于python - Boost.Python : __init__ accepting None argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1830902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com