Python - ¿Cómo deshacerse de las comillas al imprimir una lista?

CorePress2024-01-25  9

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'>]

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare