【发布时间】:2018-05-16 09:21:40
【问题描述】:
我正在解析一个 XML 文件,其中一个 xml 标记的结构如下:
<product>
<item seq="division-sec">Division</item>
<item seq="dept-sec">Dept Info</item>
<item seq="label01">Label 01</item>
<item seq="label02">Label 02</item>
...
<item seq="labelN">Label N</item>
<item seq="date-mfg">27-11-2017</item>
<item seq="date-exp">28-11-2019</item>
</product>
我编写了一个生成器函数来按顺序访问产品标签:
def product_labels(xmlpage):
#... parsed xml here
for item in xmlpage:
#-- process item for validation such as case sensitivity, etc
yield item # ("division-sec", "Division")
现在我正在寻找一个函数,或者可能是一个迭代器类,它可以让我获得 first、last、prev、next 和 search 方法:
class ProdcutReader(object):
def __init__(self, product_labels):
self.product_labels = product_labels
def __iter__(self):
return self
def __prev__(self):
return prev(self.product_labels ) #-- Dont know how to do this :(
def __next__(self):
current = self.current(next(self.product_labels))
return current
def current(self, obj=None):
if not obj:
return self.first()
return obj
def first(self):
return list(self.product_labels)[0]
# search by label seq
def search(self, seq):
# Not sure if this is the correct way
for i in self.product_labels:
if i[0] == seq:
self.current(i)
return i
... # With some more methods (if search works I can have some more methods)
所以假设我需要使用那个对象,它应该像这样工作:
from product_reader import ProdcutReader as Reader
>>>r = Reader(product_labels)
>>>r.first()
("division-sec", "Division")
>>>r.last()
("date-exp", "28-11-2019")
>>>r.current() # Let us say current is ("label01", "Label 01")
("label01", "Label 01")
>>>r.next() # or next(r)
("label02", "Label 02")
>>>r.prev()
("dept-sec", "Dept Info")
>>r.search("date-mfg") # This should also set the searched as r.current()
("date-mfg", "27-11-2017")
如果我知道如何为 prev、next 和 search 编写方法,我将能够编写剩余的方法,例如 first、last、current 等。
【问题讨论】:
-
发布一个测试用例,显示调用
prev()、nex()、first()等方法时的预期结果 -
@RomanPerekhrest - 感谢您的建议,编辑了我的帖子。
-
为什么
def current(self, obj=None)方法应该接受obj参数?什么原因? -
@RomanPerekhrest - 这是一个错字,已编辑!
-
迭代器只前进。不支持第一个、最后一个或前一个元素,因为那样你就会有一个 sequence。迭代器是一次只在一个方向上移动的对一件事的序列的高效内存访问。
标签: python-3.x iterator