无法调用需要双列表的函数

Cannot call function that expects list of double

我正在测试 python 库,它是 SWIG 包装器。

这个库中的一个函数是:

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

据我所知,这个函数应该采用双精度或三个双精度的列表。

当我用三个数字调用它时,它起作用了:

>>> 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)

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


不确定这是否有用,但是当我调用 returns 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]

*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])