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:
__import__('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, and find_imports.
See their docstrings for details.
By default, the filename for SyntaxErrors 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)))
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+).
Combine these with -i to open a REPL after running the file specified on the command line. -ia allows top-level await.
See import-expression --help for more details.
Running a file
Run import-expression <filename.py>.
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.execwill have no effect on the caller's globals or locals without an explicitglobalsargument. - Unlike real operators, spaces before and after the import expression operator (such as
x ! .y) are not supported.
License
Copyright © 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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file import_expression-2.2.1.post1.tar.gz.
File metadata
- Download URL: import_expression-2.2.1.post1.tar.gz
- Upload date:
- Size: 16.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1c831bf26bef7edf36a97b34c687b962e7abe06116c66f00e14f9a3218623d4f
|
|
| MD5 |
a36f5376f6b8b2ede3f66f56223bd23a
|
|
| BLAKE2b-256 |
95dd4c561ce20064985b2a7d3eadb4002c981c8906a4efd309a0b595acb2727a
|
File details
Details for the file import_expression-2.2.1.post1-py3-none-any.whl.
File metadata
- Download URL: import_expression-2.2.1.post1-py3-none-any.whl
- Upload date:
- Size: 23.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7b3677e889816e0dbdcc7f42f4534071c54c667f32c71097522ea602f6497902
|
|
| MD5 |
0455a8e1b5b1daef4599ff9d8a530d33
|
|
| BLAKE2b-256 |
3892437a1dbc58241770198dc4d966a2e6363bd684f961070623aec975cfe03f
|