On 2020-02-03 10:39 AM, Peter Otten wrote:
Frank Millman wrote:
This is a minor issue, and I have found an ugly workaround, but I
thought I would mention it.
Like this?
children = list(xml)
for y in children:
print(etree.tostring(y))
if y.get('z') == 'c':
child = etree.Element('y', attrib={'z': 'd'})
xml.append(child)
children.append(child)
It doesn't look /that/ ugly to me.
That is not bad. My actual solution was to revert to the non-pythonic
method of iterating over a list -
pos = 0
while pos < len(xml):
y = xml[pos]
print(etree.tostring(y))
if y.get('z') == 'c':
xml.append(etree.Element('y', attrib={'z': 'd'}))
pos += 1
That way, if I append to xml, I automatically pick up the appended element.
In Python I can iterate through a list, and on a certain condition
append a new item to the list, which is then included in the iteration.
Personally I follow the rule "never mutate a list you are iterating over",
even for appends, where the likelihood of problems is small:
items = ["a"]
for item in items:
if item == "a": items.append("a")
I did feel a bit uneasy doing it, but once I had got it working it did
not feel too bad. I did not test for appending from the last item, so
that bug has just bitten me now, but I will run with my workaround
unless/until lxml is fixed.
Is there any chance that this can be looked at, or is it just the way it
works?
File a bug report and see if the author is willing to emulate the list
behaviour.
Will do.
BTW, I see that ElementTree in the standard library does not have this
problem.
Maybe uses a list under the hood.
Thanks for the advice.
Frank
--
https://mail.python.org/mailman/listinfo/python-list