1#!/usr/bin/env python
2# Copyright (c) 2012 The Chromium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6'''In GRIT, we used to compile a lot of regular expressions at parse
7time.  Since many of them never get used, we use lazy_re to compile
8them on demand the first time they are used, thus speeding up startup
9time in some cases.
10'''
11
12import re
13
14
15class LazyRegexObject(object):
16  '''This object creates a RegexObject with the arguments passed in
17  its constructor, the first time any attribute except the several on
18  the class itself is accessed.  This accomplishes lazy compilation of
19  the regular expression while maintaining a nearly-identical
20  interface.
21  '''
22
23  def __init__(self, *args, **kwargs):
24    self._stash_args = args
25    self._stash_kwargs = kwargs
26    self._lazy_re = None
27
28  def _LazyInit(self):
29    if not self._lazy_re:
30      self._lazy_re = re.compile(*self._stash_args, **self._stash_kwargs)
31
32  def __getattribute__(self, name):
33    if name in ('_LazyInit', '_lazy_re', '_stash_args', '_stash_kwargs'):
34      return object.__getattribute__(self, name)
35    else:
36      self._LazyInit()
37      return getattr(self._lazy_re, name)
38
39
40def compile(*args, **kwargs):
41  '''Creates a LazyRegexObject that, when invoked on, will compile a
42  re.RegexObject (via re.compile) with the same arguments passed to
43  this function, and delegate almost all of its methods to it.
44  '''
45  return LazyRegexObject(*args, **kwargs)
46