我使用的是Inline::Python 0.56,试图从Perl调用带有命名参数的Python函数。我已经用一个可以根据请求运行的示例替换了原始代码片段:
use strict;
use warnings;
use 5.16.3;
use Inline Python => <<'END_OF_PYTHON_CODE';
# Interface
def get_sbom_of_package (
package_name = None,
target_path = None,
):
assert package_name is not None
assert target_path is not None
print ( package_name, target_path )
return package_name
END_OF_PYTHON_CODE
my $package = 'thePackage';
my $target_path = $ENV{HOME};
my $sbp = get_sbom_of_package(
package_name => $package ,
target_path => $target_path
);
say $sbp;我的错误是:
TypeError: get_sbom_of_package() takes from 0 to 2 positional arguments but 8 were given at (eval 3) line 3.我是否还需要做一些内联Python来理解我是在给它命名参数呢?我将Perl中的调用替换为
my $sbp = get_sbom_of_package(
$package ,
$target_path
);而且效果很好。我在想要么是
从最有可能排序到最少。:-)
发布于 2022-09-14 21:22:19
发布于 2022-09-14 20:41:39
如果我正确地读取XS并记住我的Python扩展模块的工作,这是不可能的。
Inline::Python似乎使用传递参数元组的PyObject_CallObject调用py调用-没有任何命名/关键字args。
因此,您必须自己动手,也许通过在py可调用的周围放置一个包装器,这个包装器理解parameter => value, ...的含义,并构造正确的元组来传递。当然,您也需要冗余地知道默认值。您可以通过rev Inline::Python来支持查询可调用的签名以查找关键字args .但是,您仍然需要调整这些语义,以适应普通Perl子程序自己调用的语义。
https://stackoverflow.com/questions/73721907
复制相似问题