unit test nested functions

Raymond Hettinger python at rcn.com
Sat Jul 23 18:59:12 CEST 2005


> > [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




More information about the Python-list mailing list