在Python 3.6中。我想要做的是创建一个可以接受任何对象然后生成类似内容的树的函数。
与书类似:
def contents(a, n = 0, lim = 5, prefix=""):
index = 1
text = ""
j = None
if n < lim:
try:
for i in a.__dict__:
text = text + "\n" + ("\t" *(n)) + prefix + str(index) + ", " + str(i) + ": " + contents(a.__dict__[i], n = n + 1, prefix=str(n)+".") + ""
index += 1
except:
try:
for i, j in a.items():
text = text + "\n" + ("\t"*(n)) + prefix + str(index) + ", " + str(i) + ": " + contents(i, n = n + 1, prefix=str(n)+".") + ""
index += 1
except:
if isinstance(a, str):
text = text + "\n" + ("\t"*(n)) + prefix + str(index) + ", " + str(a) + " "
else:
try:
for i in a:
text = text + "\n" + ("\t"*(n)) + prefix + str(index) + ", " + str(i) + contents(i, n = n + 1, prefix=str(n)+".") + " "
index += 1
except:
text = text + "\n" + ("\t"*(n)) + prefix + str(index) + ", " + str(a) + " "
else:
text = text + "limit. \n"
return text
我的目的是使用数字作为技术读数的关键,数字也可以代表比ID()生成更容易理解的ID号。因为我想要处理的对象都是类型,所以我希望函数是递归的。以下是我到目前为止的情况:
class Aclass:
def __init__(self):
self.a = [12, 24]
self.b = 5
a = [Aclass(), 1, "2", 3, 4, Aclass(), {"c":"d","e":"f"}]
a是对象,n是当前的递归数,lim是递归限制,前缀与显示的对象ID有关。
这是测试对象
{{1}}
我遇到的问题与列表的奇怪反复行为有关,我已经为字符串做了一个异常,因为字符串会注册为由迭代组成的迭代,如果我没有&可以无限期地递归#39; t限制。现在简单的数字列表如[1,2,3,4]通常会将数字列为两次,就好像它分解为一个项目列表[1],然后报告内部数字:1。
答案 0 :(得分:1)
您应该查看pprint
模块,它是标准发行版的一部分。它已经解决了这个问题,因此可以作为代码的基础。 (例如,我可以通过继承PrettyPrinter
类来添加数字。)
此代码:
class Aclass:
def __init__(self):
self.a = [12, 24]
self.b = 5
a = [Aclass(), 1, "2", 3, 4, Aclass(), {"c":"d","e":"f"}]
import pprint
s = pprint.pformat(a, indent=4)
print(s)
生成此输出:
[ <__main__.Aclass object at 0x1060fb160>,
1,
'2',
3,
4,
<__main__.Aclass object at 0x1060fb198>,
{'c': 'd', 'e': 'f'}]