python:如何覆盖str.join?

时间:2011-11-02 17:47:13

标签: python string subclass

我们有一个str的子类(称之为MyStr),我需要能够控制str.join如何与我的子类交互。

至少,所有MyStr的连接应该产生另一个MyStr,并且MyStr和“plain”str的连接应该抛出TypeError。

目前,这是发生的事情:( MyStr子类unicode)

>>> m = MyStr(':')

>>> m.join( [MyStr('A'), MyStr('B')] )
u'A:B'

>>> ':'.join( [MyStr('A'), 'B', u'C'] )
u'A:B:C'

2 个答案:

答案 0 :(得分:5)

您的班级无法覆盖join

class MyStr(unicode):
    def join(self, strs):
        # your code here

这至少会涵盖MyStr(...).join(...)

的情况

在@ bukzor的评论之后,我查看了它是如何工作的,看起来join是一个C函数,在使用unicode分隔符调用时总是返回unicode个对象。

The code can be seen here。看看PyUnicode_Join函数,尤其是这一行:

res = _PyUnicode_New(res_alloc);

因此,PyUnicode_Join的结果将始终是PyUnicode的实例。

我能看到的唯一错误情况是输入不是unicode:

/* Convert item to Unicode. */
if (! PyUnicode_Check(item) && ! PyString_Check(item)) {
    PyErr_Format(PyExc_TypeError,
                 "sequence item %zd: expected string or Unicode,"
                 " %.80s found",
                 i, Py_TYPE(item)->tp_name);
    goto onError;
}

所以我认为不可能使这种情况失败(至少,当你的对象从unicode扩展时):

':'.join( [MyStr('A'), 'B', u'C'] )

答案 1 :(得分:0)

join()是一种str方法。如果您想在之后使用MyStr对象,则可以使用MyStr ojbect进行连接。

如果您想要TypeError,则必须不继承str并自行提供所有str方法(至少是您需要的方法)。但是,很有可能这会使它们对正常的字符串操作毫无用处。