Skip to main content

Parses a superset of Python allowing for inline module import expressions

Project description

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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

import_expression-2.2.1.post1.tar.gz (16.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

import_expression-2.2.1.post1-py3-none-any.whl (23.9 kB view details)

Uploaded Python 3

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

Hashes for import_expression-2.2.1.post1.tar.gz
Algorithm Hash digest
SHA256 1c831bf26bef7edf36a97b34c687b962e7abe06116c66f00e14f9a3218623d4f
MD5 a36f5376f6b8b2ede3f66f56223bd23a
BLAKE2b-256 95dd4c561ce20064985b2a7d3eadb4002c981c8906a4efd309a0b595acb2727a

See more details on using hashes here.

File details

Details for the file import_expression-2.2.1.post1-py3-none-any.whl.

File metadata

File hashes

Hashes for import_expression-2.2.1.post1-py3-none-any.whl
Algorithm Hash digest
SHA256 7b3677e889816e0dbdcc7f42f4534071c54c667f32c71097522ea602f6497902
MD5 0455a8e1b5b1daef4599ff9d8a530d33
BLAKE2b-256 3892437a1dbc58241770198dc4d966a2e6363bd684f961070623aec975cfe03f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page