python:如何覆盖str.join?

buk*_*zor 2 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'
Run Code Online (Sandbox Code Playgroud)

Rei*_*ica 5

你的班级不能覆盖join:

class MyStr(unicode):
    def join(self, strs):
        # your code here
Run Code Online (Sandbox Code Playgroud)

这将至少涵盖的情况 MyStr(...).join(...)

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

代码可以在这里看到.看看这个PyUnicode_Join函数,尤其是这一行:

res = _PyUnicode_New(res_alloc);
Run Code Online (Sandbox Code Playgroud)

所以,结果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;
}
Run Code Online (Sandbox Code Playgroud)

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

':'.join( [MyStr('A'), 'B', u'C'] )
Run Code Online (Sandbox Code Playgroud)