2

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

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

我确实拥有这个接口的两端(调用者和被调用者),所以我可以安排对所有函数参数进行字典化,但如果我可以避免的话,我宁愿不要让我的 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)

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

4

1 回答 1

0

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

只需将*argand**kwarg作为参数并直接传递它们,并附上星号。因此,就我而言,要进行 RPyC 直通,connRPyC 连接在哪里:

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)

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

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

于 2021-04-21T07:44:37.210 回答