произвольный распаковываемый функторный класс в python

Есть ли способ реализовать класс, чтобы его можно было сопоставить с функцией карты и распаковать как кортеж? Что-то такое:

class T
...
t = T(1,[1,2,3])
a, b = t
a==1 #True
b==[1,2,3] #True
list(map(str,t))==['1','2','3'] #True

Пробовал использовать __iter__ но оказывается используется для распаковки и карты.

В основном я хочу решить, какую часть кортежа я отображаю, возвращаю и распаковываю, как обычный кортеж.


person codemonkey    schedule 30.01.2016    source источник
comment
list(map(str,t)) == ['1','2','2'] должно быть list(map(str,t)) == ['1', '[1,2,3]'] ?   -  person Grijesh Chauhan    schedule 30.01.2016
comment
Вы пытаетесь сделать так, чтобы распаковка и map относились к вашему объекту так, как будто он состоит из разных элементов? Невозможно, если только вы не хотите сотворить серьезную черную магию со стеком вызовов.   -  person user2357112 supports Monica    schedule 30.01.2016
comment
В основном да... Я пытался распаковать getitem другим способом, но все сводится к iter   -  person codemonkey    schedule 30.01.2016
comment
Как у тебя дела с '1', '2', '2'?   -  person BrenBarn    schedule 30.01.2016
comment
Я хочу рассматривать класс как список при отображении и как кортеж при распаковке.   -  person codemonkey    schedule 30.01.2016
comment
@codemonkey: Это все еще не объясняет вашего поведения. Если то, что предложил пользователь 2357112, верно, вы хотите рассматривать его как список в одной ситуации и как список с другим содержимым в другой ситуации (т. [1, 2, 3]). По его словам, это невозможно. И карта, и распаковка делают одно и то же, то есть итерацию.   -  person BrenBarn    schedule 30.01.2016
comment
@BrenBarn Ну, я пытался сделать что-то, что работает в Haskell, где вы можете реализовать интерфейс, чтобы сделать ваш тип данных функтором / отображаемым и извлекать значения с сопоставлением шаблонов, то есть распаковкой ...   -  person codemonkey    schedule 31.01.2016


Ответы (1)


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

class T(object):
    def __init__(self, *args):
        self.data = args

    def __iter__(self):
        for value in self.data:
            if type(value) is str or type(value) is int:
                yield str(value)
            elif type(value) is list:
                for x in value:
                    yield str(x)

t = list(T(1, [1, 2]))

print t
person JRazor    schedule 30.01.2016
comment
Это дает мне: list(map(str,t)) == ['1', '[1, 2]'] не ['1','2','3'] - person codemonkey; 30.01.2016