首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Perl调用命名参数Python函数?

如何从Perl调用命名参数Python函数?
EN

Stack Overflow用户
提问于 2022-09-14 18:55:55
回答 2查看 192关注 0票数 1

我使用的是Inline::Python 0.56,试图从Perl调用带有命名参数的Python函数。我已经用一个可以根据请求运行的示例替换了原始代码片段:

代码语言:javascript
复制
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;

我的错误是:

代码语言:javascript
复制
TypeError: get_sbom_of_package() takes from 0 to 2 positional arguments but 8 were given at (eval 3) line 3.

我是否还需要做一些内联Python来理解我是在给它命名参数呢?我将Perl中的调用替换为

代码语言:javascript
复制
my $sbp = get_sbom_of_package(
    $package ,
    $target_path
);

而且效果很好。我在想要么是

  • 对我来说不好的Python或者
  • 内联::Python配置问题
  • 内联::Python限制

从最有可能排序到最少。:-)

EN

回答 2

Stack Overflow用户

发布于 2022-09-14 21:22:19

票数 2
EN

Stack Overflow用户

发布于 2022-09-14 20:41:39

如果我正确地读取XS并记住我的Python扩展模块的工作,这是不可能的。

Inline::Python似乎使用传递参数元组的PyObject_CallObject调用py调用-没有任何命名/关键字args。

因此,您必须自己动手,也许通过在py可调用的周围放置一个包装器,这个包装器理解parameter => value, ...的含义,并构造正确的元组来传递。当然,您也需要冗余地知道默认值。您可以通过rev Inline::Python来支持查询可调用的签名以查找关键字args .但是,您仍然需要调整这些语义,以适应普通Perl子程序自己调用的语义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73721907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档