Parses a superset of Python allowing for inline module import expressions
Project description
# Import Expression Parser (for lack of a better name)
[![Build Status](https://travis-ci.org/bmintz/import-expression-parser.svg?branch=main)](https://travis-ci.org/bmintz/import-expression-parser)
[![Coverage Status](https://coveralls.io/repos/github/bmintz/import-expression-parser/badge.svg?branch=main)](https://coveralls.io/github/bmintz/import-expression-parser?branch=main)
Import Expression Parser converts code like this:
```py
x = collections.deque!(maxsize=2)
```
Into this equivalent code:
```py
x = importlib.import_module('collections').deque(maxsize=2)
```
## Usage
```py
>>> import import_expression
>>> import_expression.eval('collections!.Counter("bccdddeeee")')
Counter({'e': 4, 'd': 3, 'c': 2, 'b': 1})
```
By default, the filename for `SyntaxError`s is `<string>`.
To change this, pass in a filename via the `filename` kwarg.
## AST usage
<!-- TODO document usage like jishaku or how one could build a REPL -->
### Monkey Patching the REPL
```py
>>> urllib.parse!.quote
File "<stdin>", line 1
urllib.parse!.quote
^
SyntaxError: invalid syntax
>>> import import_expression.patch
>>> import_expression.patch.patch(globals())
>>> urllib.parse!.quote
<function quote at 0xdeadbeef>
```
For convenience, you can also add the following two lines to your `sitecustomize.py`:
```py
import import_expression.patch
import_expression.patch.patch()
```
And all REPL sessions will use the import expression syntax.
## Limitations / Known Issues
* Some invalid syntax, such as `urllib!.parse!` and`import x!` is not yet detected, though the former still works as though it was `urllib.parse!`.
* Due to the hell that is f-string parsing, 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
without an explicit `globals` argument.
## FAQ
*Actually asked questions for a new project! Golly gee!*
* Why not just use `__import__('x')`? \
From the [discord.py server](https://discord.gg/r3sSKJJ):
> devon#4089: if i want to type `_("thing")` \
> devon#4089: i have to move my fingers between three different locations \
> devon#4089: both at the end and start of the string \
> lambda#0987: yeah and [*it's*] also a pain to type on mobile so ok \
> devon#4089: \<\<x\>\> is slightly less grating \
For context, the originally proposed syntax was \<\<x\>\>.
## [License](https://github.com/bmintz/import-expression-parser/blob/main/LICENSE)
Copyright © 2018 Benjamin Mintz <<bmintz@protonmail.com>>. All Rights Reserved. \
Licensed under the MIT License. See the LICENSE.md file for details.
[![Build Status](https://travis-ci.org/bmintz/import-expression-parser.svg?branch=main)](https://travis-ci.org/bmintz/import-expression-parser)
[![Coverage Status](https://coveralls.io/repos/github/bmintz/import-expression-parser/badge.svg?branch=main)](https://coveralls.io/github/bmintz/import-expression-parser?branch=main)
Import Expression Parser converts code like this:
```py
x = collections.deque!(maxsize=2)
```
Into this equivalent code:
```py
x = importlib.import_module('collections').deque(maxsize=2)
```
## Usage
```py
>>> import import_expression
>>> import_expression.eval('collections!.Counter("bccdddeeee")')
Counter({'e': 4, 'd': 3, 'c': 2, 'b': 1})
```
By default, the filename for `SyntaxError`s is `<string>`.
To change this, pass in a filename via the `filename` kwarg.
## AST usage
<!-- TODO document usage like jishaku or how one could build a REPL -->
### Monkey Patching the REPL
```py
>>> urllib.parse!.quote
File "<stdin>", line 1
urllib.parse!.quote
^
SyntaxError: invalid syntax
>>> import import_expression.patch
>>> import_expression.patch.patch(globals())
>>> urllib.parse!.quote
<function quote at 0xdeadbeef>
```
For convenience, you can also add the following two lines to your `sitecustomize.py`:
```py
import import_expression.patch
import_expression.patch.patch()
```
And all REPL sessions will use the import expression syntax.
## Limitations / Known Issues
* Some invalid syntax, such as `urllib!.parse!` and`import x!` is not yet detected, though the former still works as though it was `urllib.parse!`.
* Due to the hell that is f-string parsing, 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
without an explicit `globals` argument.
## FAQ
*Actually asked questions for a new project! Golly gee!*
* Why not just use `__import__('x')`? \
From the [discord.py server](https://discord.gg/r3sSKJJ):
> devon#4089: if i want to type `_("thing")` \
> devon#4089: i have to move my fingers between three different locations \
> devon#4089: both at the end and start of the string \
> lambda#0987: yeah and [*it's*] also a pain to type on mobile so ok \
> devon#4089: \<\<x\>\> is slightly less grating \
For context, the originally proposed syntax was \<\<x\>\>.
## [License](https://github.com/bmintz/import-expression-parser/blob/main/LICENSE)
Copyright © 2018 Benjamin Mintz <<bmintz@protonmail.com>>. All Rights Reserved. \
Licensed under the MIT License. See the LICENSE.md 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 Distributions
No source distribution files available for this release.See tutorial on generating distribution archives.
Built Distribution
Close
Hashes for import_expression-0.3.5-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 157f75d8e6dbc292846c46c4308735597892ef2f4ab41944176587a81f6cd2a3 |
|
MD5 | ec9ef4e4946d9bdebcca2c282f484bc3 |
|
BLAKE2b-256 | 147e1820585b3ed6eb51145d223022d0f7cf0d7e1860d3200d1bc3fce2d00161 |