1

ポイントの証明http://adams-site.x10.mx/v/python.png

この画像では、2つの印刷ステートメントが異なる色であることがわかります。

それはそれほど重要ではありません、私は本当に気になりませんが、理由を知ることは素晴らしいことだと思いました、またはこれが単なるバグであるかどうか。

(私はこのリンクを見ましたが、私は本当に理由を知りたいです。)

4

2 に答える 2

5

あなたが言及した前の質問にリンクされたバグレポートによると、IDLEはTrue、、、Falseと混同されてNoneいました。これは長い間キーワードではありませんでしたが、Py3.0によってキーワードになりました-キーワードになる前は、それらは単なる名前でした組み込みのグローバル名前空間。したがって、IDLEは、異なるコンテキスト間で、それらを組み込みまたはキーワードとして一貫性のない色にします。

printは正反対の変換を受けました。3.0まではキーワードでしたが、その後は単なる組み込みです(ステートメントではなく関数になっているため)。したがって、IDLEは、どちらが当てはまると思うかをどのように解決するかに応じて、両方の方法で色を付けます。これは同じパッチで解決されているようです(3.2以降のみで、2.xブランチはありません)-print一貫して紫色になっています。

于 2012-05-26T09:32:23.443 に答える
5

これは、ColorDelegator.pyからの構文の強調表示を担当するコードです。

def any(name, alternates):
    "Return a named group pattern matching list of alternates."
    return "(?P<%s>" % name + "|".join(alternates) + ")"

def make_pat():
    kw = r"\b" + any("KEYWORD", keyword.kwlist) + r"\b"
    builtinlist = [str(name) for name in dir(__builtin__)
                                        if not name.startswith('_')]
    # self.file = file("file") :
    # 1st 'file' colorized normal, 2nd as builtin, 3rd as string
    builtin = r"([^.'\"\\#]\b|^)" + any("BUILTIN", builtinlist) + r"\b"
    comment = any("COMMENT", [r"#[^\n]*"])
    sqstring = r"(\b[rRuU])?'[^'\\\n]*(\\.[^'\\\n]*)*'?"
    dqstring = r'(\b[rRuU])?"[^"\\\n]*(\\.[^"\\\n]*)*"?'
    sq3string = r"(\b[rRuU])?'''[^'\\]*((\\.|'(?!''))[^'\\]*)*(''')?"
    dq3string = r'(\b[rRuU])?"""[^"\\]*((\\.|"(?!""))[^"\\]*)*(""")?'
    string = any("STRING", [sq3string, dq3string, sqstring, dqstring])
    return kw + "|" + builtin + "|" + comment + "|" + string +\
           "|" + any("SYNC", [r"\n"])

アイテムを色に一致させるために使用する大きな正規表現を構築します。特に、として定義された正規表現は、ソースファイル内の任意の場所でキーワード(キーワードモジュールkwによって定義されたもの)と一致しますが、として定義された正規表現は、従わない限り、組み込み(スキャンによって検出されたもの)と一致しますピリオド、引用符、二重引用符、円記号、またはハッシュ記号。builtin__builtin__

今、あなたが見る奇妙な振る舞いを与えるために働いている要因の組み合わせがあります。まず第一にprint、Python2.7ではキーワードと組み込みの両方です。(理由はわかりませんが、明らかにキーワードではなく組み込みであるPython 3.0に近づけることになると思いprintます。)したがって、キーワードまたは組み込みのいずれかとしてprintに一致する正規表現が作成されます。しかし、なぜそれは時々一方として、時には他方として一致するのですか?

違いは、正規表現の構造によるものです。行の先頭で、kw正規表現は最初の文字から一致し、残りの文字が考慮される前に一致します。ただし、行の開始後、builtin正規表現は実際には前の文字と一致します。これは、検索する最初の文字が「ピリオド、引用符、二重引用符、円記号、またはハッシュではない任意の文字」であるためです。そのキャラクターはラベル付けされたグループに含まれていませんが、それでも試合の一部です。したがって、print前にスペースまたはタブが付いている場合、builtin正規表現が最初に一致します。

これを修正する1つの方法は、ネガティブルックビハインドアサーションを使用することですが、このような複雑な正規表現はすでに少し緊張しており、どの正規表現機能が壊滅的なパフォーマンスの低下をもたらす可能性があるかはわかりません。より簡単な修正は、正規表現を作成する前にキーワードでもあるビルトインを除外することです。これは、参照する質問からリンクされているバグレポートで説明されているように、Python3.2.2で行われていることとまったく同じです。

于 2012-05-26T10:16:49.783 に答える