[Python-Dev] Re: Allow all assignment expressions after 'import something as'

Guido van Rossum guido@beopen.com
Wed, 23 Aug 2000 11:22:04 -0500


> On Mon, 21 Aug 2000, Guido van Rossum wrote:
> > > > > > Summary: Allow all assignment expressions after 'import
> > > > > > something as'
> [...]
> > I kind of doubt it, because it doesn't look useful.

[Ping]
> Looks potentially useful to me.  If nothing else, it's certainly
> easier to explain than any other behaviour i could think of, since
> assignment is already well-understood.

KISS suggests not to add it.  We had a brief discussion about this at
our 2.0 planning meeting and nobody there thought it would be worth
it, and several of us felt it would be asking for trouble.

> > I do want "import foo.bar as spam" back, assigning foo.bar to spam.
> 
> No no no no.  Or at least let's step back and look at the whole
> situation first.
> 
> "import foo.bar as spam" makes me uncomfortable because:
> 
>     (a) It's not clear whether spam should get foo or foo.bar, as
>         evidenced by the discussion between Gordon and Thomas.

As far as I recall that conversation, it's just that Thomas (more or
less accidentally) implemented what was easiest from the
implementation's point of view without thinking about what it should
mean.  *Of course* it should mean what I said if it's allowed.  Even
Thomas agrees to that now.

>     (b) There's a straightforward and unambiguous way to express
>         this already: "from foo import bar as spam".

Without syntax coloring that looks word soup to me.

  import foo.bar as spam

uses fewer words to say the same clearer.

>     (c) It's not clear whether this should work only for modules
>         named bar, or any symbol named bar.

Same as for import: bar must be a submodule (or subpackage) in package
foo.

> Before packages, the only two forms of the import statement were:
> 
>     import <module>
>     from <module> import <symbol>
> 
> After packages, the permitted forms are now:
> 
>     import <module>
>     import <package>
>     import <pkgpath>.<module>
>     import <pkgpath>.<package>
>     from <module> import <symbol>
>     from <package> import <module>
>     from <pkgpath>.<module> import <symbol>
>     from <pkgpath>.<package> import <module>

You're creating more cases than necessary to get a grip on this.  This
is enough, if you realize that a package is also a module and the
package path doesn't add any new cases:

  import <module>
  from <module> import <symbol>
  from <package> import <module>

> where a <pkgpath> is a dot-separated list of package names.
> 
> With "as" clauses, we could permit:
> 
>     import <module> as <localmodule>
>     import <package> as <localpackage>
> ??  import <pkgpath>.<module> as <localmodule>
> ??  import <pkgpath>.<package> as <localpackage>
> ??  import <module>.<symbol> as <localsymbol>
> ??  import <pkgpath>.<module>.<symbol> as <localsymbol>
>     from <module> import <symbol> as <localsymbol>
>     from <package> import <symbol> as <localsymbol>
>     from <pkgpath>.<module> import <symbol> as <localsymbol>
>     from <pkgpath>.<package> import <module> as <localmodule>

Let's simplify that to:

  import <module> as <localname>
  from <module> import <symbol> as <localname>
  from <package> import <module> as <localname>

> It's not clear that we should allow "as" on the forms marked with
> ??, since the other six clearly identify the thing being renamed
> and they do not.
> 
> Also note that all the other forms using "as" assign exactly one
> thing: the name after the "as".  Would the forms marked with ??
> assign just the name after the "as" (consistent with the other
> "as" forms), or also the top-level package name as well (consistent
> with the current behaviour of "import <pkgpath>.<module>")?
> 
> That is, would
> 
>     import foo.bar as spam
> 
> define just spam or both foo and spam?

Aargh!  Just spam, of course!

> All these questions make me uncertain...

Not me.

--Guido van Rossum (home page: http://www.pythonlabs.com/~guido/)