假设我有以下SWIG接口文件
%include "std_string.i"
%module Test %{
std::string AmIABoolean(bool b)
{
return b ? "Sure" : "Yes I am";
}
%}
std::string AmIABoolean(bool b);
当从Python接口此模块时,实际传递布尔值时效果很好。
>>> Test.AmIABoolean(False)
"Yes I am"
>>> Test.AmIABoolean(True)
'Sure'
但令我惊讶的是(并且令人沮丧)SWIG接受了这个特定测试函数的任何论据
>>> Test.AmIABoolean([])
"Yes I am"
>>> Test.AmIABoolean("Free beer")
'Sure'
有没有办法在SWIG将C ++与python方法匹配的方式中强制执行更严格的类型检查?显然这个例子不是很有意义,但如果我有一个带有多个重载的方法并且一个接受一个布尔参数,这意味着SWIG总是为那个接受布尔值的特定重载而去,这是非常不受欢迎的。
看看SWIG在接口文件中检查布尔类型的方式,这种行为并不太令人惊讶
SWIGINTERN int
SWIG_AsVal_bool (PyObject *obj, bool *val)
{
int r = PyObject_IsTrue(obj);
if (r == -1)
return SWIG_ERROR;
if (val) *val = r ? true : false;
return SWIG_OK;
}
正如Python文档中提到的关于PyObject_IsTrue
的以下内容如果对象o被认为是真,则返回1,否则返回0。 这相当于Python表达式而不是o。失败的时候 返回-1。
在动态打字的精彩世界中,“免费啤酒”始终评估为真实
>>> not not "Free beer"
True
但肯定的是,SWIG必须能够区分 为true的值和恰好评估为true的值。非常感谢任何帮助。