1 |
commit: 7830c41f7b9838d1c204837b50448cded7a3087b |
2 |
Author: André Erdmann <dywi <AT> mailerd <DOT> de> |
3 |
AuthorDate: Fri Aug 30 12:37:34 2013 +0000 |
4 |
Commit: André Erdmann <dywi <AT> mailerd <DOT> de> |
5 |
CommitDate: Fri Aug 30 12:37:34 2013 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=7830c41f |
7 |
|
8 |
roverlay/util/objects: more meaningful error messages |
9 |
|
10 |
include parameter list in MethodNotImplementedError/AbstractMethodError (if |
11 |
given). |
12 |
|
13 |
--- |
14 |
roverlay/util/objects.py | 94 ++++++++++++++++++++++++++++++++++++++++-------- |
15 |
1 file changed, 79 insertions(+), 15 deletions(-) |
16 |
|
17 |
diff --git a/roverlay/util/objects.py b/roverlay/util/objects.py |
18 |
index 2bcb7e4..95e63f0 100644 |
19 |
--- a/roverlay/util/objects.py |
20 |
+++ b/roverlay/util/objects.py |
21 |
@@ -109,7 +109,48 @@ def get_object_ref ( obj ): |
22 |
|
23 |
|
24 |
class MethodNotImplementedError ( NotImplementedError ): |
25 |
- def __init__ ( self, obj, method, msg=None ): |
26 |
+ |
27 |
+ def __init__ ( self, obj, method, msg=None, params=None ): |
28 |
+ """Constructor for MethodNotImplementedError. |
29 |
+ |
30 |
+ arguments: |
31 |
+ * obj -- object/class to which the method is bound |
32 |
+ * method -- method that is not implemented |
33 |
+ * msg -- additional information (if set) |
34 |
+ * params -- an iterable of parameters (args/kwargs) that the method |
35 |
+ accepts (used for generating more meaningful messages) |
36 |
+ """ |
37 |
+ super ( MethodNotImplementedError, self ).__init__ ( |
38 |
+ self._get_error_message ( obj, method, msg, params ) |
39 |
+ ) |
40 |
+ # --- end of __init__ (...) --- |
41 |
+ |
42 |
+ # or staticmethod, unbound, ... |
43 |
+ @classmethod |
44 |
+ def _compare_arg_count ( self, params, method ): |
45 |
+ if ( |
46 |
+ hasattr ( method, '__code__' ) and |
47 |
+ hasattr ( method.__code__, 'co_argcount' ) |
48 |
+ ): |
49 |
+ plen = len ( params ) |
50 |
+ if ( |
51 |
+ plen != method.__code__.co_argcount and ( |
52 |
+ params[0] in { 'self', 'cls' } or |
53 |
+ ( plen + 1 ) != method.__code__.co_argcount |
54 |
+ ) |
55 |
+ ): |
56 |
+ raise AssertionError ( |
57 |
+ "params, arg count mismatch: {:d} != {:d}".format ( |
58 |
+ len ( params ), method.__code__.co_argcount |
59 |
+ ) |
60 |
+ ) |
61 |
+ del plen |
62 |
+ # -- end if __debug__ |
63 |
+ # --- end of _compare_arg_count (...) --- |
64 |
+ |
65 |
+ @classmethod |
66 |
+ def _get_error_message ( cls, obj, method, msg=None, params=None ): |
67 |
+ # obj_name = |
68 |
if isinstance ( obj, str ): |
69 |
obj_name = obj |
70 |
elif hasattr ( obj, '__class__' ): |
71 |
@@ -119,6 +160,7 @@ class MethodNotImplementedError ( NotImplementedError ): |
72 |
else: |
73 |
obj_name = repr ( obj ) |
74 |
|
75 |
+ # method_name = |
76 |
if isinstance ( method, str ): |
77 |
method_name = method |
78 |
elif hasattr ( method, '__name__' ): |
79 |
@@ -126,15 +168,23 @@ class MethodNotImplementedError ( NotImplementedError ): |
80 |
else: |
81 |
method_name = repr ( method ) |
82 |
|
83 |
- method_str = "{}.{}()".format ( obj_name, method_name ) |
84 |
+ # method str = |
85 |
+ if params: |
86 |
+ if __debug__: |
87 |
+ cls._compare_arg_count ( params, method ) |
88 |
|
89 |
- if msg: |
90 |
- super ( MethodNotImplementedError, self ).__init__ ( |
91 |
- method_str + ': ' + str ( msg ) |
92 |
+ method_str = "{}.{} ( {} )".format ( |
93 |
+ obj_name, method_name, ', '.join ( params ) |
94 |
) |
95 |
else: |
96 |
- super ( MethodNotImplementedError, self ).__init__ ( method_str ) |
97 |
- # --- end of __init__ (...) --- |
98 |
+ method_str = "{}.{}()".format ( obj_name, method_name ) |
99 |
+ |
100 |
+ # method_str += |
101 |
+ if msg: |
102 |
+ return method_str + ': ' + str ( msg ) |
103 |
+ else: |
104 |
+ return method_str |
105 |
+ # --- end of _get_error_message (...) --- |
106 |
|
107 |
# --- end of MethodNotImplementedError --- |
108 |
|
109 |
@@ -144,14 +194,15 @@ class MethodNotImplemented ( MethodNotImplementedError ): |
110 |
# --- end of MethodNotImplemented --- |
111 |
|
112 |
class AbstractMethodError ( MethodNotImplementedError ): |
113 |
- def __init__ ( self, obj, method ): |
114 |
+ def __init__ ( self, obj, method, params=None ): |
115 |
super ( AbstractMethodError, self ).__init__ ( |
116 |
- obj, method, "has to be implemented by derived classes" |
117 |
+ obj, method, "has to be implemented by derived classes", |
118 |
+ params=params, |
119 |
) |
120 |
|
121 |
# --- end of AbstractMethodError --- |
122 |
|
123 |
-def _get_exception_wrapper ( err_cls, func ): |
124 |
+def _create_exception_wrapper ( err_cls, func, err_args=(), err_kwargs={} ): |
125 |
"""Returns a method that raises the given exception when called. |
126 |
|
127 |
arguments: |
128 |
@@ -162,7 +213,7 @@ def _get_exception_wrapper ( err_cls, func ): |
129 |
* func -- function to be wrapped |
130 |
""" |
131 |
def wrapped ( obj, *args, **kwargs ): |
132 |
- raise err_cls ( obj, func ) |
133 |
+ raise err_cls ( obj, func, *err_args, **err_kwargs ) |
134 |
# --- end of wrapped (...) --- |
135 |
|
136 |
if func is not None: |
137 |
@@ -170,14 +221,27 @@ def _get_exception_wrapper ( err_cls, func ): |
138 |
wrapped.__doc__ = func.__doc__ |
139 |
wrapped.__dict__.update ( func.__dict__ ) |
140 |
return wrapped |
141 |
+# --- end of _create_exception_wrapper (...) --- |
142 |
+ |
143 |
+def _get_exception_wrapper ( err_cls, func=None, err_args=(), err_kwargs={} ): |
144 |
+ if func is None: |
145 |
+ return lambda real_func: _create_exception_wrapper ( |
146 |
+ err_cls, real_func, err_args, err_kwargs |
147 |
+ ) |
148 |
+ else: |
149 |
+ return _create_exception_wrapper ( err_cls, func, err_args, err_kwargs ) |
150 |
# --- end of _get_exception_wrapper (...) --- |
151 |
|
152 |
-def abstractmethod ( func=None ): |
153 |
- return _get_exception_wrapper ( AbstractMethodError, func ) |
154 |
+def abstractmethod ( func=None, **kwargs ): |
155 |
+ return _get_exception_wrapper ( |
156 |
+ AbstractMethodError, func, err_kwargs=kwargs |
157 |
+ ) |
158 |
# --- end of abstractmethod (...) --- |
159 |
|
160 |
-def not_implemented ( func=None ): |
161 |
- return _get_exception_wrapper ( MethodNotImplementedError, func ) |
162 |
+def not_implemented ( func=None, **kwargs ): |
163 |
+ return _get_exception_wrapper ( |
164 |
+ MethodNotImplementedError, func, err_kwargs=kwargs |
165 |
+ ) |
166 |
# --- end of not_implemented (...) --- |