Parses a superset of Python allowing for inline module import expressions
Project description
Import Expression Parser (for lack of a better name)
Import Expression Parser converts code like this:
urllib.parse!.quote('hello there')
Into this equivalent code:
importlib.import_module('urllib.parse').quote('hello there')
Usage
>>> import import_expression
>>> import_expression.eval('collections!.Counter("bccdddeeee")')
Counter({'e': 4, 'd': 3, 'c': 2, 'b': 1})
The other public functions are exec
, compile
, parse
, find_imports
, and update_globals
.
See their docstrings for details.
By default, the filename for SyntaxError
s is <string>
.
To change this, pass in a filename via the filename
kwarg.
Reusing compiled code objects
import_expression.eval/exec/compile should not be passed strings in a tight loop.
Doing so will recompile the string every time. Instead, you should pre-compile the string to a code object
and pass that to import_expression.eval / import_expression.exec.
For example, instead of this:
for line in sys.stdin:
print(import_expression.eval('foo!.bar(l)', dict(l=line))
Prefer this:
code = import_expression.compile('foo!.bar(l)', mode='eval')
for line in sys.stdin:
print(import_expression.eval(code, dict(l=line)))
Custom encoding
# encoding: import_expression
print(typing!.TYPE_CHECKING)
This file, when run, will print True/False. For maximum laziness you can also do #coding:ie
.
REPL usage
Run import-expression
for an import expression enabled REPL.
Run import-expression -a
for a REPL that supports both import expressions and top level await
(3.8+).
See import-expression --help
for more details.
Running a file
Run import-expression <filename.py>
.
File rewriter
Run import-expression-rewrite <file.py>
to rewrite a file containing import expressions to standard Python.
Add the -i
flag to rewrite in-place.
Limitations / Known Issues
- Due to the hell that is f-string parsing, and because
!
is already an operator inside f-strings, import expressions inside f-strings will likely never be supported. - Due to python limitations, results of
import_expression.exec
will have no effect on the caller's globals or locals without an explicitglobals
argument. - Unlike real operators, spaces before and after the import expression operator (such as
x ! .y
) are not supported.
License
Copyright © 2018–2019 Io Mintz <io@mintz.cc>. All Rights Reserved.
Licensed under the MIT License. See the LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for import_expression-1.1.5-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f60c3765dbf2f41928b9c6ef79d632209b6705fc8f30e281ed1a492ed026b10f |
|
MD5 | c68aa84e969fe63ce8cc7218ae8e1a4f |
|
BLAKE2b-256 | 33a20182936b9e6e5af59d0acdb42c6e2d51f528f3e012717db68b4431725191 |