Как добавить строку к функциям в файле Python - PullRequest
0 голосов
/ 26 декабря 2018

Я работаю над инструментом, который должен записывать содержимое в начало функций / методов в файлах Python.Я использую Python inspect, чтобы получить функции из файла.Учитывая эти объекты, я использую inspect.getsourcelines(function_obj) для получения содержимого функции.Оттуда мое решение состоит в том, чтобы проанализировать заголовок функции и затем написать необходимый контент после этого.Мое регулярное выражение:

re.compile('def \w*\((\w|\s|,|=|\r|\*|\n|^\))*\):')

Это кажется очень хрупким, я уверен, что он пропускает крайние случаи.Есть ли что-то более элегантное / надежное?Будет ли это хорошим вариантом использования модуля ast

1 Ответ

0 голосов
/ 29 декабря 2018

Я не уверен, почему мой ответ был удален, но две функции, приведенные ниже, являются моим решением моей проблемы добавления операторов строки в начало функций в файле Python.

Я используюТермин «подпрограммы» означает любую функцию или метод в файле.Обратите внимание, что получить файл из узла AST нелегко, поэтому я храню его вместе с узлом AST.

import ast

def get_routines_from_file(repo_file):
    '''
    Returns the methods and functions from the file
    '''
    routines = []

    with open(repo_file) as file:
        repo_file_content = file.read()
        repo_module = ast.parse(repo_file_content)
        for node in ast.walk(repo_module):
            if isinstance(node, ast.FunctionDef):
                routines.append((node, repo_file))

    return routines


def prepend_statement(self, file, node, statement):
    '''
    Writes a statement to the beginning of the routine
    '''
    first_node = node.body[0]
    first_line_in_routine = first_node.lineno

    # you unfortunately can't used first_node.col_offset because comments
    # return -1 as their col_offset.
    column_offset = node.col_offset + 4
    indentation = ' ' * column_offset
    statement = indentation + statement + '\n'

    with open(file, 'r') as f:
        contents = f.readlines()

    contents.insert(first_line_in_routine - 1, statement)

    with open(file, 'w') as f:
        f.writelines(contents)
...