присоединяйтесь к моим типам - PullRequest
0 голосов
/ 12 октября 2011

Есть ли возможность присоединиться к моим типам используя:

str.join()

У меня есть класс:

class Slice(object):
    def __init__(self, start, end):
        self.__start = start
        self.__end = end

    def __str__(self):
        return '{0}:{1}'.format(self.__start, self.__end)

    def __repr__(self):
        return "'{}'".format(str(self))

Что я должен переопределить для выполнения такого кода:

','.join(Slice(1, 2), Slice(3, 4))

И получите такой результат:

'1:2,3:4'

Ответы [ 3 ]

7 голосов
/ 12 октября 2011

Ничего.

','.join(str(x) for x in (Slice(1, 2), Slice(3, 4)))
0 голосов
/ 12 октября 2011

Просто ради этого, я решил не использовать итеративную функцию для вызова str (x)Так вот мое решение

x=(Slice(1, 2), Slice(3, 4))
','.join(['%s']*len(x)) % x
0 голосов
/ 12 октября 2011

Я всегда просто делаю это:

','.join(map(str, (Slice(1, 2), Slice(3, 4)))

Но вы также можете создать служебную функцию:

def strseq(*args):
    for arg in args:
        yield str(arg)
','.join(strseq(Slice(1, 2), Slice(3, 4)))

Я думаю, что это сделано намеренно и в целом хорошо: Python строгонабрал и это вытряхнет некоторые глупые ошибки во время выполнения.Так что не пытайтесь сделать Slice a str, но вместо этого map до str.

Если вы действительно хотите стать хакерами, сделайте следующее:

class Slice(str):
    def __init__(self, start, end):
        self.__start = start
        self.__end = end
        str.__init__('{0}:{1}'.format(self.__start, self.__end))

Я получаю сообщение об ошибке «TypeError: str () принимает не более 1 аргумента (задано 2)», когда я вызываю str.__init__(self, 'test') в конструкторе, что обычно является правильным способом сделать это,Я думаю, так что это хороший знак того, что вы не должны подклассы str.Но продолжай.Стреляй себе в ногу.Это больно, но в старом добром старомодном стиле «учись чему-то новому» :)

...