Oneliner-py

Latest version: v1.2.0

Safety actively analyzes 700950 Python packages for vulnerabilities to keep your Python projects secure.

Scan your dependencies

1.2.0

New Features

"chain_call" wrapper
Consider a class with `__del__` method specified like
py
class B:
def __del__(self):
print(123456)

Do folowing operations
py
b = B()
b = None
print(654321)

At line 2, instance `B()` is released, `__del__` method is called, `123456` is printed. Then, at line 3, `654321` is printed.

With the original "list" wrapper, we get following converted code
py
[b:=B(),b:=None,print(654321)]

We can find, even though b is set to `None`, the `B()` is not deleted until the whole list is released. That means, this piece of code will print `654321` first, then `123456`. The behavior is inconsistent with the original code.

So the "chain_call" wrapper is born
py
(__ol_run:=lambda _:__ol_run)(b:=B())(b:=None)(print(654321))

The value of each expression in the wrapper will be destroyed instantly after the evaluation of the expression. The delayed-delete wont happen any more. The code prints `123456` then `654321` now.

By default, the "chain_call" wrapper will be selected. To select the old "list" wrapper, add `-Cexpr_wrapper=list` to the command line.

“short_circuit” style `if-elif-else`

For an `if-elif-else`code
py
if b:
print("1")
elif c:
print("2")
else:
print("3")

Using the if-expressions, we get the oneliner
py
print('1') if b else print('2') if c else print('3')

Using the short-circuit expessions, we will get an equivalent oneliner that is much harder to read.
py
b and (print('1') or 1) or c and (print('2') or 1) or print('3')

For a `if` statement without `elif` or `else`, the output will be simplified
py
original
if b:
print("hello")

oneliner
b and print('hello')

To use the "short circuit" style `if`, add `-Cif_style=short_circuit` to the command line

Command Line Changes

A new `-C` argument is added for setting configs of oneliner convertion.
The `--unparser <unparser_name>` argument is deprecated, use `-Cunparser=<unparser_name>` instead.
The `--unparser` argument will be removed in 1.3.0

Code Quality
mypy checker
In 1.2.0, Oneliner-Py uses mypy to check the code typing.
With the help of mypy, a lot of typing problems have been found and fixed.
Tests for expr_unparse
A bunch of tests have been added for our own unparser `expr_unparse`. Now the test coverage of expr_unparse.py is 100%. While writing the test, a lot of bugs in expr_unparse have been found and fixed.

1.1.0

Bug fix
- Fixed the conversion of list comprehension in a function namespace
New feature
- A new unparser is added for a more compact output code format
- Argument `--unparser` is added to the commandline for choosing the unparser
- Argument `-v` and `--version` are added for checking the version of Oneliner-Py

1.0.0

First Release 🎉🎉🎉

Links

Releases

Has known vulnerabilities

© 2025 Safety CLI Cybersecurity Inc. All Rights Reserved.