Python中的模糊迭代器行为
因此,我尝试使用somo Odoo代码Qweb模板,使其更加具体,我发现了这个函数Python中的模糊迭代器行为,python,Python,因此,我尝试使用somo Odoo代码Qweb模板,使其更加具体,我发现了这个函数 def foreach_iterator(base_ctx, enum, name): ctx = base_ctx.copy() if not enum: return if isinstance(enum, int): enum = xrange(enum) size = None if isinstance(enum, Sized):
def foreach_iterator(base_ctx, enum, name):
ctx = base_ctx.copy()
if not enum:
return
if isinstance(enum, int):
enum = xrange(enum)
size = None
if isinstance(enum, Sized):
ctx["%s_size" % name] = size = len(enum)
if isinstance(enum, Mapping):
enum = enum.iteritems()
else:
enum = izip(*tee(enum))
value_key = '%s_value' % name
index_key = '%s_index' % name
first_key = '%s_first' % name
last_key = '%s_last' % name
parity_key = '%s_parity' % name
even_key = '%s_even' % name
odd_key = '%s_odd' % name
for index, (item, value) in enumerate(enum):
ctx[name] = item
ctx[value_key] = value
ctx[index_key] = index
ctx[first_key] = index == 0
if size is not None:
ctx[last_key] = index + 1 == size
if index % 2:
ctx[parity_key] = 'odd'
ctx[even_key] = False
ctx[odd_key] = True
else:
ctx[parity_key] = 'even'
ctx[even_key] = True
ctx[odd_key] = False
yield ctx
# copy changed items back into source context (?)
# FIXME: maybe values could provide a ChainMap-style clone?
for k in base_ctx.keys():
base_ctx[k] = ctx[k]
这个函数是如何实现t-foreach的,所以它应该在您传递给它的任何内容上创建一个迭代器
但是
>>> list(foreach_iterator({},[1,2,3],"name"))
[{'name': 2,
'name_even': False,
'name_first': False,
'name_index': 1,
'name_last': True,
'name_odd': True,
'name_parity': 'odd',
'name_size': 2,
'name_value': 2},
{'name': 2,
'name_even': False,
'name_first': False,
'name_index': 1,
'name_last': True,
'name_odd': True,
'name_parity': 'odd',
'name_size': 2,
'name_value': 2}]
然后
>>> k = foreach_iterator({},[1,2],"name")
>>> k.next()
{'name': 1,
'name_even': True,
'name_first': True,
'name_index': 0,
'name_last': False,
'name_odd': False,
'name_parity': 'even',
'name_size': 2,
'name_value': 1}
>>> k.next()
{'name': 2,
'name_even': False,
'name_first': False,
'name_index': 1,
'name_last': True,
'name_odd': True,
'name_parity': 'odd',
'name_size': 2,
'name_value': 2}
我已经做了一段时间Python的事情了,所以我知道肯定有遗漏
一些愚蠢的事情,但为了我的生命,我不知道它是什么
有人要吗?提前感谢。生成器功能正在一次又一次地覆盖ctx引用的同一dict的内容 在测试代码的第二个变体中,内容会在覆盖之间打印出来,因此更改是可见的
这可能是为了进行某种优化,不总是创建新词典,但显然是危险的。生成器一次又一次地覆盖ctx引用的同一dict的内容。在第二种变体中,内容在覆盖之间打印出来。就是这样!!!你能把你的评论贴出来作为答案来标记它是被接受的吗?我已经这样做了,谢谢。