透明地通过带有可变参数列表的函数

Posted

技术标签:

【中文标题】透明地通过带有可变参数列表的函数【英文标题】:Transparently passing through a function with a variable argument list 【发布时间】:2021-04-20 20:53:55 【问题描述】:

我正在使用 Python RPyC 在两台机器之间进行通信。由于链接可能容易出错,我希望有一个通用包装函数,它以远程函数名称和该函数的参数作为输入,进行一些状态检查,使用参数调用函数,进行更多状态检查和然后返回函数调用的结果。包装器不应该知道函数,它的参数/参数类型或它们的数量,或者返回值,用户必须正确理解;它应该只是透明地通过它们。

我得到getattr(conn.root, function)() 模式来调用函数,但我的Python 专业知识在填充参数时用完了。我已经阅读了关于使用*arg**kwarg 的各种帖子,尤其是this one,这表明我想要做的事情要么困难要么不可能。这是正确的吗?如果是这样,如果我确保所有函数参数都是关键字参数,是否有一个可行的方案?

我确实拥有这个接口的两端(调用者和被调用者),因此我可以安排对所有函数参数进行字典化,但如果我可以避免的话,我宁愿不要让我的 API 太奇特。

编辑:被调用的东西,在链接的远端,是一个具有非常普通方法的类,例如;

def exposed_a(self)
def exposed_b(self, thing1)
def exposed_c(self, thing1=None)
def exposed_d(self, thing1=DEFAULT_VALUE1, thing2=None)
def exposed_e(self, thing1, thing2, thing3=DEFAULT_VALUE1, thing4=None)
def exposed_f(self, thing1=None, thing2=None)

...其中每个参数(和返回值)的类型可以是字符串、字典、数字或列表。

【问题讨论】:

不,这并不困难或根本不可能,这很简单......除非你想使用可变参数和记忆,这就是链接问题的意义所在。 好吧,传递给函数的参数数量是未知的,它们是位置还是关键字也是未知的:什么结构可以让我透明地传递这些参数?嵌入式 C 程序员试图在这里了解 Python... 请在您的问题中添加一个具体示例。 @Rob 你需要添加一个具体的例子。你的论点是什么形式的?一般来说,你可以有一个位置参数的序列(例如列表、元组)['foo', 'bar', 42],和一个命名参数的映射(即字典)'x':1,然后只有f(*args, **kwargs),注意,即使那些是空列表/字典 添加了示例函数签名。 【参考方案1】:

确实,微不足道,我的 Goggle fu 让我无法找到答案。希望能帮助那些对 Python 缺乏经验并且在 Google 遇到麻烦的人:

只需将*arg**kwarg 作为参数并直接传递它们,并附上星号。所以在我的情况下,做我的 RPyC 传递,其中conn 是 RPyC 连接:

def my_passthru(conn, function_name, *function_args, **function_kwargs):

    # Do a check of something or other here

    return_value = getattr(conn.root, function_name)(*function_args, **function_kwargs)

    # Do another check here

    return return_value

然后,例如,对我上面的exposed_e() 方法的调用可能是:

return_value = my_passthru(conn, e, thing1, thing2, thing3)

(在这种情况下,RPyC 会自动添加 exposed_ 前缀)。

当然,人们可以在my_passthru() 中的getattr() 调用周围放置一个try: / except ConnectionRefusedError:,以普遍捕获连接在RPyC 下掉线的情况,这是我的主要目的。

【讨论】:

以上是关于透明地通过带有可变参数列表的函数的主要内容,如果未能解决你的问题,请参考以下文章

c语言如何封装一个带有可变参数的方法?

C语言中如何实现可变参函数

如何通过可变参数模板将多个构造函数参数转发到数组初始值设定项列表?

C语言可变参数

C语言可变参数

C语言可变参数