![](/img/trans.png)
[英]How does one make a [list].append function with input() [PYTHON 3]
[英]In python, how does one make an input parameter to function immutable?
假设我们有一个函数:
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
应该抛出错误 我们如何实现这种类型的错误检查?
以下是我最好的尝试,但它不起作用。 字符串 "howdy" 最终仍然被附加到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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.