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 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)))
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>
.
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 © 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-2.1.0.post1.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 99c95819eb88497503ace4b59a1a55803a75e37f4a9c7030cc72886d1b5d89b4 |
|
MD5 | 9819587c7d5edcd8a42a8ffd63c02791 |
|
BLAKE2b-256 | 712a1ea1cf96e03c551a7ec0e784750ec07e71a90cb64ab741637b8431d8b506 |
Hashes for import_expression-2.1.0.post1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 242886805fc2bcf5be699da39936e80dcadd280f2393baeb565814f25f60f692 |
|
MD5 | ffcb2eaf4f5ef99e0d32b199555c276e |
|
BLAKE2b-256 | d44bf829af8aa047c9c483a4b90b028e93dd3012dc5385e8aa213705e587f183 |