How can I access variables set in the Python nosetests setup function

As the comments to your question already suggested, simply switch to classes and use instance variables like self.foo. That's the way it should be done.

If you insist on not using classes, try global variables. You didn't hear this from me, though.

from nose.tools import *

foo = None

def setup():
    global foo  # Ugly.
    foo = 10

def teardown():
    global foo  # Ugly.
    foo = None

@with_setup(setup, teardown)
def test_foo_value():
    assert_equal(foo, 10)

A third variant might be to use a dictionary for your values. This is slightly less ugly but horribly clumsy:

from nose.tools import *

_globals = {'foo': None}

def setup():
    _globals['foo'] = 10

def teardown():
    _globals['foo'] = None

@with_setup(setup, teardown)
def test_foo_value():
    foo = _globals['foo']
    assert_equal(foo, 10)

I use a custom with_setup decorator that uses the poor man's nonlocal: https://gist.github.com/garyvdm/392ae20c673c7ee58d76

def setup():
    foo = 10
    return [foo], {}

def teardown(foo):
    pass

@with_setup_args(setup, teardown)
def test_foo_value(foo):
    nose.tools.assert_equal(foo, 10)

For projects that are Python 3 only, I use nonlocal rather than .extend/.update for arguments, kwargs.

Tags:

Python

Nose