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

时间:2010-08-04 23:26:36

标签: 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

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

3 个答案:

答案 0 :(得分:12)

不,你必须将其转换为str your

'-'.join(('carnitas',str(lunch)))

如果您必须为整个项目序列执行此操作

'-'.join(str(x) for x in seq)

'-'.join(map(str, seq))

对于您的特定情况,您可以写

'carnitas-'+str(lunch)

答案 1 :(得分:8)

''.join不会对其加入的序列中的项目调用__str__。毕竟每个对象都有一个__str__(只能继承自object),因此,如果join以这种方式工作,它会加入任何序列(在字符串化之后) - 通常是奇怪的效果。最好让用户在保证时明确地调用str(“明确比隐含更好”是“禅之谜”中的格言之一,毕竟)。

如果你想“成为”一个字符串,你可以继承strunicode。否则,需要进行明确的str调用,以使您的类型的实例“成为”字符串。

答案 2 :(得分:1)

str.join的来电签名是:

S.join(sequence) -> string

Return a string which is the concatenation of the strings in the
sequence.  The separator between elements is S.

请注意,sequence应该是一系列字符串。很多对象都有__str__个方法,但并非所有方法(如Stringy)都是str的实例。

当然,修复很简单:

'-'.join(('carnitas',str(lunch)))