Python 3中unquote为什么要将chr和int作为别名?

3
在Python 3的函数unquote(来自http://www.opensource.apple.com/source/python/python-3/python/Lib/urllib.py)中:
def unquote(s):
    """unquote('abc%20def') -> 'abc def'."""
    mychr = chr
    myatoi = int
    list = s.split('%')
    res = [list[0]]
    myappend = res.append
    del list[0]
    for item in list:
        if item[1:2]:
            try:
                myappend(mychr(myatoi(item[:2], 16))
                     + item[2:])
            except ValueError:
                myappend('%' + item)
        else:
            myappend('%' + item)
    return "".join(res)

我们有前两行执行的代码:

mychr = chr
myatoi = int

它们的用途:

         ...
                myappend(mychr(myatoi(item[:2], 16))
                     + item[2:])
         ...

为什么在这个函数中只用到这两个函数的别名?它们可以很容易地被替换为chrint

1
似乎这不是最新版本:https://hg.python.org/cpython/file/v3.5.1/Lib/urllib/parse.py#l527 - Robᵩ
@Robᵩ 感谢分享!我想知道为什么会这样。下面丹给出的答案似乎很好地解释了为什么应该有这些别名。 - Ryan Dougherty
事实上,http://www.opensource.apple.com/source/python/python-3/python/Include/patchlevel.h 似乎暗示你所看到的版本相当古老(确切地说是2.2.0)。 - Robᵩ
谢谢,很奇怪URL上说它是Python 3。 - Ryan Dougherty
1个回答

3

出于性能原因,这样做是为了避免全局查找和方法查找比本地变量查找要慢得多,因为它们必须访问至少一个字典,而本地变量是列表索引。

您可以反转此优化,如下所示:

def unquote(s):
    """unquote('abc%20def') -> 'abc def'."""
    list = s.split('%')
    res = [list[0]]
    del list[0]
    for item in list:
        if item[1:2]:
            try:
                res.append(chr(int(item[:2], 16))
                     + item[2:])
            except ValueError:
                res.append('%' + item)
        else:
            res.append('%' + item)
    return "".join(res)

但是如果你在分析器下运行它,你会发现它比较慢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接