繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM