Как заставить класс выступать в качестве двухэлементных элементов tuple и unpack? - PullRequest
0 голосов
/ 13 июня 2019

Допустим, у меня есть следующий фрагмент кода

(x1, y1), (x2, y2) = foo()

class Bar:
    def __init__(self, x, y):
        self.x = x
        self.y = y

bar1 = Bar(x1, y1)
bar2 = Bar(x2, y2)

Есть ли способ избежать использования x1, x2 и т. Д. И распаковать его непосредственно в экземпляр Bar, например, так:

bar1 = Bar()
bar2 = Bar()

bar1, bar2 = foo()

Я бы ожидал некоторый магический метод, такой как:

class Bar:  
    def __init__(self):
        self.x = None
        self.y = None
    def __unpack__(self, x, y):
        self.x = x
        self.y = y

Но такого метода не существует (или я ошибаюсь?).Как я могу сделать это по-другому?

Предположим, что дано foo, и я не могу изменить его для непосредственного возврата объектов.

1 Ответ

1 голос
/ 13 июня 2019

Вот способ, но он не особо читабелен (хотя мне нравится tuplify!)

def tuplify(seq, tuple_len): 
    """
    Groups elements of sequence to tuples of length tuple_len
    """
    return [tuple(el for idx, el in g[1]) for g in itertools.groupby(enumerate(seq), key=lambda x: x[0]//tuple_len)]

bar1, bar2 = (Bar(*tup) for tup in tuplify(foo(), 2)))
...