Tengo el siguiente método para imprimir una lista anidada:
def stringify(self, item=None):
if isinstance(item, list):
return [self.stringify(subitem) for subitem in item]
if isinstance(item, Token):
return str(item)
E imprime el elemento así según su método __str__:
["<PLUS: '+'>", "<NUMBER: '2.0'>", ["<TIMES: '*'>", "<NUMBER: '3.0'>", "<NUMBER: '4.0'>"]] ["<USER_DEFINED: 'factorial'>", "<NUMBER: '5.0'>"]
Sin embargo, no quiero que muestre el mensaje " alrededor del propio artículo. Es decir, quiero que se imprima así:
[<PLUS: '+'>, <NUMBER: '2.0'>, ...
¿Cómo haría eso?
------------------------------------
Al final, devolverá una lista de cadenas en lugar de convertir la lista en una cadena. list.__str__ siempre llama a repr en sus elementos, por lo que obtienes las comillas explícitas. Para evitar eso, puedes usar str.join para omitir repr:
if isinstance(item, list):
return '[' + ', '.join(self.stringify(subitem) for subitem in item) + ']'
------------------------------------
Sí, puedes hacer esto agregando el método __repr__ al objeto Token:
def __repr__(self):
return str(self) # redirect for __repr__ --> __str__
Y ahora ni siquiera necesitarás llamar a str(item) en tu método stringify, y puedes cambiarlo para que simplemente devuelva el objeto en sí:
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
Y al ejecutarlo obtendrás:
# [<PLUS: '+'>, <NUMBER: '2.0'>, [<TIMES: '*'>, <NUMBER: '3.0'>, <NUMBER: '4.0'>]] [<USER_DEFINED: 'factorial'>, <NUMBER: '5.0'>]