[Python-Dev] Re: [Python-checkins] CVS: python/dist/src/Misc NEWS,1.108,1.109

Guido van Rossum guido@digicool.com
Tue, 30 Jan 2001 15:42:58 -0500


> > > Woah. Is this really a good idea ? I have seen 'from ... import *'
> > > in a function scope put to good (relatively -- we're talking 'import
> > > *' here) use. I also thought of 'import' as yet another assignment
> > > statement, so to me it's both logical and consistent if 'import'
> > > would listen to 'global'.  Otherwise we have to re-invent 'import
> > > spam; eggs = spam' if we want eggs to be global.
> 
> > Note that Jeremy is only raising errors for "from M import *".
> 
> No, he says he's also raising errors for 'import spam' if 'spam' is declared
> global, like so:
> 
> def viking():
>     global spam
>     import spam

Yeah, this was just brought to my attention at our group meeting
today.  I'm with you on this one -- there really isn't a good reason
why this shouldn't work.  (I wonder why that constraint was ever added
to the reference manual; maybe I was just upset that someone would
*do* something as ugly as that, or maybe there was a J[P]ython
reason???.)

> > I think Jeremy has an excellent reason.  Compilers want to do analysis
> > of name usage at compile time.  The value of * cannot be determined at
> > compile time (you cannot know what module will actually be imported at
> > run time).  Up till now, we were able to fudge this, but Jeremy's new
> > compiler needs to know exactly which names are defined in all local
> > scopes, in order to do nested scopes right.
> 
> Hrrmm.... I guess I have to agree with that. None the less, I wish we could
> have a "ack! this is stupid code! it uses 'from larch import *'! All bets
> are off, we do a lot of slow complicated runtime checking now!" mode. The
> thing I still enjoy most about Python is that it always does what I want,
> and though I'd never want to do 'from different import *' in a local scope,
> I do want other, less wise people to have the same experience, where
> possible :)

Hm, maybe, just *maybe* Jeremy can do this if there are no nested
scopes in sight.  But I don't think it's a big deal as long as the
error message is clear -- it's bad style.

> And I also want to be able to do:
> 
> def fill_me(with):
>     global me
>     if with == 1:
>         import me
>     elif with == 2:
>         import me_too as me
>     elif with == 3:
>         from me.Tools import me_me as me
>     elif with == 4:
>         me = FakeModule()
>         sys.modules['me'] = me
>     else:
>         raise ValueError
> 
> And I can't quite argue that away with 'the compiler needs to know ...' --
> it's all there!

Sort of, although I would prefer to do a two-stager here: first some
variation of "import me as meohmy", and then "global me; me = meohmy" .

> > > I also have another issue with your recent patches, Jeremy, also in
> > > the backwards-compatibility departement :) You gave new.code two
> > > new, non-optional arguments, in the middle of the long argument
> > > list. I sent a note about it to python-checkins instead of
> > > python-dev by accident, but Fred seemed to agree with me there.
> 
> > (Tim will love this. :-)
> 
> > I don't know what those new arguments represent.  If they can
> > reasonably be assumed to be empty for code that doesn't use the new
> > features, I'd say move them to the end and default them properly.  If
> > they must be specified, I'd say too bad, the new module is an accident
> > of the implementation anyway, and its users should update their code.
> 
> Okay, I can live with that. It's sure to cause some gripes though. Then
> again, from looking at the code I'd say those arguments (freevars and
> cellvars) can easily default to empty tuples.

OK.  I hope Jeremy can fix this when he gets home.

--Guido van Rossum (home page: http://www.python.org/~guido/)