2012-06-23 60 views
0

我一直在尋找在一些Python代碼(我什麼都不知道了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字節。這被髮送到具有默認8190字節的最大請求大小的Apache服務器。

我的問題是在「s.sendall()」部分發生了什麼?很明顯,整個身體不能立即發送,我猜測它是通過模數運算符減少的。不過,我不知道它在Python中的工作原理。誰能解釋一下?謝謝。

回答

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

7

它不是真正的模數運算符(技術上它是因爲字符串簡單地實現了__mod__)而是python2-style string formatting operator

鑑於format % values(其中格式是一個字符串或Unicode對象),%轉換規格格式的零個或多個元件替代。其效果與在C語言中使用sprintf()類似。

顯然,整個身體不能馬上

發送雖然它確實不適合到一個單一的數據包,這不是在內部處理的低層次的東西(最有可能的即使通過python,但通過寫入套接字的底層系統調用)

+3

嗯,這是* *模運算符,但有特定的含義時,LH是一個字符串。 –

+0

值得注意的是,在新代碼中,而不是使用它,你應該更喜歡[更新,更強大的'str.format()'函數](http://docs.python.org/library/stdtypes.html# str.format)。 –

+0

@Lattyware:沒錯,但是爲了簡單起見'''''''.format()' – ThiefMaster