0

なぜこれを見ているのかを調べようとしています。これはコード スニペットです。

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'),)

stsprint-2、3、および4で印刷が異なる理由を誰か説明してもらえますか? 単一の書式設定文字列のみを使用して正しい形式で印刷しています。urllib2%sとは何の関係もないと思います。ここで何が欠けていますか?ありがとう!

4

1 に答える 1

2

単一の引数を に渡すこと%は曖昧であるため、Python は場合によっては混乱を招くルールを適用しますが、ほとんどの場合、希望どおりの答えになります。引数がタプルでない場合、1 要素のタプルにラップされているかのように扱われます。

したがって、この:

print "Print-1\t: %s" % sts

str(sts[0])要素が 1 のTypeErrorタプルの場合は出力し、それ以外の長さのタプルの場合は a を発生させますがstr(sts)、単なる文字列 (または anExceptionなど) の場合は出力します。

あなたの他のすべての例:

print "Print-2\t:", sts
print "{0}\t: {1}".format('Print-3',sts)
print "Print-4\t: %s  %s" % (url, sts)

… を印刷するだけですstr(sts)。彼らにはこの魔法のルールがないからです。

あなたの場合、sts1要素のタプルです。は と同等でstr(sts[0])あるため、 が必要です。たまたま魔法のルールに当たったのでラッキーです。(それがタプルであることすら知らなかったかもしれません。)str(sts)'(' + repr(sts[0]) + ',)'Print-1er.args


この種の混乱こそが、人々が%-formatting の非推奨化や、引数を常にシーケンスとして扱うように変更するなどを提案し続ける理由です。

混乱を避ける 1 つの方法は、引数を 1 つでもタプルとして常に渡すことですprint "Print-0\t: %s" % (sts,)%または、 -formattingを使用しないでください。

于 2013-05-30T18:58:48.930 に答える