def injectClassCallback(annotationName, depth, methodName, *args, **kwargs): """ Inject an annotation for a class method to be called after class initialization without dealing with metaclass. depth parameter specify the stack depth from the class definition. """ locals = reflect.class_locals(depth, annotationName) annotations = locals.get(_CLASS_ANNOTATIONS_ATTR, None) if annotations is None: annotations = list() locals[_CLASS_ANNOTATIONS_ATTR] = annotations annotation = (annotationName, methodName, args, kwargs) annotations.append(annotation)
def injectAttribute(annotationName, depth, attr, value): """ Inject an attribute in a class from it's class frame. Use in class annnotation to create methods/properties dynamically at class creation time without dealing with metaclass. depth parameter specify the stack depth from the class definition. """ locals = reflect.class_locals(depth, annotationName) injections = locals.get(_ATTRIBUTE_INJECTIONS_ATTR, None) if injections is None: injections = list() locals[_ATTRIBUTE_INJECTIONS_ATTR] = injections injections.append((attr, value))
def test_depth2(depth=2): return reflect.class_locals(depth)