Как я могу написать правило Lint для предотвращения мутации глобальных переменных в Python?

Глобальные переменные — это зло, мы все это знаем (под глобальными переменными я подразумеваю переменные уровня модуля). Я хочу написать собственное правило lint для защиты его обновления. Например,

      GLOBAL_DICT = {
    'a': 1,
    'b': 2,
}


def func():
    var_1 = GLOBAL_DICT.get('a')  # Should be a valid case
    GLOBAL_DICT.update({  # Should be an invalid case, and Lint should catch this
        'c': 3,
    })


func()

Доступ (чтение) к переменным уровня модуля — это распространенный шаблон, который мы используем, однако обновление переменных уровня модуля (глобальных) — небезопасная операция. Я попытался использовать библиотеку ast и библиотеку libCST, чтобы поймать это обновление. Но я не смог найти способ обнаружить мутацию глобальной переменной. Единственный способ, который я мог придумать, - это жестко запрограммировать список операций обновления для изменяемых структур данных, например.extend(),.append()и т. д. дляlistструктура данных; и.update(),.pop()и т. д. дляdictструктура данных. И при обходе дерева (AST или CST) сохранить список всех глобальных переменных, если они относятся к изменяемому типу, и если для одной из них вызывается один из упомянутых методов, правило lint может вызвать его. Но это не похоже на полное доказательство решения.

Не могли бы вы поделиться идеями о том, как я могу реализовать собственное правило lint для этого?

0 ответов

Другие вопросы по тегам