[Python] Python skips recursion if yield is present

Discussão em 'Python' iniciado por Stack, Janeiro 20, 2025.

  1. Stack

    Stack Membro Participativo

    I have the following XML file:

    <?xml version="1.0" encoding="UTF-8"?>
    <xliff version="1.2" xmlns="urn:eek:asis:names:tc:xliff:document:1.2" xmlns:eek:kp="okapi-framework:xliff-extensions" xmlns:its="http://www.w3.org/2005/11/its" xmlns:itsxlf="http://www.w3.org/ns/its-xliff/" its:version="2.0">
    <file original="temp/file_conversion/tmp4a9kn6bn/69502fea-751c-4c3c-a38a-4fce9e13ebde.txt" source-language="en" target-language="ar" datatype="x-text/plain" okp:inputEncoding="UTF-8">
    <body>
    <trans-unit id="1idhasofh" xml:space="preserve">
    <source xml:lang="en">foo<bpt id="0">&lt;bar&gt;</bpt>&lt;Instruction><ept id="0">&lt;crow&gt;</ept>&lt;grande&gt;</source>
    <target xml:lang="ar">foo<bpt id="0">&lt;bar&gt;</bpt>&lt;Instruction><ept id="0">&lt;crow&gt;</ept>&lt;grande&gt;</target>
    </trans-unit>
    </body>
    </file>
    </xliff>


    I'm trying to create a function that parses an XML file that I've read into an ElementTree.Element:

    from xml.etree import ElementTree as ET


    def parse_xml(ele: ET.Element):
    tag = ele.tag
    if not isinstance(tag, str) and tag is not None:
    return
    t = ele.text
    if t:
    yield t
    for e in ele:
    parse_xml(e)
    t = e.tail
    if t:
    yield t

    def main():
    fp = "path/to/xml"
    tree = ET.parse(fp)
    root = tree.getroot()

    t_units = root.findall(".//{*}trans-unit")
    for source, target in t_units:
    for ele in parse_xml(source):
    print(ele)


    I get:

    foo
    <Instruction>
    <grande>


    In my debugger, I see that parse_xml(e) gets skipped. When I replace the yields with print statements:

    def parse_xml(ele: ET.Element):
    tag = ele.tag
    if not isinstance(tag, str) and tag is not None:
    return
    t = ele.text
    if t:
    print(t)
    for e in ele:
    parse_xml(e)
    t = e.tail
    if t:
    print(t)


    I get the expected result (reaches all the tagged text):

    foo
    <bar>
    <Instruction>
    <crow>
    <grande>


    Why does this happen with yield?

    Continue reading...

Compartilhe esta Página