8000 Load treebuilder and treewalker "submodules" only when needed (I'm ex… · awesome-python/html5lib-python@d25f3c6 · GitHub
[go: up one dir, main page]

Skip to content

Commit d25f3c6

Browse files
committed
Load treebuilder and treewalker "submodules" only when needed (I'm expecting this could save some initialization time for applications using html5lib, though I have no figure and/or benchmark to prove that).
Note to others: feel free to revert this changeset if my assumption proves wrong ;-) --HG-- extra : convert_revision : svn%3Aacbfec75-9323-0410-a652-858a13e371e0/trunk%40631
1 parent 5df4d2d commit d25f3c6

File tree

3 files change 8000 d

+29
-29
lines changed

3 files changed

+29
-29
lines changed

src/treebuilders/__init__.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,7 @@
3333
import os.path
3434
__path__.append(os.path.dirname(__path__[0]))
3535

36-
import dom
37-
import simpletree
38-
import etree
39-
try:
40-
import soup as beautifulsoup
41-
except:
42-
pass
43-
36+
treeBuilderCache = {}
4437

4538
def getTreeBuilder(treeType, implementation=None, **kwargs):
4639
"""Get a TreeBuilder class for various types of tree with built-in support
@@ -60,8 +53,15 @@ def getTreeBuilder(treeType, implementation=None, **kwargs):
6053
implementing the tree type e.g. xml.etree.ElementTree or
6154
lxml.etree."""
6255

63-
treeType = treeType.lower()
64-
if treeType in ("dom", "simpletree", "beautifulsoup"):
65-
return globals()[treeType].TreeBuilder
66-
elif treeType == "etree":
67-
return etree.getETreeModule(implementation, **kwargs).TreeBuilder
56+
treeType = treeType.lower()
57+
if treeType not in treeBuilderCache:
58+
if treeType in ("dom", "simpletree"):
59+
mod = __import__(treeType, globals())
60+
treeBuilderCache[treeType] = mod.TreeBuilder
61+
elif treeType == "beautifulsoup":
62+
import soup
63+
treeBuilderCache[treeType] = soup.TreeBuilder
64+
elif treeType == "etree":
65+
import etree
66+
treeBuilderCache[treeType] = etree.getETreeModule(implementation, **kwargs).TreeBuilder
67+
return treeBuilderCache.get(treeType)

src/treewalkers/__init__.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,7 @@
1111
import os.path
1212
__path__.append(os.path.dirname(__path__[0]))
1313

14-
import dom
15-
import simpletree
16-
import etree
17-
import pulldom
18-
try:
19-
import soup as beautifulsoup
20-
except:
21-
pass
22-
14+
treeWalkerCache = {}
2315

2416
def getTreeWalker(treeType, implementation=None, **kwargs):
2517
"""Get a TreeWalker class for various types of tree with built-in support
@@ -41,7 +33,14 @@ def getTreeWalker(treeType, implementation=None, **kwargs):
4133
lxml.etree."""
4234

4335
treeType = treeType.lower()
44-
if treeType in ("dom", "pulldom", "simpletree", "beautifulsoup"):
45-
return globals()[treeType].TreeWalker
46-
elif treeType == "etree":
47-
return etree.getETreeModule(implementation, **kwargs).TreeWalker
36+
if treeType not in treeWalkerCache:
37+
if treeType in ("dom", "pulldom", "simpletree"):
38+
mod = __import__(treeType, globals())
39+
treeWalkerCache[treeType] = mod.TreeWalker
40+
elif treeType == "beautifulsoup":
41+
import soup
42+
treeWalkerCache[treeType] = soup.TreeWalker
43+
elif treeType == "etree":
44+
import etree
45+
treeWalkerCache[treeType] = etree.getETreeModule(implementation, **kwargs).TreeWalker
46+
return treeWalkerCache.get(treeType)

tests/test_serializer.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,19 @@ def load(f):
2323

2424
import html5parser
2525
import serializer
26-
import treewalkers
26+
from treewalkers._base import TreeWalker
2727
#END RELEASE
2828

2929
#RELEASE add
3030
#import html5lib
31-
#from html5lib import html5parser, serializer, treewalkers
31+
#from html5lib import html5parser, serializer
32+
#from html5lib.treewalkers._base import TreeWalker
3233
#END RELEASE
3334

3435
#Run the serialize error checks
3536
checkSerializeErrors = False
3637

37-
class TestCase(unittest.TestCase, treewalkers._base.TreeWalker):
38+
class TestCase(unittest.TestCase, TreeWalker):
3839
def addTest(cls, name, expected, input, description, options):
3940
func = lambda self: self.mockTest(expected, input, options)
4041
func.__doc__ = "\t".join([description, str(input), str(options)])

0 commit comments

Comments
 (0)
0