【问题标题】:Why does repr() add escape characters?为什么 repr() 添加转义字符?
【发布时间】:2018-01-21 03:58:21
【问题描述】:

来自下面的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)在输出字符串中添加转义字符?

【问题讨论】:

  • 你能分享一下你目前的结果吗?
  • @AnthonyPham 查询已编辑

标签: python python-3.x repr


【解决方案1】:

repr 返回一个字符串——当复制/粘贴到 Python 源代码中时——将创建相同的值。当您想查看人类可读的字符串时,您可能希望使用str

【讨论】:

    【解决方案2】:

    您遇到的问题是您的 clock 装饰器正在更改您的函数返回的类型。我怀疑您打算将行 result=repr(result) 仅影响当前行的打印,但它会影响后面的行,因为当返回 result 时,它是一个字符串而不是列表。当它包含在后面的结果中时,引号会发生冲突,Python 开始使用反斜杠来转义它们。然后它需要更多的反斜杠来逃避以前的反斜杠,最终得到你所显示的混乱。

    尝试为repr'd 结果你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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-26
      • 2010-11-05
      • 2019-03-24
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      相关资源
      最近更新 更多