如何使一个类充当两个元素元组和解包元素?

时间:2019-06-13 10:47:52

标签: python iterable-unpacking

假设我有以下一段代码

(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)

有什么方法可以避免出现x1x2等问题,并且直接将其解压缩到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 个答案:

答案 0 :(得分:1)

这是一种方法,但是它不是特别可读(不过我很喜欢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)))