Statistics
| Branch: | Tag: | Revision:

root / lib / compat.py @ bfc2002f

History | View | Annotate | Download (2.4 kB)

1 cea881e5 Michael Hanselmann
#
2 cea881e5 Michael Hanselmann
#
3 cea881e5 Michael Hanselmann
4 cea881e5 Michael Hanselmann
# Copyright (C) 2010 Google Inc.
5 cea881e5 Michael Hanselmann
#
6 cea881e5 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 cea881e5 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 cea881e5 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 cea881e5 Michael Hanselmann
# (at your option) any later version.
10 cea881e5 Michael Hanselmann
#
11 cea881e5 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 cea881e5 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 cea881e5 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 cea881e5 Michael Hanselmann
# General Public License for more details.
15 cea881e5 Michael Hanselmann
#
16 cea881e5 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 cea881e5 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 cea881e5 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 cea881e5 Michael Hanselmann
# 02110-1301, USA.
20 cea881e5 Michael Hanselmann
21 cea881e5 Michael Hanselmann
22 cea881e5 Michael Hanselmann
"""Module containing backported language/library functionality.
23 cea881e5 Michael Hanselmann

24 cea881e5 Michael Hanselmann
"""
25 cea881e5 Michael Hanselmann
26 cea881e5 Michael Hanselmann
import itertools
27 cea881e5 Michael Hanselmann
28 cea881e5 Michael Hanselmann
try:
29 cea881e5 Michael Hanselmann
  import functools
30 cea881e5 Michael Hanselmann
except ImportError:
31 cea881e5 Michael Hanselmann
  functools = None
32 cea881e5 Michael Hanselmann
33 cea881e5 Michael Hanselmann
34 cea881e5 Michael Hanselmann
def all(seq, pred=bool): # pylint: disable-msg=W0622
35 cea881e5 Michael Hanselmann
  """Returns True if pred(x) is True for every element in the iterable.
36 cea881e5 Michael Hanselmann

37 cea881e5 Michael Hanselmann
  Please note that this function provides a C{pred} parameter which isn't
38 cea881e5 Michael Hanselmann
  available in the version included in Python 2.5 and above.
39 cea881e5 Michael Hanselmann

40 cea881e5 Michael Hanselmann
  """
41 cea881e5 Michael Hanselmann
  for _ in itertools.ifilterfalse(pred, seq):
42 cea881e5 Michael Hanselmann
    return False
43 cea881e5 Michael Hanselmann
  return True
44 cea881e5 Michael Hanselmann
45 cea881e5 Michael Hanselmann
46 cea881e5 Michael Hanselmann
def any(seq, pred=bool): # pylint: disable-msg=W0622
47 cea881e5 Michael Hanselmann
  """Returns True if pred(x) is True for at least one element in the iterable.
48 cea881e5 Michael Hanselmann

49 cea881e5 Michael Hanselmann
  Please note that this function provides a C{pred} parameter which isn't
50 cea881e5 Michael Hanselmann
  available in the version included in Python 2.5 and above.
51 cea881e5 Michael Hanselmann

52 cea881e5 Michael Hanselmann
  """
53 cea881e5 Michael Hanselmann
  for _ in itertools.ifilter(pred, seq):
54 cea881e5 Michael Hanselmann
    return True
55 cea881e5 Michael Hanselmann
  return False
56 cea881e5 Michael Hanselmann
57 cea881e5 Michael Hanselmann
58 cea881e5 Michael Hanselmann
def partition(seq, pred=bool): # pylint: disable-msg=W0622
59 cea881e5 Michael Hanselmann
  """Partition a list in two, based on the given predicate.
60 cea881e5 Michael Hanselmann

61 cea881e5 Michael Hanselmann
  """
62 cea881e5 Michael Hanselmann
  return (list(itertools.ifilter(pred, seq)),
63 cea881e5 Michael Hanselmann
          list(itertools.ifilterfalse(pred, seq)))
64 cea881e5 Michael Hanselmann
65 cea881e5 Michael Hanselmann
66 cea881e5 Michael Hanselmann
# Even though we're using Python's built-in "partial" function if available,
67 cea881e5 Michael Hanselmann
# this one is always defined for testing.
68 cea881e5 Michael Hanselmann
def _partial(func, *args, **keywords): # pylint: disable-msg=W0622
69 cea881e5 Michael Hanselmann
  """Decorator with partial application of arguments and keywords.
70 cea881e5 Michael Hanselmann

71 cea881e5 Michael Hanselmann
  This function was copied from Python's documentation.
72 cea881e5 Michael Hanselmann

73 cea881e5 Michael Hanselmann
  """
74 cea881e5 Michael Hanselmann
  def newfunc(*fargs, **fkeywords):
75 cea881e5 Michael Hanselmann
    newkeywords = keywords.copy()
76 cea881e5 Michael Hanselmann
    newkeywords.update(fkeywords)
77 cea881e5 Michael Hanselmann
    return func(*(args + fargs), **newkeywords) # pylint: disable-msg=W0142
78 cea881e5 Michael Hanselmann
79 cea881e5 Michael Hanselmann
  newfunc.func = func
80 cea881e5 Michael Hanselmann
  newfunc.args = args
81 cea881e5 Michael Hanselmann
  newfunc.keywords = keywords
82 cea881e5 Michael Hanselmann
  return newfunc
83 cea881e5 Michael Hanselmann
84 cea881e5 Michael Hanselmann
85 cea881e5 Michael Hanselmann
if functools is None:
86 cea881e5 Michael Hanselmann
  partial = _partial
87 cea881e5 Michael Hanselmann
else:
88 cea881e5 Michael Hanselmann
  partial = functools.partial