Hi Ken

Thank you for your clear subject line. As you probably already know, in
Python, assignments are not expressions, and so we can't write
   if (a=get()):
       # do something with a
One reason for this is, perhaps, that "Explicit is better than implicit"
(as in The Zen of Python, via "import this").

Your last example of the intended semantics is
    b = a * (import math).tan(math.radians(45))
which demonstrate that you intend the statement
    a = (import math)
to have the side effect of assigning a value to the identifier 'math'.

I'm concerned that your intended semantics are similar to "assignment as an
expression", and so wouldn't fit in well with the rest of Python. More
concretely, when reading a module I expect to see all the imports at the
top, much like a recipe starts with a list of ingredients.

It may be that the documentation regarding import and __import__ can be
improved, and that there's a practical problem behind your experience that
__import__ is cumbersome and takes space.

with best regards

Jonathan


On Sat, Jul 14, 2018 at 9:24 AM, Ken Hilton <kenlhil...@gmail.com> wrote:

> Hi all,
>
> Just a curious idea I had. The subject says it all. "import" is currently
> a statement, which means it cannot be used inside anything else. Currently,
> the only way to import a module inside an expression is to use the
> __import__ function, which is both cumbersome and takes up more space
> (which is disadvantageous in things like code golf).
>
> I propose making "import" an expression, thus allowing the syntactic sugar
> of "import module" -> "__import__('module')" to be graduated to the
> expression level. Because of operator precedence, I suspect that in most
> cases one would need to surround the expression with parentheses.
> An additional effect that is not seen with using __import__ is that the
> module's name is bound to the current scope the way it is with a normal
> import statement.
>
> Examples of where this could be used:
>
> Importing on the fly to generate one value:
>
>     secret = (import random).randint(1, 100)
>
> Quick use of itertools in generator expressions:
>
>     (i * i for i in (import itertools).accumulate(generate_numbers()))
>
> Re-using a function from a module after importing it in an expression:
>
>     b = a * (import math).tan(math.radians(45)) #math.radians is valid
> because (import math) binds "math" to the current scope
>
> What are your thoughts?
>
> Sharing,
> Ken Hilton;
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas@python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
>
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to