> > [Andy] > >>How can you unit test nested functions? [Raymond Hettinger] > > For whitebox testing, you could make an inner function visible by > > binding it to the enclosing function's attribute namespace. > > > > def f(x): > > def g(y): > > . . . > > f.g = g # make g visible as an attribute of f > > . . .
[Benji York] > Note that when using this technique, f.g will not be bound until after > you call the function: That is a feature, not a bug. The inner function isn't even created until the outer function is run. >>> def f(x): z = 30 def g(y): return 10 return 20 >>> from dis import dis >>> dis(f) 2 0 LOAD_CONST 1 (30) 3 STORE_FAST 1 (z) 3 6 LOAD_CONST 2 (<code object g at 00A33660, file "<pyshell#37>", line 3>) 9 MAKE_FUNCTION 0 12 STORE_FAST 2 (g) 5 15 LOAD_CONST 3 (20) 18 RETURN_VALUE The MAKE_FUNCTION step is where g comes into existence. That is a run-time operation, not compile time. If you are willing to be tricky, it is possible to write an accessor function that goes into f.func_code.co_consts, finds the code object whose co_name attribute is 'g', builds a wrapper function using types.FunctionType, and returns the result for unittesting. But that is not for the faint of heart ;-) Raymond -- http://mail.python.org/mailman/listinfo/python-list