Skip to main content

Import Expression Parser (for lack of a better name)

Coverage Status

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.exec will have no effect on the caller's globals or locals without an explicit globals 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.

Metadata

Release files for import-expression 2.2.1.post1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for import-expression 2.2.1.post1
File Size Uploaded
import_expression-2.2.1.post1.tar.gz 16.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for import-expression 2.2.1.post1
File Interpreter ABI Platform
import_expression-2.2.1.post1-py3-none-any.whl Python 3 none any Details

Total release size: 40.0 kB

Release files / import_expression-2.2.1.post1.tar.gz

Download URL import_expression-2.2.1.post1.tar.gz
Size 16.0 kB
Tags Source
SHA-256 checksum
How to use checksums
1c831bf26bef7edf36a97b34c687b962e7abe06116c66f00e14f9a3218623d4f
BLAKE2b-256 checksum
How to use checksums
95dd4c561ce20064985b2a7d3eadb4002c981c8906a4efd309a0b595acb2727a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.0 CPython/3.12.7

Release files / import_expression-2.2.1.post1-py3-none-any.whl

Download URL import_expression-2.2.1.post1-py3-none-any.whl
Size 23.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7b3677e889816e0dbdcc7f42f4534071c54c667f32c71097522ea602f6497902
BLAKE2b-256 checksum
How to use checksums
3892437a1dbc58241770198dc4d966a2e6363bd684f961070623aec975cfe03f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.0 CPython/3.12.7
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page