"Terry Hancock" <[EMAIL PROTECTED]> wrote:

> On Monday 12 September 2005 10:09 pm, [EMAIL PROTECTED] wrote:
> > I like to keep my classes each in a separate file with the same name of
> > the class. The problem with that is that I end up with multiple imports
> > in the beginning of each file, like this:
> >
> > from foo.Bar import Bar
> > from foo.Blah import Blah
> > from foo.Zzz import Zzz
> >
> > What I'd like to do would be to replace it all by a single line:
> >
> > from foo.* import *
> >
> > Of course, that doesn't work, but is there a way to do something like
> > that?
>
> Apparently "foo" is already a package defined using __init__.py,
> so you know about that part already.
>
> Just change its contents to read:
>
> from Bar import Bar
> from Blah import Blah
> from Zzz import Zzz

If you do this often or have lots of classes you want to import this
way, you could automate it:

#======== Foo.py ====================================
class Foo(object):
    pass

#======== Bar.py ====================================
class Bar(object):
    pass

#======== test.py ====================================
from autoimport import autoimport
autoimport("Foo","Bar")

if __name__ == '__main__':
    print Foo
    print Bar

# output:
# <class 'Foo.Foo'>
# <class 'Bar.Bar>

#======== autoimport.py ====================================
import sys

def autoimport(*modulenames):
    '''
    Perform the equivalent of "from XXX import XXX" for every
    module XXX in modulenames. In case of packaged modules, it is
    equivalent to "from XXX.YYY.ZZZ import ZZZ"
    '''
    caller_frame = sys._getframe(1)
    caller_locals = caller_frame.f_locals
    # import every module XXX and add the XXX.XXX object
    # to the caller's locals
    for name in modulenames:
        # in case of packaged modules A.B.C, make sure to import C
        module = __import__(name, caller_frame.f_globals,
                            caller_locals, [name])
        # extract 'C' from 'A.B.C'
        attribute = name[name.rfind('.')+1:]
        if hasattr(module,attribute):
            caller_locals[attribute] = getattr(module,attribute)

#==================================================

Or even better, forget about the braindead java restriction of one
class per file and organize your code as it makes more sense to you.

HTH,
George

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to