python:如何覆盖str.join?
我们有一个子类str(称之为MyStr),我需要能够控制str.join如何与我的子类交互 至少,所有MyStr的连接应该产生另一个MyStr,而MyStr和“普通”str的连接应该抛出一个TypeError 目前,情况就是这样:(MyStr子类unicode)python:如何覆盖str.join?,python,string,subclass,Python,String,Subclass,我们有一个子类str(称之为MyStr),我需要能够控制str.join如何与我的子类交互 至少,所有MyStr的连接应该产生另一个MyStr,而MyStr和“普通”str的连接应该抛出一个TypeError 目前,情况就是这样:(MyStr子类unicode) 你的类不能重写加入: class MyStr(unicode): def join(self, strs): # your code here 这将至少涵盖MyStr(…).join(…) 在@bukzor的评
你的类不能重写
加入:
class MyStr(unicode):
def join(self, strs):
# your code here
这将至少涵盖MyStr(…).join(…)
在@bukzor的评论之后,我查看了它的工作原理,它看起来像是一个C函数,当使用unicode
分隔符调用时,它总是返回unicode
对象
。看看PyUnicode\u Join
函数,尤其是这一行:
res = _PyUnicode_New(res_alloc);
因此,PyUnicode\u 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()
是一种str
方法。如果您想在之后得到一个MyStr
对象,您需要使用MyStr
ojbect来进行连接
如果你想要一个TypeError
,你就不必继承str
,而是自己提供str
的所有方法(至少是你需要的方法)。不过,这很可能会使它们在正常的字符串操作中基本上没有用处。@Brendan Long,Raymond Hettinger:这行不通。请参阅:@bukzor-你说得对,重载\uuuu add\uuuu
不足以使“:”。join([MyStr(“a”),“a”)
失败。也许join
使用格式字符串?或者它可能只是一个C函数。因为另一部分(重载join
)确实有效,所以我把这一部分删掉了。看看unicode.join实现(Objects/unicodeobject.c:PyUnicode\u join),它看起来只是无条件地将所有内容转换为unicode。类似地,如果任何项是unicode(或子类),str.join实现将调用unicode.join@雷蒙德·海廷格:我说得对吗?@Brendan Long:这让我很难过,但似乎是真的。现在我需要将这个对象转换为非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;
}
':'.join( [MyStr('A'), 'B', u'C'] )