Welcome, guest | Sign In | My Account | Store | Cart
import types

def freeVar(val):
  def nested():
    return val
  return nested.__closure__[0]

codeAttribute = '__code__' if sys.version_info[0] == 3 else 'func_code'

def nested(outer, innerName, **freeVars):
  if isinstance(outer, (types.FunctionType, types.MethodType)):
    outer = outer.__getattribute__(codeAttribute)
  for const in outer.co_consts:
    if isinstance(const, types.CodeType) and const.co_name == innerName:
      return types.FunctionType(const, globals(), None, None, tuple(
          freeVar(freeVars[name]) for name in const.co_freevars))

Diff to Previous Revision

--- revision 2 2016-11-10 10:15:52
+++ revision 3 2016-11-10 10:23:11
@@ -5,9 +5,11 @@
     return val
   return nested.__closure__[0]
 
+codeAttribute = '__code__' if sys.version_info[0] == 3 else 'func_code'
+
 def nested(outer, innerName, **freeVars):
   if isinstance(outer, (types.FunctionType, types.MethodType)):
-    outer = outer.func_code
+    outer = outer.__getattribute__(codeAttribute)
   for const in outer.co_consts:
     if isinstance(const, types.CodeType) and const.co_name == innerName:
       return types.FunctionType(const, globals(), None, None, tuple(

History