我将字典{str: object}
传递给可执行的代码段。基本上称之为:exec(some_user_defined_code, symbol_dictionary)
。问题是我不知道some_user_defined_code
是什么以及它做了什么。我所知道的是它是由用户提供的字符串。但我需要的是确保字典中的现有对象保持不变。换句话说,它可以向字典添加新项目,但是已经存在的对象应该严格只读用户代码。
(请不要问我"你为什么需要它?" ......好吧,我有点需要它。它会让我的生活变得更好,因为我的代码会更加防错。 )
这涉及到不可变性的概念,这是恕我直言,而在Python中却被忽略了。在C ++编译时执行constness检查之类的东西在Python运行时会很好。
可能需要使用ast或symtable模块分析代码。或者只是该类的attr
和dir
就足够了?
然而,为了使我的问题更集中,我正在考虑如何检查任意类的方法是否会改变自我对象。
我试图找出理论函数does_method_mutate_object(class_definition, method_name)
应该如何工作。如果它遇到以下语句,则需要浏览代码并应用以下规则:
1)self.some_member = something
然后'返回True' (它确实改变了对象)
2)self.some_other_method(something)
然后return does_method_mutate_object(class_definition, some_other_method_name)
(即递归检查)
3)some_alias = self
或some_alias = self.some_member
然后检查规则1和2,不仅适用于self
,还适用于some_alias
嗯,我知道很可能甚至无法实现。但也许......任何人都有任何想法?