透明地通过带有可变参数列表的函数
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 下掉线的情况,这是我的主要目的。
【讨论】:
以上是关于透明地通过带有可变参数列表的函数的主要内容,如果未能解决你的问题,请参考以下文章