[Checkins] SVN: grok/trunk/src/grok/_grok.py refactored frame access

Philipp von Weitershausen philikon at philikon.de
Sun Oct 15 09:27:39 EDT 2006


Log message for revision 70645:
  refactored frame access

Changed:
  U   grok/trunk/src/grok/_grok.py

-=-
Modified: grok/trunk/src/grok/_grok.py
===================================================================
--- grok/trunk/src/grok/_grok.py	2006-10-15 13:16:36 UTC (rev 70644)
+++ grok/trunk/src/grok/_grok.py	2006-10-15 13:27:39 UTC (rev 70645)
@@ -100,30 +100,31 @@
                         "grok.context." % factory)
     return context
 
+def caller_is_module():
+    frame = sys._getframe(2)
+    return frame.f_locals is frame.f_globals
+
+def caller_is_class():
+    frame = sys._getframe(2)
+    return '__module__' in frame.f_locals
+
+def set_local(name, value, error_message):
+    frame = sys._getframe(2)
+    name = '__grok_%s__' % name
+    if name in frame.f_locals:
+        raise GrokError(error_message)
+    frame.f_locals[name] = value
+    
 def context(obj):
     if not (IInterface.providedBy(obj) or isclass(obj)):
         raise GrokError("You can only pass classes or interfaces to "
                         "grok.context.")
-
-    frame = sys._getframe(1)
-
-    is_module = frame.f_locals is frame.f_globals
-    is_class = '__module__' in frame.f_locals
-    if not (is_module or is_class):
+    if not (caller_is_module() or caller_is_class()):
         raise GrokError("grok.context can only be used on class or module level.")
+    set_local('context', obj, "grok.context can only be called once per class "
+              "or module.")
 
-    if '__grok_context__' in frame.f_locals:
-        raise GrokError("grok.context can only be called once per class "
-                        "or module.")
-    frame.f_locals['__grok_context__'] = obj
-
 def name(name):
-    frame = sys._getframe(1)
-    is_class = '__module__' in frame.f_locals
-    if not is_class:
+    if not caller_is_class():
         raise GrokError("grok.name can only be used on class level.")
-
-    if '__grok_name__' in frame.f_locals:
-        raise GrokError("grok.name can only be called once per class.")
-
-    frame.f_locals['__grok_name__'] = name
+    set_local('name', name, "grok.name can only be called once per class.")



More information about the Checkins mailing list