分析Python代码:模数运算符

时间:2012-06-23 21:06:52

标签: python networking

我在看Python中的一些代码(我对Python一无所知),我遇到了这个部分:

def do_req(body):
    global host, req
    data = ""
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host, 80))
    s.sendall(req % (len(body), body))
    tmpdata = s.recv(8192)
    while len(tmpdata) > 0:
        data += tmpdata
        tmpdata = s.recv(8192)
    s.close()
    return data

稍后将使用巨大的主体调用它,超过500,000字节。这将发送到Apache服务器,该服务器的最大请求大小为默认的8190字节。

我的问题是“s.sendall()”部分发生了什么?显然整个身体不能立即发送,我猜它是通过模数运算符减少的。不过,我不知道它在Python中是如何工作的。谁能解释一下?感谢。

2 个答案:

答案 0 :(得分:7)

它不是真正的模数运算符(技术上是因为字符串只是实现__mod__)而是python2-style string formatting operator

  

鉴于format % values(其中 format 是字符串或Unicode对象),格式中的%转换规范将替换为零个或多个元素效果类似于C语言中使用sprintf()

  

显然整个身体不能立即发送

虽然它确实不适合单个数据包,这是一个内部处理的低级事物(很可能甚至不是由python而是由写入套接字的底层系统调用)

答案 1 :(得分:0)

不,这里没有缩小正文,因为%是格式运算符,当对字符串进行操作时。

http://docs.python.org/release/2.5.2/lib/typesseq-strings.html

所有数据都是通过sendall方法按部件发送的。

socket.sendall就是这样的:

do {
        n = sendsegmented(s->sock_fd, buf, len, flags);
        len -= n;
} while (len > 0);

其中sendsegmented发送数据并返回len或SEGMENT_SIZE