无法调用期望双重列表的函数

时间:2018-01-03 02:22:44

标签: python swig

我正在测试一个SWIG包装器的python库。

该库中的一个功能是:

def point_inside(self, *args) -> "bool":
    return _vulcanpy.TRI_triangulation_t_point_inside(self, *args)

据我所知,这个函数应该是一个double或三个double的列表。

当我用三个号码打电话时,它有效:

>>> tri.point_inside(100,100,100)  
True

当我用一个数字列表调用它时,它失败了:

>>> tri.point_inside([100,100,100])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\Maptek\Vulcan 10.1\bin\exe\lib\site-packages\vulcan.py", line 1551, in point_inside
    return _vulcanpy.TRI_triangulation_t_point_inside(self, *args)
NotImplementedError: Wrong number or type of arguments for overloaded function 'TRI_triangulation_t_point_inside'.
  Possible C/C++ prototypes are:
    TRI_triangulation_t::point_inside(double_list)
    TRI_triangulation_t::point_inside(double,double,double)

我是否缺少一些正确调用第二个过载的语法?

不确定这是否有用,但是当我调用另一个返回双精度列表的函数时,我得到了明显的结果。

def get_elevations(self, x: 'double', y: 'double') -> "double_list":
    return _vulcanpy.TRI_triangulation_t_get_elevations(self, x, y)

>>> tri.get_elevations(100,100)
[88.0, 88.0, 112.0, 112.0]

1 个答案:

答案 0 :(得分:1)

*args表示接受一系列参数,然后在函数定义中使用时将它们包装到一个变量args中。并且意味着在使用传递参数时解包所有参数。

在您的第一个示例中,args=(100, 100, 100),因此调用_vulcanpy.TRI_triangulation_t_point_inside(self, *args)等于_vulcanpy.TRI_triangulation_t_point_inside(self, 100, 100, 100)

在你的第二个例子中,如果我理解你,你想让它只使用一个列表参数。

在这种情况下,您需要手动确定参数的类型:

def point_inside(self, double_or_list, *args) -> "bool":
    if isinstance(double_or_list, list):
        return _vulcanpy.TRI_triangulation_t_point_inside(self, *double_or_list)
    else:
        return _vulcanpy.TRI_triangulation_t_point_inside(self, double_or_list, *args)

更新

或者您可以先打开列表tri.point_inside(*[100,100,100])