当前位置: 首页 > 后端技术 > Python

Python动态执行代码修改命名空间

时间:2023-03-25 22:23:42 Python

在前面的《Python 代码动态执行初探》中,我提到了如何使用exec和eval函数来动态执行代码,也描述了如何限制它的命名空间来避免动态代码造成的环境“污染”.但是,有时候,我们确实希望动态代码生成一些局部或全局的定义——比如一个变量名——以便可以继续使用原始代码或后续的动态代码。像下面这样直接定义是不能生效的:deff():a=1exec("a=3")print(a)此时打印的结果会是1,也就是说exec中a的修改被丢弃了。但是,locals参数可用于检索修改:deffoo():ldict={}exec("a=3",globals(),ldict)a=ldict['a']print(a)打印出来的这里的结果是3。本文示例代码摘自stackoverflow的一个问答2021-11-17更新注意:在pycharm中,默认源码根目录为项目根目录。这个时候不要在工程内部设置source文件夹,否则会出现同一个Module可以不同层级导入的问题。我曾经犯过这个错误,将一个项目子文件夹设置为源文件夹:导致自动生成imports,都缺少一级目录,比如下面这样:fromcore.data.ActionimportActionclassExecutor居然写了整个路径也可以成功导入:fromsimplerpa.core.data.ActionimportActionclassSTATE这个错误还是很隐蔽的,因为正常使用是没有问题的,直到有一个class成员属性承担了本文上面提到的ldict功能,但是Executor执行的时候存储的Variables丢失了,才发现原来不同路径导入的同一个类不能共享类成员。