假设我有以下一段代码
(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
,而我不能将其更改为直接返回对象。
答案 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)))