I don't generally define things in __init__.py, but there are reasons why you might do so. If you really want to initialize a number of things and make them broadly available "automatically," it's handy. Some codebases (django) do this a lot. So the takeaway, I think, should be "don't define anything in __init__.py unless you have a specific reason for doing that."
-- John Goodleaf On Wednesday, August 29, 2012 at 11:33 AM, Leo Shklovskii wrote: > Thanks for the responses, here's the one that makes the most sense to me: > > "the globals in a module are equivalent to that module's attributes. The > globals > of foo/__init__.py correspond to the attributes of the "foo" package. > Importing > foo.cars causes the import machinery to assign the imported module object to > foo.cars." > > The real issue that we hit is that if you defined 'cars' in foo/__init.py__, > the > line 'from foo.cars import blah' would clobber whatever you defined there. > The > takeaway is don't define anything in __init__.py :-/ > > -- > --Leo > > John Goodleaf wrote: > > Okay, that was vague. Think of __init__.py as the package initializer. > > When you call the package, or any module resident therein, the > > initializer runs. So basically, any time you call something in the foo > > namespace, the things in __init__.py are available to the caller. > > > > -- > > John Goodleaf > > > > On Wednesday, August 29, 2012 at 11:20 AM, John Goodleaf wrote: > > > > > The __init__.py file marks the contents of the directory as a package. > > > Its code is executed when you reference the package. > > > > > > -- > > > John Goodleaf > > > > > > On Wednesday, August 29, 2012 at 11:17 AM, Leo Shklovskii wrote: > > > > > > > Here's a fun question for the python lovers in the crowd. We ran into > > > > some > > > > unexpected behavior in our code and don't have a good explanation for > > > > why it > > > > happens. > > > > > > > > We've reduced it down to a super simple test case with three files: > > > > > > > > test.py > > > > -------- > > > > import foo > > > > try: > > > > foo.print_stuff() > > > > except NameError: > > > > print 'expected NameError' > > > > import foo.cars > > > > foo.print_stuff() # why no NameError? > > > > > > > > foo/__init__.py > > > > --------- > > > > def print_stuff(): > > > > print cars.__file__ > > > > > > > > foo/cars.py > > > > --------- > > > > def honk(): > > > > pass > > > > > > > > Why doesn't the second call to print_stuff() raise a NameError? Why does > > > > importing something in test.py add it to the foo module's namespace? > > > > > > > > -- > > > > --Leo > > > > > > > > > > > > > > > > >
