Python 检查方法是否改变了对象

Python 检查方法是否改变了对象,python,immutability,Python,Immutability,我正在将字典{str:object}传递到一段可执行代码中。基本上称之为:exec(一些用户定义的代码、符号、字典)。问题是我不知道什么是一些用户定义的代码以及它的作用。我只知道它是由用户以字符串形式提供的。但我需要的是确保字典中的现有对象保持不变。换句话说,它可以向字典中添加新项,但是已经存在的对象对于用户代码应该是只读的 (请不要问我“你为什么需要它?”…嗯,我有点需要它。它会让我的生活更美好,因为我的代码会更防错。) 这与不变性的概念有关,在Python中,不变性被忽略了。类似于C++编译

我正在将字典
{str:object}
传递到一段可执行代码中。基本上称之为:
exec(一些用户定义的代码、符号、字典)
。问题是我不知道什么是
一些用户定义的代码以及它的作用。我只知道它是由用户以字符串形式提供的。但我需要的是确保字典中的现有对象保持不变。换句话说,它可以向字典中添加新项,但是已经存在的对象对于用户代码应该是只读的

(请不要问我“你为什么需要它?”…嗯,我有点需要它。它会让我的生活更美好,因为我的代码会更防错。)

这与不变性的概念有关,在Python中,不变性被忽略了。类似于C++编译时执行的一致性检查,在Python运行时会很好。 可能需要使用ast或symtable模块分析代码。或者只需类的
attr
dir
就足够了

然而,为了使我的问题更加集中,我正在考虑如何检查任意类的方法是否会变异self对象

我试图弄清楚一个理论函数
是如何改变对象(类定义、方法名称)
的。如果遇到以下语句,则需要检查代码并应用以下规则:

1)
self.some\u member=something
然后“返回True”(它确实会改变对象)

2)
self.some\u other\u method(something)
然后
返回does\u method\u mutate\u object(类定义、some\u other\u method\u name)
(即递归检查)

3)
some\u alias=self
some\u alias=self。some\u成员
然后检查规则1和规则2,不仅检查
self
,还检查
some\u alias

4) 还有其他规则吗?二传手等


嗯,我知道这很可能根本不可能实现。但是也许。。。有人知道吗?

你也应该做4
x=self。一些其他方法
,然后检查规则2,不仅检查
一些其他方法
,还检查
x
。现在是脑筋急转弯。如果你有
x=self.some\u mutating\u method如果some\u boolean其他self.some\u non\u mutating\u method
?知道x是否真的变异可能只能在运行时确定。这在我看来是无法确定的。@Kevin:至于
x=self.some\u mutating\u method如果某个布尔值不是self.some\u non\u mutating\u method
。。。我不是说这种“运行时”检查,如果不真正运行它,这将是不可能检查的。换句话说,如果它能调用一些变异的方法,那么它是可变的。只有当它只能调用不可变的方法时,它才是不可变的。难道你不能深入复制你的dict/对象并将副本传递给exec吗?这或多或少是不可能用静态分析来决定的
adict[akey]=avalue
,或
setattr(anobj,anattr,avalue)
-您如何决定这是否合适?在Python中,不可变性并没有被“忽略”(首先,大多数内置类型都是不可变的);强大、动态的输入是一个核心设计决策。如果您想绝对确定任意方法不会改变参数,请传递一个副本。