在python中,如何使输入参数的函数不可变?

问题描述:

假设我们有一个函数:在python中,如何使输入参数的函数不可变?

import copy 

def demo_function(list_in) 
    list_out = copy.deepcopy(list_in) 
    list_in.append("howdy") 
    return list_out 

请注意,我们追加到list_in而不是list_out。但demo_function实际上不应修改其输入。我们想要执行这个。如果有人不小心修改list_indemo_function正文内部的某处,应该抛出错误我们如何实现这种类型的错误检查?

以下是我的最佳尝试,但它不起作用。字符串“你好”仍然最终被追加到list_in;不会引发错误

class Frozen(object): 
    # The Frozen class was developed by ActiveState Software Inc. 
    def __init__(self, value): 
     self._value = value 

    def __getattribute__(self, name): 
     if name == '_value': return super(Frozen, self).__getattribute__(name) 
     v = getattr(self._value, name) 
     return v if hasattr(v, '__hash__') else Frozen(v) 

    def __setattr__(self, name, value): 
     if name == '_value': super(Frozen, self).__setattr__(name, value) 
     else: raise Exception("Can't modify frozen object {0}".format(self._value)) 

def const(some_function):  
    def wrapper(fargs,*args,**kwargs): 
     for f in fargs: 
      f = Frozen(f) 
      pass 
     for a in args: 
      a = Frozen(a) 
      pass 
     for k in kwargs: 
      k = Frozen(k) 
      pass 
     some_function(fargs, *args, **kwargs)  
    return wrapper 

@const 
def demo_function(list_in): 
    list_out = copy.deepcopy(list_in) 
    list_in.append("howdy") 
    return list_out 

lisandra = [1, 2, 3, 4, 5] 

modified_lisandra = demo_function(lisandra) 

print(lisandra) 

编辑:

我很后悔,用列表作为我的榜样。我真的想要一个通用的解决方案,无论它们的数据类型是什么,都可以使函数的输入不可变(const)。将python列表转换为元组非常简单。但是,如果函数的输入是某个用户定义的类的实例呢?你不知道如何将它转换成元组。即使您确实知道如何将对象转换为元组,您也不想为项目中的每个数据类型编写不同的解决方案。我们希望单个解决方案能够冻结函数输入的值,而不管这些输入的数据类型如何。

+0

使用一个元组? 'lisandra =(1,2,3,4,5)' – James

+0

您可能想改为使用元组。 –

+0

为什么你想要它是不可变的?你希望获得什么? –

你总是可以尝试这样的事情..

import copy 

def demo_function(list_in): 
    original = list_in[:] 
    list_out = copy.deepcopy(list_in) 
    list_in.append("howdy") 
    assert original == list_in 
    return list_out