Как я могу написать правило 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 для этого?