我正在测试一个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]
答案 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])