0

在 C 世界中,函数可以返回错误码来表示退出状态,并使用 INOUT/OUT 参数来携带进程的实际结果。对于 xmlrpc,没有 INOUT/OUT 参数,是否有任何最佳实践/约定来表示退出状态和实际结果?

上下文是我正在尝试编写在服务器上运行的代理/守护程序(python SimpleXMLRPCServer),并希望设计“协议”以与​​之交互。

任何建议表示赞赏。

编辑:根据 S.Lott 的评论,让问题更清楚。

  • 它更多的是关于 os 约定而不是 C 约定。我同意这一点。

  • 代理的工作或多或少是在服务器上运行一些 cmd,本质上带有退出代码/结果习语

.

4

2 回答 2

1

在 Python 中实现这一点的一种简单方法是使用元组。让您的函数返回一个元组: (status, result) 其中状态可以是数字或字符串,结果可以是您喜欢的任何 Python 数据结构。

这是一个示例,改编自模块文档。服务器代码:

from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler

# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

# Create server
server = SimpleXMLRPCServer(("localhost", 8000),
                            requestHandler=RequestHandler)

def myfunction(x, y):
    status = 1
    result = [5, 6, [4, 5]]
    return (status, result)
server.register_function(myfunction)

# Run the server's main loop
server.serve_forever()

客户端代码:

import xmlrpclib

s = xmlrpclib.ServerProxy('http://localhost:8000')
print s.myfunction(2, 4)

服务器函数返回一个元组

于 2010-02-07T17:00:10.923 回答
1

“在C世界中,一个函数可以返回错误码来表示退出状态,并使用INOUT/OUT参数来携带进程的实际结果”

  1. 将退出状态视为 hack。这不是 C 主义,而是 Linux 主义。C 函数只返回一个值。C 没有异常,因此有几种方法可以指示失败,但都非常糟糕。

    异常处理是需要的。Python 和 Java 有这个,它们不需要退出状态。

    然而,操作系统仍然依赖于退出状态,因为 shell 脚本仍然非常原始,并且某些语言(如 C)不能产生异常。

  2. 考虑输入/输出变量也是一种技巧。这是一个可怕的 hack,因为该函数除了返回一个值之外还有多个副作用。

这两个“特性”都不是最好的设计模式。

理想情况下,函数是“幂等的”——无论调用多少次,都会得到相同的结果。输入/输出变量以晦涩难懂、难以调试的方式破坏幂等性。

您实际上并不需要这些功能中的任何一个,这就是为什么您看不到很多实现它们的最佳实践的原因。

最佳实践是返回一个值或引发异常。如果需要返回多个值,则返回一个元组。如果事情没有奏效,你不会返回退出状态,你会引发异常。


更新。由于远程进程基本上是 RSH 来运行远程命令,所以你应该做什么remctl

您需要准确地模仿:http ://linux.die.net/man/1/remctl 。您必须编写 Python 客户端和服务器。服务器返回带有状态代码(以及任何其他摘要,如运行时)的消息。客户端以相同的状态码退出。

于 2010-02-07T21:28:11.393 回答