我想弄清楚为什么我会看到这个。这是代码片段:
def check_status(addr,port=80):
import urllib2
if not addr.startswith('http://'): addr = "http://" + addr
req = urllib2.Request(addr+":"+str(port))
try:
res = urllib2.urlopen(req,None,10)
sts = str(res.code)
except urllib2.URLError, er:
sts = er.args
print "Print-1\t: %s" % sts
print "Print-2\t:", sts
print "{0}\t: {1}".format('Print-3',sts)
return sts
url = "google.comm"
sts = check_status(url)
print "Print-4\t: %s %s" % (url, sts)运行这个脚本,我在print语句上得到了有趣的结果:
Print-1 : [Errno 8] nodename nor servname provided, or not known
Print-2 : (gaierror(8, 'nodename nor servname provided, or not known'),)
Print-3 : (gaierror(8, 'nodename nor servname provided, or not known'),)
Print-4 : google.comm (gaierror(8, 'nodename nor servname provided, or not known'),)有谁能解释一下为什么打印sts不同的打印-2,3和4?它的打印格式正确,只有单一的%s格式-字符串。我不认为这和urllib2有任何关系。我在这里错过了什么?谢谢!
发布于 2013-05-30 18:58:48
将单个参数传递给%是不明确的,因此Python应用了一条在某些情况下令人困惑的规则,但最常见的是您想要的答案。如果参数不是元组,则将其视为包在一个1元素元组中。
所以这个:
print "Print-1\t: %s" % sts…如果它是一个1-元素元组,则打印str(sts[0]),如果它是任何其他长度的元组,则会引发一个TypeError,但是如果它只是一个字符串(或Exception或其他什么的),则会打印str(sts)。
你的所有其他例子:
print "Print-2\t:", sts
print "{0}\t: {1}".format('Print-3',sts)
print "Print-4\t: %s %s" % (url, sts)…只需打印str(sts),因为他们没有这个神奇的规则。
在您的例子中,sts是一个1元素元组。所以,str(sts[0])是您想要的,因为str(sts)等同于'(' + repr(sts[0]) + ',)'。你在Print-1上很幸运,因为你偶然击中了魔法规则。(您可能还不知道er.args是一个元组。)
这种混乱正是为什么人们一直建议反对%-formatting,或者改变它,让它总是把它的论点当作一个序列来对待等等。但是,由于它对于这么多快速和肮脏的目的非常方便,所以这些建议总是被否决。
避免混淆自己的一种方法是始终将单个参数作为元组传递:print "Print-0\t: %s" % (sts,)。或者不要使用%-formatting。
https://stackoverflow.com/questions/16843747
复制相似问题