为什么 repr() 添加转义字符?
Why does repr() add escape characters?
来自下面的clock
装饰器,
import time
from functools import wraps
DEFAULT_FMT = '[{elapsed:0.8f}s] {name}({args}) -> {result}'
def clock(fmt=DEFAULT_FMT):
def decorate(func):
@wraps(func)
def wrapper(*args):
t0 = time.time()
result = func(*args)
elapsed = time.time() - t0
name=func.__name__
args = ','.join(repr(arg) for arg in args)
result=repr(result)
print(fmt.format(**locals()))
return result
return wrapper
return decorate
result=repr(result)
正在输出字符串中添加转义 \\
字符,对于以下代码,
from functools import lru_cache
from clock_package import clock
emptyRecrList = None
#Representation - start
#Constructor
def list(first, rest):
return [first, rest]
def first(s):
assert s != empty, 'empty linked list has no first'
return s[0]
def rest(s):
assert s != empty, 'empty linked list has no rest'
return s[1]
#Representation - end
def fibSequence(k:int) -> list:
prev, curr = 1, 0
@lru_cache() # applied last
@clock() # applied first
def genSequence(prev, curr, k):
if k == 0:
return emptyRecrList
elif k == 1:
return list(curr, emptyRecrList)
else:
return list(curr, genSequence(curr, prev+curr, k-1))
return genSequence(prev, curr, k)
if __name__ == '__main__':
fibSequence(11)
预期输出:
$ python3.6 fibonacci.py
[0.00000167s] genSequence(34,55,1) -> [55, None]
[0.00007153s] genSequence(21,34,2) -> [34, [55, None]]
[0.00010061s] genSequence(13,21,3) -> [21, [34, [55, None]]]
[0.00012279s] genSequence(8,13,4) -> [13, [21, [34, [55, None]]]]
[0.00014472s] genSequence(5,8,5) -> [8, [13, [21, [34, [55, None]]]]]
[0.00016618s] genSequence(3,5,6) -> [5, [8, [13, [21, [34, [55, None]]]]]]
[0.00018954s] genSequence(2,3,7) -> [3, [5, [8, [13, [21, [34, [55, None]]]]]]]
[0.00021267s] genSequence(1,2,8) -> [2, [3, [5, [8, [13, [21, [34, [55, None]]]]]]]]
[0.00023627s] genSequence(1,1,9) -> [1, [2, [3, [5, [8, [13, [21, [34, [55, None]]]]]]]]]
[0.00026131s] genSequence(0,1,10) -> [1, [1, [2, [3, [5, [8, [13, [21, [34, [55, None]]]]]]]]]]
[0.00028825s] genSequence(1,0,11) -> [0, [1, [1, [2, [3, [5, [8, [13, [21, [34, [55, None]]]]]]]]]]]
实际输出:
$ python3.6 fibonacci.py
[0.00000143s] genSequence(34,55,1) -> [55, None]
[0.00007296s] genSequence(21,34,2) -> [34, '[55, None]']
[0.00011134s] genSequence(13,21,3) -> [21, "[34, '[55, None]']"]
[0.00013995s] genSequence(8,13,4) -> [13, '[21, "[34, \'[55, None]\']"]']
[0.00016642s] genSequence(5,8,5) -> [8, '[13, \'[21, "[34, \\'[55, None]\\']"]\']']
[0.00019479s] genSequence(3,5,6) -> [5, '[8, \'[13, \\'[21, "[34, \\\\'[55, None]\\\\']"]\\']\']']
[0.00022340s] genSequence(2,3,7) -> [3, '[5, \'[8, \\'[13, \\\\'[21, "[34, \\\\\\\\'[55, None]\\\\\\\\']"]\\\\']\\']\']']
[0.00025082s] genSequence(1,2,8) -> [2, '[3, \'[5, \\'[8, \\\\'[13, \\\\\\\\'[21, "[34, \\\\\\\\\\\\\\\\'[55, None]\\\\\\\\\\\\\\\\']"]\\\\\\\\']\\\\']\\']\']']
[0.00027943s] genSequence(1,1,9) -> [1, '[2, \'[3, \\'[5, \\\\'[8, \\\\\\\\'[13, \\\\\\\\\\\\\\\\'[21, "[34, \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'[55, None]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\']"]\\\\\\\\\\\\\\\\']\\\\\\\\']\\\\']\\']\']']
[0.00030875s] genSequence(0,1,10) -> [1, '[1, \'[2, \\'[3, \\\\'[5, \\\\\\\\'[8, \\\\\\\\\\\\\\\\'[13, \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'[21, "[34, \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'[55, None]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\']"]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\']\\\\\\\\\\\\\\\\']\\\\\\\\']\\\\']\\']\']']
[0.00034404s] genSequence(1,0,11) -> [0, '[1, \'[1, \\'[2, \\\\'[3, \\\\\\\\'[5, \\\\\\\\\\\\\\\\'[8, \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'[13, \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'[21, "[34, \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'[55, None]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\']"]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\']\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\']\\\\\\\\\\\\\\\\']\\\\\\\\']\\\\']\\']\']']
为什么 result=repr(result)
在输出字符串中添加转义字符?
repr
returns 一个字符串——当 copy/pasted 进入 Python 源代码时——将创建相同的值。当您想要查看人类可读的字符串时,您可能想使用 str
。
您遇到的问题是您的 clock
装饰器正在更改您的函数返回的类型。我怀疑您打算 result=repr(result)
行只影响当前行的打印,但它会影响后面的行,因为当返回 result
时,它是一个字符串而不是列表。当它包含在以后的结果中时,引号会发生冲突,并且 Python 开始使用反斜杠来转义它们。然后它需要更多的反斜杠来转义之前的反斜杠,最终导致你所显示的混乱。
尝试对 repr
的结果使用不同的变量名 print
,对未修改的结果 return
:
def wrapper(*args):
t0 = time.time()
raw_result = func(*args) # use a different variable name here
elapsed = time.time() - t0
name=func.__name__
args = ','.join(repr(arg) for arg in args)
result=repr(raw_result) # convert to string for display
print(fmt.format(**locals()))
return raw_result # return the unmodified version
来自下面的clock
装饰器,
import time
from functools import wraps
DEFAULT_FMT = '[{elapsed:0.8f}s] {name}({args}) -> {result}'
def clock(fmt=DEFAULT_FMT):
def decorate(func):
@wraps(func)
def wrapper(*args):
t0 = time.time()
result = func(*args)
elapsed = time.time() - t0
name=func.__name__
args = ','.join(repr(arg) for arg in args)
result=repr(result)
print(fmt.format(**locals()))
return result
return wrapper
return decorate
result=repr(result)
正在输出字符串中添加转义 \\
字符,对于以下代码,
from functools import lru_cache
from clock_package import clock
emptyRecrList = None
#Representation - start
#Constructor
def list(first, rest):
return [first, rest]
def first(s):
assert s != empty, 'empty linked list has no first'
return s[0]
def rest(s):
assert s != empty, 'empty linked list has no rest'
return s[1]
#Representation - end
def fibSequence(k:int) -> list:
prev, curr = 1, 0
@lru_cache() # applied last
@clock() # applied first
def genSequence(prev, curr, k):
if k == 0:
return emptyRecrList
elif k == 1:
return list(curr, emptyRecrList)
else:
return list(curr, genSequence(curr, prev+curr, k-1))
return genSequence(prev, curr, k)
if __name__ == '__main__':
fibSequence(11)
预期输出:
$ python3.6 fibonacci.py
[0.00000167s] genSequence(34,55,1) -> [55, None]
[0.00007153s] genSequence(21,34,2) -> [34, [55, None]]
[0.00010061s] genSequence(13,21,3) -> [21, [34, [55, None]]]
[0.00012279s] genSequence(8,13,4) -> [13, [21, [34, [55, None]]]]
[0.00014472s] genSequence(5,8,5) -> [8, [13, [21, [34, [55, None]]]]]
[0.00016618s] genSequence(3,5,6) -> [5, [8, [13, [21, [34, [55, None]]]]]]
[0.00018954s] genSequence(2,3,7) -> [3, [5, [8, [13, [21, [34, [55, None]]]]]]]
[0.00021267s] genSequence(1,2,8) -> [2, [3, [5, [8, [13, [21, [34, [55, None]]]]]]]]
[0.00023627s] genSequence(1,1,9) -> [1, [2, [3, [5, [8, [13, [21, [34, [55, None]]]]]]]]]
[0.00026131s] genSequence(0,1,10) -> [1, [1, [2, [3, [5, [8, [13, [21, [34, [55, None]]]]]]]]]]
[0.00028825s] genSequence(1,0,11) -> [0, [1, [1, [2, [3, [5, [8, [13, [21, [34, [55, None]]]]]]]]]]]
实际输出:
$ python3.6 fibonacci.py
[0.00000143s] genSequence(34,55,1) -> [55, None]
[0.00007296s] genSequence(21,34,2) -> [34, '[55, None]']
[0.00011134s] genSequence(13,21,3) -> [21, "[34, '[55, None]']"]
[0.00013995s] genSequence(8,13,4) -> [13, '[21, "[34, \'[55, None]\']"]']
[0.00016642s] genSequence(5,8,5) -> [8, '[13, \'[21, "[34, \\'[55, None]\\']"]\']']
[0.00019479s] genSequence(3,5,6) -> [5, '[8, \'[13, \\'[21, "[34, \\\\'[55, None]\\\\']"]\\']\']']
[0.00022340s] genSequence(2,3,7) -> [3, '[5, \'[8, \\'[13, \\\\'[21, "[34, \\\\\\\\'[55, None]\\\\\\\\']"]\\\\']\\']\']']
[0.00025082s] genSequence(1,2,8) -> [2, '[3, \'[5, \\'[8, \\\\'[13, \\\\\\\\'[21, "[34, \\\\\\\\\\\\\\\\'[55, None]\\\\\\\\\\\\\\\\']"]\\\\\\\\']\\\\']\\']\']']
[0.00027943s] genSequence(1,1,9) -> [1, '[2, \'[3, \\'[5, \\\\'[8, \\\\\\\\'[13, \\\\\\\\\\\\\\\\'[21, "[34, \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'[55, None]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\']"]\\\\\\\\\\\\\\\\']\\\\\\\\']\\\\']\\']\']']
[0.00030875s] genSequence(0,1,10) -> [1, '[1, \'[2, \\'[3, \\\\'[5, \\\\\\\\'[8, \\\\\\\\\\\\\\\\'[13, \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'[21, "[34, \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'[55, None]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\']"]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\']\\\\\\\\\\\\\\\\']\\\\\\\\']\\\\']\\']\']']
[0.00034404s] genSequence(1,0,11) -> [0, '[1, \'[1, \\'[2, \\\\'[3, \\\\\\\\'[5, \\\\\\\\\\\\\\\\'[8, \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'[13, \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'[21, "[34, \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'[55, None]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\']"]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\']\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\']\\\\\\\\\\\\\\\\']\\\\\\\\']\\\\']\\']\']']
为什么 result=repr(result)
在输出字符串中添加转义字符?
repr
returns 一个字符串——当 copy/pasted 进入 Python 源代码时——将创建相同的值。当您想要查看人类可读的字符串时,您可能想使用 str
。
您遇到的问题是您的 clock
装饰器正在更改您的函数返回的类型。我怀疑您打算 result=repr(result)
行只影响当前行的打印,但它会影响后面的行,因为当返回 result
时,它是一个字符串而不是列表。当它包含在以后的结果中时,引号会发生冲突,并且 Python 开始使用反斜杠来转义它们。然后它需要更多的反斜杠来转义之前的反斜杠,最终导致你所显示的混乱。
尝试对 repr
的结果使用不同的变量名 print
,对未修改的结果 return
:
def wrapper(*args):
t0 = time.time()
raw_result = func(*args) # use a different variable name here
elapsed = time.time() - t0
name=func.__name__
args = ','.join(repr(arg) for arg in args)
result=repr(raw_result) # convert to string for display
print(fmt.format(**locals()))
return raw_result # return the unmodified version