如何在打印列表时去掉字符串引号?

2024-09-22 20:38:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用以下方法打印嵌套列表:

def stringify(self, item=None):
    if isinstance(item, list):
        return [self.stringify(subitem) for subitem in item]
    if isinstance(item, Token):
        return str(item)

它根据__str__方法打印如下项:

["<PLUS: '+'>", "<NUMBER: '2.0'>", ["<TIMES: '*'>", "<NUMBER: '3.0'>", "<NUMBER: '4.0'>"]] ["<USER_DEFINED: 'factorial'>", "<NUMBER: '5.0'>"]

但是,我不希望它在项目本身周围显示"。也就是说,我希望它可以这样打印:

[<PLUS: '+'>, <NUMBER: '2.0'>, ...

我该怎么做


Tags: 方法selfnonenumber列表returnifdef
2条回答

最后,您将返回一个字符串列表,而不是将列表转换为字符串list.__str__总是在其元素上调用repr,因此可以得到显式引号。为了避免这种情况,可以使用str.join绕过repr

if isinstance(item, list):
    return '[' + ', '.join(self.stringify(subitem) for subitem in item) + ']'

是的,您可以通过将^{}方法添加到Token对象上来实现这一点:

def __repr__(self):
    return str(self) # redirect for __repr__  > __str__

现在您甚至不需要在stringify方法中调用str(item),并且可以将其更改为仅返回对象本身:

def stringify(self, item=None):
    if isinstance(item, list):
        return [self.stringify(subitem) for subitem in item]
    if isinstance(item, Token):
        return item     # do not need str(item) anymore

运行它,您现在将获得:

# [<PLUS: '+'>, <NUMBER: '2.0'>, [<TIMES: '*'>, <NUMBER: '3.0'>, <NUMBER: '4.0'>]] [<USER_DEFINED: 'factorial'>, <NUMBER: '5.0'>]

相关问题 更多 >