From 53ce094c0e0fe6de3c496e8845030b6801c38d4c Mon Sep 17 00:00:00 2001 From: un-pogaz <46523284+un-pogaz@users.noreply.github.com> Date: Tue, 28 Jan 2025 09:56:03 +0100 Subject: [PATCH 1/2] convert %d if the value is a explicit int conversion --- src/flynt/transform/percent_transformer.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/flynt/transform/percent_transformer.py b/src/flynt/transform/percent_transformer.py index 7dfe62e..188994d 100644 --- a/src/flynt/transform/percent_transformer.py +++ b/src/flynt/transform/percent_transformer.py @@ -34,7 +34,20 @@ def is_percent_stringify(node: ast.BinOp) -> bool: ) +def _is_builtin_int_call(val: ast.AST) -> bool: + return _is_int_call(val) or _is_len_call(val) + + +def _is_int_call(val: ast.AST) -> bool: + return ( + isinstance(val, ast.Call) + and isinstance(val.func, ast.Name) + and val.func.id == "int" + ) + + def _is_len_call(val: ast.AST) -> bool: + # assume built-in len always returns int return ( isinstance(val, ast.Call) and isinstance(val.func, ast.Name) @@ -65,8 +78,8 @@ def formatted_value( ) fmt_spec = translate_conversion_types.get(fmt_spec, fmt_spec) if fmt_spec == "d": - # assume built-in len always returns int - if not _is_len_call(val): + # test if is a built-in that returns int + if not _is_builtin_int_call(val): if not aggressive: raise ConversionRefused( "Skipping %d formatting - fstrings behave differently from % formatting.", From 48f1ff1011f1ee0f420dddc310b63da826e4df39 Mon Sep 17 00:00:00 2001 From: un-pogaz <46523284+un-pogaz@users.noreply.github.com> Date: Thu, 30 Jan 2025 20:59:04 +0100 Subject: [PATCH 2/2] adding test for int cast --- test/test_edits.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/test_edits.py b/test/test_edits.py index 7cbb503..1e5f074 100644 --- a/test/test_edits.py +++ b/test/test_edits.py @@ -47,6 +47,15 @@ def test_string_specific_len(state: State): assert s_out == s_expected +def test_dont_wrap_int(state: State): + s_in = """print('Int cast %d' % int(18.81))""" + s_expected = """print(f'Int cast {int(18.81)}')""" + + state.aggressive = True + s_out, count = code_editor.fstringify_code_by_line(s_in, state) + assert s_out == s_expected + + def test_dont_wrap_len(state: State): s_in = """print('List length %d' % len(sys.argv))""" s_expected = """print(f'List length {len(sys.argv)}')"""