首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带和不带“字符串”的打印字符串.格式

带和不带“字符串”的打印字符串.格式
EN

Stack Overflow用户
提问于 2013-05-30 18:49:16
回答 1查看 175关注 0票数 0

我想弄清楚为什么我会看到这个。这是代码片段:

代码语言:javascript
复制
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语句上得到了有趣的结果:

代码语言:javascript
复制
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有任何关系。我在这里错过了什么?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-30 18:58:48

将单个参数传递给%是不明确的,因此Python应用了一条在某些情况下令人困惑的规则,但最常见的是您想要的答案。如果参数不是元组,则将其视为包在一个1元素元组中。

所以这个:

代码语言:javascript
复制
print "Print-1\t: %s" % sts

…如果它是一个1-元素元组,则打印str(sts[0]),如果它是任何其他长度的元组,则会引发一个TypeError,但是如果它只是一个字符串(或Exception或其他什么的),则会打印str(sts)

你的所有其他例子:

代码语言:javascript
复制
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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16843747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档