Skip to main content
 首页 » 编程设计

使用 "print"语句的 Python IDLE 错误着色

2025年05月04日11qq号

proof of point http://adams-site.x10.mx/v/python.png

你会注意到这张图片中的两个打印语句是不同的颜色。

这真的没什么大不了的,我真的不在意,但我认为最好知道为什么,或者这是否只是一个错误。

(我看到了 this 链接,但我真的很想知道为什么。)

请您参考如下方法:

这是负责从 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 的正则表达式将匹配源文件中任何位置的关键字(由 keyword module 定义),而定义为 builtin 的正则表达式将匹配内置函数(通过扫描 __builtin__ 发现),只要它不跟在句点、引号、双引号、反斜杠或哈希符号之后。

现在,有多种因素在起作用,导致您看到这种奇怪的行为。首先,在 Python 2.7 中,print 既是关键字又是内置函数。 (我不确定为什么,但我想这可能是为了更接近 Python 3.0,其中 print 显然是内置函数而不是关键字。)因此构造了一个可以匹配 print 的正则表达式关键字或内置。但为什么它有时匹配一个,有时匹配另一个?

不同之处在于正则表达式的构造。在一行的开头,kw 正则表达式从第一个字符开始匹配,并且在考虑其余字符之前匹配。然而,在行首之后,builtin 正则表达式实际上匹配了一个更早的字符,因为它查找的第一个字符是“任何不是句号、引号、双引号、反斜杠的字符或散列”。即使该字符未包含在标记组中,它仍然是匹配项的一部分。因此,当 print 前面有空格或制表符时,builtin 正则表达式首先匹配。

解决此问题的一种方法是使用负向回顾断言,但如此复杂的正则表达式已经让我有点紧张,而且我不确定哪些正则表达式功能会导致灾难性的性能下降。一个更简单的修复方法是在构建正则表达式之前过滤掉所有也是关键字的内置函数,这正是 Python 3.2.2 中所做的,如链接到您引用的问题的错误报告中所述。