Fix Filehandler / FileHandler typo
[ganeti-local] / lib / compat.py
1 #
2 #
3
4 # Copyright (C) 2010 Google Inc.
5 #
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 # General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 # 02110-1301, USA.
20
21
22 """Module containing backported language/library functionality.
23
24 """
25
26 import itertools
27
28 try:
29   import functools
30 except ImportError:
31   functools = None
32
33
34 def all(seq, pred=bool): # pylint: disable-msg=W0622
35   """Returns True if pred(x) is True for every element in the iterable.
36
37   Please note that this function provides a C{pred} parameter which isn't
38   available in the version included in Python 2.5 and above.
39
40   """
41   for _ in itertools.ifilterfalse(pred, seq):
42     return False
43   return True
44
45
46 def any(seq, pred=bool): # pylint: disable-msg=W0622
47   """Returns True if pred(x) is True for at least one element in the iterable.
48
49   Please note that this function provides a C{pred} parameter which isn't
50   available in the version included in Python 2.5 and above.
51
52   """
53   for _ in itertools.ifilter(pred, seq):
54     return True
55   return False
56
57
58 def partition(seq, pred=bool): # pylint: disable-msg=W0622
59   """Partition a list in two, based on the given predicate.
60
61   """
62   return (list(itertools.ifilter(pred, seq)),
63           list(itertools.ifilterfalse(pred, seq)))
64
65
66 # Even though we're using Python's built-in "partial" function if available,
67 # this one is always defined for testing.
68 def _partial(func, *args, **keywords): # pylint: disable-msg=W0622
69   """Decorator with partial application of arguments and keywords.
70
71   This function was copied from Python's documentation.
72
73   """
74   def newfunc(*fargs, **fkeywords):
75     newkeywords = keywords.copy()
76     newkeywords.update(fkeywords)
77     return func(*(args + fargs), **newkeywords) # pylint: disable-msg=W0142
78
79   newfunc.func = func
80   newfunc.args = args
81   newfunc.keywords = keywords
82   return newfunc
83
84
85 if functools is None:
86   partial = _partial
87 else:
88   partial = functools.partial