How would I format python code using python?

Question:

Let’s say I’ve got this code in python:

total=0for i in range(100):print(i)if i > 50_total=total+i

How would I make an algorithm in python to format this python code into the code below:

total=0
for i in range(100):
    print(i)
    if i > 50:
        total=total+i

Assume that everything is nested under each other, such that another statement would be assumed to be inside the if block.

Asked By: Marc Chew

||

Answers:

This was quite a fun exercise! I’m running out of juice so just posting this as is. It works on your example but probably not much for anything more complex.

code_block = "total=0for i in range(100):print(i)if i > 50_total=total+iprint('finished')"
code_block_b = "def okay() {print('ff')while True:print('blbl')break}"

line_break_before = ['for', 'while', 'if', 'print', 'break', '}']
line_break_after = [':', '{']
indent_chars = [':', '{']
unindent_chars = ['}']

# Add line breaks before keywords
for kw in line_break_before:
    kw_indexes = [idx for idx in range(len(code_block)) if code_block[idx:idx + len(kw)] == kw]
    for kw_idx in kw_indexes[::-1]:
        code_block = code_block[:kw_idx] + 'n' + code_block[kw_idx:]

# Add line breaks after other keywords if not present already
for kw in line_break_after:
    kw_indexes = [idx for idx in range(len(code_block)) if code_block[idx:idx + len(kw)] == kw]
    for kw_idx in kw_indexes[::-1]:
        if code_block[kw_idx + 1: kw_idx + 2] != 'n':
            code_block = code_block[:kw_idx + 1] + 'n' + code_block[kw_idx + 1:]

# Add indentation
indent = 0
formatted_code_lines = []
for line in code_block.split('n'):
    if line[-1] in unindent_chars:
        indent = 0
    formatted_code_lines.append(' ' * indent)
    if line[-1] in indent_chars:
        indent += 4
    formatted_code_lines.append(line + 'n')

code_block = ''.join(formatted_code_lines)

print(code_block)

The basic premise for formatting is based around keywords. There are keys that require a line break before, and keys that require a line break after them. After that, the indentation was counted +4 spaces for every line after each : symbol. I tested some formatting with braces too in code_block_b.

Output a

total=0
for i in range(100):
    print(i)
    if i > 50:
        total=total+i

Output b

def okay() {
    print('ff')
    while True:
        print('blbl')
        break
}
Answered By: LTJ
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.