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.