Измените файл python, как если бы это был текстовый файл, но все еще имеющий переменные и тому подобное - PullRequest
0 голосов
/ 22 января 2019

Я тестирую некоторые вещи на Python, и мне стало интересно, можно ли было изменить файл Python, как если бы это был текстовый файл.

Я посмотрел на open(<filename>, "r+"), но это только редактирует файл. Я не могу изменить его так, как будто это скрипт на python, модифицирующий реальный скрипт, а не только кеш.


#main.py

import filea

filea.var1edit("Hello world")

Ожидается до:

#filea.py

var1 = "Text"
def var1edit(var):
  global var1
  var1 = var

Ожидается после:

#filea.py

var1 = "Hello world"
def var1edit(var):
  global var1
  var1 = var

Фактически после:

#filea.py

var1 = "Text"
def var1edit(var):
  global var1
  var1 = var

1 Ответ

0 голосов
/ 22 января 2019

Модуль ast и astunparse могут быть полезны. Сначала мы читаем файл .py, генерируем AST, модифицируем AST, разбираем его и записываем новый код обратно. Вот пример:

#main.py
import ast
import astunparse

class ReWriteSource(ast.NodeTransformer):
    #visit 'Assign' node and modify
    def visit_Assign(self,node):
        if node.targets[0].id == 'var1' and isinstance(node.value,ast.Str):
            node.value.s = 'Hello World!'
        return node

#read .py file
with open('filea.py','r') as f:
    source = f.read()
#generate the AST
source_ast = ast.parse(source)
#modify the AST
ReWriteSource().visit(source_ast)
#unparse and write it back
with open('filea.py','w') as f:
    f.write(astunparse.unparse(source_ast))

оригинал filea.py:

#filea.py
var1 = 'Text'
def var1edit(var):
    global var1
    var1 = var

изменено filea.py:

#filea.py
var1 = 'Hello World!'
def var1edit(var):
    global var1
    var1 = var
...