Statistics
| Branch: | Tag: | Revision:

root / lib / outils.py @ 91c17910

History | View | Annotate | Download (2.5 kB)

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

27 32683096 René Nussbaumer
  """
28 32683096 René Nussbaumer
  def __new__(mcs, name, bases, attrs):
29 32683096 René Nussbaumer
    """Called when a class should be created.
30 32683096 René Nussbaumer

31 32683096 René Nussbaumer
    @param mcs: The meta class
32 32683096 René Nussbaumer
    @param name: Name of created class
33 32683096 René Nussbaumer
    @param bases: Base classes
34 32683096 René Nussbaumer
    @type attrs: dict
35 32683096 René Nussbaumer
    @param attrs: Class attributes
36 32683096 René Nussbaumer

37 32683096 René Nussbaumer
    """
38 32683096 René Nussbaumer
    assert "__slots__" not in attrs, \
39 32683096 René Nussbaumer
      "Class '%s' defines __slots__ when it should not" % name
40 32683096 René Nussbaumer
41 32683096 René Nussbaumer
    attrs["__slots__"] = mcs._GetSlots(attrs)
42 32683096 René Nussbaumer
43 32683096 René Nussbaumer
    return type.__new__(mcs, name, bases, attrs)
44 32683096 René Nussbaumer
45 32683096 René Nussbaumer
  @classmethod
46 32683096 René Nussbaumer
  def _GetSlots(mcs, attrs):
47 32683096 René Nussbaumer
    """Used to get the list of defined slots.
48 32683096 René Nussbaumer

49 32683096 René Nussbaumer
    @param attrs: The attributes of the class
50 32683096 René Nussbaumer

51 32683096 René Nussbaumer
    """
52 32683096 René Nussbaumer
    raise NotImplementedError
53 32683096 René Nussbaumer
54 32683096 René Nussbaumer
55 32683096 René Nussbaumer
class ValidatedSlots(object):
56 32683096 René Nussbaumer
  """Sets and validates slots.
57 32683096 René Nussbaumer

58 32683096 René Nussbaumer
  """
59 32683096 René Nussbaumer
  __slots__ = []
60 32683096 René Nussbaumer
61 32683096 René Nussbaumer
  def __init__(self, **kwargs):
62 32683096 René Nussbaumer
    """Constructor for BaseOpCode.
63 32683096 René Nussbaumer

64 32683096 René Nussbaumer
    The constructor takes only keyword arguments and will set
65 32683096 René Nussbaumer
    attributes on this object based on the passed arguments. As such,
66 32683096 René Nussbaumer
    it means that you should not pass arguments which are not in the
67 32683096 René Nussbaumer
    __slots__ attribute for this class.
68 32683096 René Nussbaumer

69 32683096 René Nussbaumer
    """
70 32683096 René Nussbaumer
    slots = self.GetAllSlots()
71 32683096 René Nussbaumer
    for (key, value) in kwargs.items():
72 32683096 René Nussbaumer
      if key not in slots:
73 32683096 René Nussbaumer
        raise TypeError("Object %s doesn't support the parameter '%s'" %
74 32683096 René Nussbaumer
                        (self.__class__.__name__, key))
75 32683096 René Nussbaumer
      setattr(self, key, value)
76 32683096 René Nussbaumer
77 32683096 René Nussbaumer
  @classmethod
78 32683096 René Nussbaumer
  def GetAllSlots(cls):
79 32683096 René Nussbaumer
    """Compute the list of all declared slots for a class.
80 32683096 René Nussbaumer

81 32683096 René Nussbaumer
    """
82 32683096 René Nussbaumer
    slots = []
83 32683096 René Nussbaumer
    for parent in cls.__mro__:
84 32683096 René Nussbaumer
      slots.extend(getattr(parent, "__slots__", []))
85 32683096 René Nussbaumer
    return slots
86 32683096 René Nussbaumer
87 32683096 René Nussbaumer
  def Validate(self):
88 32683096 René Nussbaumer
    """Validates the slots.
89 32683096 René Nussbaumer

90 32683096 René Nussbaumer
    This method must be implemented by the child classes.
91 32683096 René Nussbaumer

92 32683096 René Nussbaumer
    """
93 32683096 René Nussbaumer
    raise NotImplementedError