2017-06-30 171 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())