用Python冻结?

发布于 2021-01-29 16:08:12

我已经用Python编程了一段时间,最近才开始在工作中使用Ruby。语言非常相似。但是,我刚刚遇到了一个不知道如何在Python中复制的Ruby功能。这是Ruby的freeze方法。

irb(main):001:0> a = [1,2,3]
=> [1, 2, 3]
irb(main):002:0> a[1] = 'chicken'
=> "chicken"
irb(main):003:0> a.freeze
=> [1, "chicken", 3]
irb(main):004:0> a[1] = 'tuna'
TypeError: can't modify frozen array
        from (irb):4:in `[]='
        from (irb):4

有没有办法在Python中模仿它?

编辑:我意识到我使这看起来似乎只用于列表;在Ruby中,freeze是一种方法,Object因此您可以使任何对象不可变。对此我感到抱歉。

关注者
0
被浏览
43
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以总是子类化list并添加“冻结”标志,该标志将阻止__setitem__执行任何操作:

    class freezablelist(list):
        def __init__(self,*args,**kwargs):
            list.__init__(self, *args)
            self.frozen = kwargs.get('frozen', False)
    
        def __setitem__(self, i, y):
            if self.frozen:
                raise TypeError("can't modify frozen list")
            return list.__setitem__(self, i, y)
    
        def __setslice__(self, i, j, y):
            if self.frozen:
                raise TypeError("can't modify frozen list")
            return list.__setslice__(self, i, j, y)
    
        def freeze(self):
            self.frozen = True
    
        def thaw(self):
            self.frozen = False
    

    然后玩:

    >>> from freeze import freezablelist as fl
    >>> a = fl([1,2,3])
    >>> a[1] = 'chicken'
    >>> a.freeze()
    >>> a[1] = 'tuna'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "freeze.py", line 10, in __setitem__
        raise TypeError("can't modify frozen list")
    TypeError: can't modify frozen list
    >>> a[1:1] = 'tuna'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "freeze.py", line 16, in __setslice__
        raise TypeError("can't modify frozen list")
    TypeError: can't modify frozen list
    >>>
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看