Python嵌套的“uuurepr”将换行符还原为\\";

Python嵌套的“uuurepr”将换行符还原为\\";,python,string,recursion,escaping,repr,Python,String,Recursion,Escaping,Repr,我希望此代码可以打印: class MyClass: def __init__(self): self.list_ = [] def __repr__(self): return '\n'.join(['this','should','all','be','on','separate','lines']) + str([str(list_val) for list_val in self.list_]) myClass = MyClass() m

我希望此代码可以打印:

class MyClass:
    def __init__(self):
        self.list_ = []
    def __repr__(self):
        return '\n'.join(['this','should','all','be','on','separate','lines']) + str([str(list_val) for list_val in self.list_])

myClass = MyClass()
myClass.list_.append(MyClass())
myClass.list_[0].list_.append(MyClass())
print(myClass)
或者类似的东西,但它会打印出来

this
should
all
be
on
separate
lines[this
should
all
be
on
separate
lines[this
should
all
be
on
separate
lines]]
也就是说,当我试图将一个对象转换为一个字符串,而该对象已经在同一类的另一个对象的
\uuuu repr\uuuu
方法中时,它会将一个换行符转换为
\n
,如果我进一步嵌套它,它会导致
\\n
,每次嵌套它时,它都会在转义序列之前添加一个额外的反斜杠


在阅读之后,似乎
\uu repr\uuu
方法认为我实际上想要两个字符
\
n
,但我不想要:我想要转义序列
\n
。有没有办法覆盖它并强制它将其解释为换行符而不是两个单独的字符?

问题在于字符串的
repr
将特殊字符转换为转义序列。这意味着如果对带有特殊字符的字符串递归调用
repr
,反斜杠会堆积起来:

this
should
all
be
on
separate
lines["this\nshould\nall\nbe\non\nseparate\nlines['this\\nshould\\nall\\nbe\\non\\nseparate\\nlines[]']"]
您遇到这种情况是因为您的
\uuu repr\uuu
调用列表中的
str
,而列表中的
str
对列表中的每个项目使用
repr
(而不是
str
):

>>> print("First line\nSecond line")
First line
Second line
>>> print(repr("First line\nSecond line"))
'First line\nSecond line'
>>> print(repr(repr("First line\nSecond line")))
"'First line\\nSecond line'"
请注意,
\n
出现在这里,就像在第一个示例中对字符串本身调用
repr
一样。这是因为列表对其内容调用
repr
来显示自己

因此,通过执行
str([…])
,您正在对列表的内容调用
repr
,这意味着您在递归调用嵌套对象,这意味着反斜杠会像您看到的那样堆积起来

如果要避免这种情况,需要避免对嵌套对象调用repr。您可以通过使用
join
手动创建字符串来完成此操作,类似于您已经完成的操作,而不是在列表上调用
str

>>> print('First line\nSecond line')
First line
Second line
>>> print(['First line\nSecond line'])
['First line\nSecond line']
然后你的
print(myClass)
会给出你想要的结果。

哇,惊人的答案——难度等级11。
def __repr__(self):
    innerRepr = '['+'\n'.join(str(list_val) for list_val in self.list_) + ']' if self.list_ else ''
    return '\n'.join(['this','should','all','be','on','separate','lines']) + innerRepr