开发者

Passing around an ElementTree

In my pr开发者_如何学编程ogram, I need to make use of an ElementTree object in various functions in my program.

More specifically, I am doing this:

tree = etree.parse('somefile.xml')

I am passing this tree around in my program.

I was wondering whether this is a good approach, or can I do this:

  1. Create a global tree (I come from a C++ background and I know global is bad)
  2. Create the tree again wherever required.

Or is my approach ok?


In Python, (eliding complexities, making an analogy for your C++ background) all objects are passed by reference. And since "tree" is an object, you're only passing the reference. Now, if you have a group of related methods that operate on the same tree, you might want to consider creating a class with that tree object as a member.

Also, here's a quick reference to the complexities I glossed over above: http://www.testingreflections.com/node/view/5126


Usually what I do is parse the tree using ElementTree and then convert the whole mess into a list of objects and pass that around instead - much easier to deal with afterwards as the rest of the code doesn't have to be aware that the stuff originated from some god-awful xml file.


Passing it around is definitely better than recreating it every time you want to use it. Parsing the file is an expensive operation. Here are some suggestions for performance improvements with lxml.


import xml.dom.minidom as md
import xml.etree.ElementTree as ET
def some_function():
    main_tag = ET.Element("main_tag")
    sub_tag = ET.SubElement(main_tag,"sub_tag")
    return(ET.tostring(main_tag))
def some_other_function():
    x = some_function()
    root = ET.fromstring(x)
    for tags in root:
        element_next = ET.SubElement(tags,"some_newtag")
dom = md.parseString(ET.tostring(root))
pretty_xml = dom.toprettyxml(indent="\t", encoding="utf-8")
print(pretty_xml)
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜