在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_in
demo_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列表转换为元组非常简单。但是,如果函数的输入是某个用户定义的类的实例呢?你不知道如何将它转换成元组。即使您确实知道如何将对象转换为元组,您也不想为项目中的每个数据类型编写不同的解决方案。我们希望单个解决方案能够冻结函数输入的值,而不管这些输入的数据类型如何。
答
你总是可以尝试这样的事情..
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
使用一个元组? 'lisandra =(1,2,3,4,5)' – James
您可能想改为使用元组。 –
为什么你想要它是不可变的?你希望获得什么? –