2017-06-30 210 views
0

此字符串的奇怪故障發生(Python的2.7.13 - Linux的):自動轉換到蟒蛇

import SimpleHTTPServer, SocketServer 

httpd = SocketServer.TCPServer(("", 8080), SimpleHTTPServer.SimpleHTTPRequestHandler) 
# this fails: 
print "%s" % (httpd.socket.getsockname()) 
# this does not: 
print "%s%s" % (httpd.socket.getsockname(), '') 

是它認爲是一個錯誤?

+2

'(httpd.socket.getsockname())'是不是一個元組。 '(httpd.socket.getsockname(),)'*是*。 –

+0

從技術上講,它是一個元組,但是它是一個長度爲2的元組@ –

+0

@JaredGoguen:期望'(...)'形成我試圖解決的元組,但是是的。 –

回答

2

​​3210串內插有兩種模式

  • 要麼在右手側的值是一個單一的值。
  • 或者右側的值是一個保存多個值的元組。

第二個選項意味着你永遠不能把一個單獨的元組作爲一個單值插入;你必須首先將這個元組包裝在另一個元組中。

socket.getsockname()返回一個元組,因此不能直接進行插值,你必須首先將它包裝在一個元組中。

請注意,(...)括號中的第一個表達式只有的表達式,它們不會使某個元組變成一個元組;你需要使用逗號使一些元組:

>>> (0) # not a tuple 
0 
>>> 0, # a tuple 
(0,) 

因爲你給2元元組串插只一個串佔位符,你被告知有在數組中的多個元素那些沒有被轉換:

TypeError: not all arguments converted during string formatting 

添加逗號:

print "%s" % (httpd.socket.getsockname(),) 

或更好,但使用str.format()格式,而不是擔心的元組:

print "{}".format(httpd.socket.getsockname())