10

I'm having trouble getting the if __name == '__main__' trick to work in an IPython, Spyder environment. I've tried every approach given in this thread: if __name__ == '__main__' in IPython

Here are my super simplified modules

Module1.py

Class UnitTest():
    print 'Mod1 UnitTest!'

if __name__ == '__main__':
    UnitTest()

Module2.py

import Module1

Class UnitTest():
    print 'Mod2 UnitTest!'

if __name__ == '__main__':
    UnitTest()

So I run Module2.py and I always am seeing both Mod2 UnitTest and Mod1 UnitTest printed. These are executing in an IPython kernel. I want only the Mod2 UnitTest message to display.

Any idea what's up?

Community
  • 1
  • 1
AZhao
  • 13,617
  • 7
  • 31
  • 54
  • 4
    You are using classes instead of functions. Code in a class declaration is run at import time. – Kevin Jun 29 '15 at 18:40
  • Yup. See my answer below. Totally foolish mistake not realizing the code in class declaration is run at import time!!! – AZhao Jun 29 '15 at 18:44

1 Answers1

6

Well I deleted this question earlier out of embarrassment but might as well share in case any other newb sees this.

I forgot to put the UnitTest line inside of the __init__ method. So the unit test was being run every single time when the class was defined and not when the object was instantiated. The code should be:

Module1.py

Class UnitTest():
    def __init__(self):
        print 'Mod1 UnitTest!'

if __name__ == '__main__':
    UnitTest()

Module2.py

import Module1

Class UnitTest():
    def __init__(self):
        print 'Mod1 UnitTest!'

if __name__ == '__main__':
    print 'Mod2 UnitTest!'
Chandler
  • 47
  • 7
AZhao
  • 13,617
  • 7
  • 31
  • 54