питон: как переопределить str.join? - PullRequest
2 голосов
/ 02 ноября 2011

У нас есть подкласс 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 ]

5 голосов
/ 02 ноября 2011

Не может ваш класс просто переопределить join:

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

Это будет, по крайней мере, охватывать случай MyStr(...).join(...)

После комментария @ bukzor я посмотрел, как это работает, и похоже, что join - это функция C, которая всегда возвращает объект unicode при вызове с использованием разделителя unicode.

Код можно увидеть здесь . Взгляните на функцию 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'] )
0 голосов
/ 03 ноября 2011

join() - это метод str.Если после этого вы захотите получить объект MyStr, используйте объединение MyStr для объединения.

Если вы хотите TypeError, вам не придется наследовать от str и предоставьте все методы str самостоятельно (по крайней мере те, которые вам нужны).Впрочем, вполне возможно, что это сделает их практически бесполезными для обычных строковых операций.

...