python - 如何使一个类充当两个元素元组并解包元素?
问题描述
假设我有以下一段代码
(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
etc 和 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
是给定的,我不能将其更改为直接返回对象。
解决方案
这是一种方法,但它不是特别可读(虽然我很喜欢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)))
推荐阅读
- vba - 范围的 Excel 动态列引用
- java - 无法从java中的日志文件解析json对象
- node.js - 使用 RxJS 使用 Observables 同步大型数据集(系统到系统)的正确设置
- c++ - 使用标准 c++ printf() 函数作为自定义库的接口以打印到字符显示的正确方法
- angular - Angular 2`无法读取未定义的属性'dataService'
- python - 从另一列 pandas df 分配值的有效方法
- mysql - 使用 MySQL,为什么这个日期查询显示不正确的结果?
- hibernate - 在另一个事务正在进行时阻止应用程序线程读取数据库
- jquery - 如何在 fullcalendar 中删除对象事件源?
- javascript - 本地主机:3000 版本显示与 Heroku 部署版本不同 - Node.js