Python - 奇怪的语法错误

0 投票
2 回答
2904 浏览
提问于 2025-04-18 04:17

我正在尝试运行一个简单的RPC服务器,客户端可以执行一些基本操作。看起来所有的代码都写得没问题,但当我运行客户端时,出现了一个无效的语法错误,错误信息大概是这样的:

$ python rpcClient.py
  File "rpcClient.py", line 9


^
SyntaxError: invalid syntax

这是rpcClient.py文件:

import xmlrpclib

proxy = xmlrpclib.ServerProxy("http://localhost:7999/")
print "3 is even: %s" % str(proxy.is_even(3))
print "100 is even: %s" % str(proxy.is_even(100))
proxy.printString("Testing")
proxy.doubleList([1, 2, 4, 8])
print "Sum of all numbers from 1 to 5: %s" % str(proxy.sumList([1, 2, 3, 4])

我很确定服务器文件没有问题,但为了保险起见,这里是rpcServer.py:

import xmlrpclib
from SimpleXMLRPCServer import SimpleXMLRPCServer

def is_even(n):
    return n%2 == 0

def printString(s):
    print s
    return

def doubleList(l):
    for i in range(l):
        l[i] = l[i]*2
        print l[i]
    return

def sumList(l):
    s = sum(l)
    return s

server = SimpleXMLRPCServer(("localhost", 7999))
print "Listening on port 7999..."
server.register_function(is_even, "is_even")
server.register_function(printString, "printString")
server.register_function(doubleList, "doubleList")
server.register_function(sumList, "sumList")
server.serve_forever()

你知道问题出在哪里吗?我已经多次尝试运行客户端,每次都得到我上面提到的同样错误。

2 个回答

1

你在最后一行缺少一个右括号。不过,调用 str 其实是多余的,因为 %s 格式化选项会自动把它的参数转换成字符串。所以,你只需要这样写:

print "Sum of all numbers from 1 to 5: %s" % proxy.sumList([1, 2, 3, 4])
4

你在最后一行缺少一个右括号:

print "Sum of all numbers from 1 to 5: %s" % str(proxy.sumList([1, 2, 3, 4])
#                                           ----^                      -----^

然后,Python来到下一行,这一行是空的,它在想那个缺失的右括号去哪了。

注意,%s这个占位符已经会对你插入的值调用str(),所以你在这里不需要再显式地调用str()。相反,你应该把这些值放在一个元组里,这样即使proxy.is_even()返回的是一个元组,它也只会被当作一个值来处理:

print "3 is even: %s" % (proxy.is_even(3),)
print "100 is even: %s" % (proxy.is_even(100),)
# ..
print "Sum of all numbers from 1 to 5: %s" % (proxy.sumList([1, 2, 3, 4]),)

就我个人而言,我更喜欢新的str.format()方法:

print "3 is even: {}".format(proxy.is_even(3))
print "100 is even: {}".format(proxy.is_even(100))
# ..
print "Sum of all numbers from 1 to 5: {}".format(proxy.sumList([1, 2, 3, 4]))

撰写回答