Python的join()不会加入我对象的字符串表示(__str__)

amp*_*ata 5 python

我不确定我在这里做错了什么:

>>> class Stringy(object):
...     def __str__(self):
...             return "taco"
...     def __repr__(self):
...             return "taco"
... 
>>> lunch = Stringy()
>>> lunch
taco
>>> str(lunch)
'taco'
>>> '-'.join(('carnitas',lunch))
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
TypeError: sequence item 1: expected string, Stringy found
Run Code Online (Sandbox Code Playgroud)

鉴于我__str__()在Stringy对象中包含了该方法,不应该join()将午餐看作字符串?

Joh*_*ooy 12

不,你必须将它转换为str自己

'-'.join(('carnitas',str(lunch)))
Run Code Online (Sandbox Code Playgroud)

如果你必须为整个项目序列做这件事

'-'.join(str(x) for x in seq)
Run Code Online (Sandbox Code Playgroud)

要么

'-'.join(map(str, seq))
Run Code Online (Sandbox Code Playgroud)

对于你的特殊情况,你可以写

'carnitas-'+str(lunch)
Run Code Online (Sandbox Code Playgroud)


Ale*_*lli 8

''.join不会调用__str__它加入的序列中的项目. 毕竟每个对象都有一个__str__(它只是从它继承而来object),因此如果以join这种方式工作,它将连接任何序列(在字符串化之后) - 通常是奇怪的效果.最好让用户str在保证时明确地调用("显然优于隐式"是"Python的禅宗"中的格言之一,毕竟).

您可以子类化,str或者unicode如果您想"成为"一个字符串.否则,str将需要显式调用以使您的类型的实例"成为"字符串.