gpt4 book ai didi

python:如何覆盖 str.join?

转载 作者:行者123 更新时间:2023-11-28 22:03:56 25 4
gpt4 key购买 nike

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

至少,所有 MyStr 的连接应该产生另一个 MyStr,而 MyStr 和“普通”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'

最佳答案

你的类(class)不能覆盖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'] )

关于python:如何覆盖 str.join?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7984923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com