C ++函数使用布尔参数和SWIG python

时间:2012-10-20 15:38:27

标签: c++ python types swig

假设我有以下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的值。非常感谢任何帮助。

0 个答案:

没有答案