root / lib / outils.py @ 8cb5634a
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 |