Cheuk Ting Ho
Developer advocate / Data Scientist - support open-source and building the community.
Grab the slides:
https://slides.com/cheukting_ho/reformating-code
There are so many good reformatter avaliable
or PyBetter or Autoflake or isort or...
Do you want to make one yourself?
fn(1, 2)  # calls fnSource: https://libcst.readthedocs.io/en/latest/why_libcst.html
(They care about those white spaces)
fn(1, 2)  # calls fnSource: https://libcst.readthedocs.io/en/latest/why_libcst.html
(*not all formatters uses LibCST)
LibCST parses Python 3.0 -> 3.11 source code as a CST tree that keeps all formatting details (comments, whitespaces, parentheses, etc). It's useful for building automated refactoring (codemod) applications and linters.
fn(1, 2)  # calls fnSource: https://libcst.readthedocs.io/en/latest/why_libcst.html
import libcst as cst
cst.parse_expression("1 + 2")BinaryOperation(
    left=Integer(
        value='1',
        lpar=[],
        rpar=[],
    ),
    operator=Add(
        whitespace_before=SimpleWhitespace(
            value=' ',
        ),
        whitespace_after=SimpleWhitespace(
            value=' ',
        ),
    ),
    right=Integer(
        value='2',
        lpar=[],
        rpar=[],
    ),
    lpar=[],
    rpar=[],
)Imagine you are writing a reformatter...
isinstance
def if_there_is_addition(node):
    return m.matches(
        node,
        m.BinaryOperation(
            operator=m.Add(),
        ),
    )on_visit and on_leave
class CountAdd(cst.CSTVisitor):
    def __init__(self):
        self.add_count = 0
    def visit_Add(self, node):
        self.add_count += 1
        print(f"counting add number {self.add_count}")
    def leave_Add(self, node):
        print("bye!")
source = "1 + 2"
module = cst.parse_module(source)
module.visit(CountAdd())to travel through and modify code
updated_node
class OffByOne(cst.CSTTransformer):
    def __init__(self):
        pass
    def leave_BinaryOperation(self, original_node, updated_node):
        if first_addition(original_node):
            return updated_node.with_changes(
                left=cst.BinaryOperation(
                    left=cst.Integer(
                        value='1',
                        lpar=[],
                        rpar=[],
                    ),
                    operator=cst.Add(
                        whitespace_before=cst.SimpleWhitespace(
                            value=' ',
                        ),
                        whitespace_after=cst.SimpleWhitespace(
                            value=' ',
                        ),
                    ),
                    right=original_node.left,
                    lpar=[],
                    rpar=[],
                )
            )
        else:
            return updated_node.with_changes()code attributesource = "1 + 2"
module = cst.parse_module(source)
new = module.visit(OffByOne())
print(new.code)
And write your own
https://conference.pyladies.com/
By Cheuk Ting Ho
Developer advocate / Data Scientist - support open-source and building the community.