Python 3的原因是unquote制作chr和int的别名?

时间:2016-01-28 18:08:20

标签: python urllib

在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)

我们有2条第一条执行的行:

mychr = chr
myatoi = int

他们的用法:

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

为什么使用这两个函数的别名,如果它们仅用于此函数?可以轻松地将它们换成chrint

1 个答案:

答案 0 :(得分: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)

但你会发现,如果你在分析器下运行它,它会慢一些。