Python 3'的原因;s unquote正在使用chr和int的别名?
在Python3的函数Python 3'的原因;s unquote正在使用chr和int的别名?,python,urllib,Python,Urllib,在Python3的函数unquote(from)中: 我们有两个最先执行的行: mychr = chr myatoi = int 及其用法: ... myappend(mychr(myatoi(item[:2], 16)) + item[2:]) ... 如果这两个函数仅用于此函数,为什么要使用它们的别名?它们可以很容易地交换为chr和int这是出于性能原因,因为全局查找和方法查找比
unquote
(from)中:
我们有两个最先执行的行:
mychr = chr
myatoi = int
及其用法:
...
myappend(mychr(myatoi(item[:2], 16))
+ item[2:])
...
如果这两个函数仅用于此函数,为什么要使用它们的别名?它们可以很容易地交换为
chr
和int
这是出于性能原因,因为全局查找和方法查找比局部变量查找慢得多,因为它们必须访问至少一个字典,其中作为局部变量被列表索引
您可以通过以下方式逆转此优化:
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)
但是,如果在探查器下运行,您会发现它的速度较慢。最新版本中似乎没有这种情况:@Robᵩ 谢谢分享!我想知道这是为什么。Dan在下面给出的答案似乎给出了一个很好的理由,为什么别名应该在那里。事实上,似乎暗示您正在查看的版本非常旧。(准确地说是2.2.0)。谢谢,很奇怪URL上说它是Python 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)