Here is another study, pretty useless what it does actually, however, this might come in handy for some self-modifying projects.
This script writes a script called test01.py. It then imports the test01.py module, overwrites it, including data to a list and finally re-imports the modified test01.py module. At the very end, a function of the re-imported module is called. As a bonus the test01.py module is a fully self sufficient python program itself.
The study demonstrates how a python program can not only modify data but also modify its own functionality during run-time. Having a dictionary with python instruction could be an interesting way to write self-learning scripts.
from importlib import reload
import sys
a=[]
def modify(a,i):
a.append(i)
return a
# create a module to import
filename='test01.py'
f=open(filename,'w')
f.write(f'b=[]\n')
f.write(f'def test01(b):\n')
f.write(f' return b\n')
f.write(f'if __name__=="__main__":\n')
f.write(f' test01(b)\n')
f.write(f' print(b)\n')
f.close()
# import the module
from test01 import *
for i in range(3):
# play with data
a=modify(a,i)
# write modified module
filename='test01.py'
f=open(filename,'w')
f.write(f'b='+str(a)+'\n')
f.write(f'def test01(b):\n')
f.write(f' b.pop(1)\n')
f.write(f' return b\n')
f.write(f'if __name__=="__main__":\n')
f.write(f' test01(b)\n')
f.write(f' print(b)\n')
f.close()
# re-import module
reload(sys.modules['test01'])
from test01 import b, test01
# show data from module
print(b)
print('===')
print(a)
# run function from module
print(test01(a))