首页 > 解决方案 > 如何使一个类充当两个元素元组并解包元素?

问题描述

假设我有以下一段代码

(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, x2etc 和 unpack 直接到 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是给定的,我不能将其更改为直接返回对象。

标签: pythoniterable-unpacking

解决方案


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

推荐阅读