在不可变对象中修改可变对象的pythonic方法
Posted
技术标签:
【中文标题】在不可变对象中修改可变对象的pythonic方法【英文标题】:pythonic way of modifying a mutable inside an immutable 【发布时间】:2010-12-29 05:51:48 【问题描述】:假设我有一个类对外部世界表现为一个 int,但实际上它是一个可变对象,在多个结构中具有固定位置。如果 n 是我的对象,我现在可以通过写 n.update(34)
来更新它,但我发现我总是想改写 n = 34
。我浏览了http://docs.python.org/reference/datamodel.html,并没有看到任何类似于 __assign__ 或 __value__ 的属性,它可以让我捕获=
运算符并允许我更新我的对象而不是为变量 n 分配一个 int,抛出我的对象远离。更好的是,当一个可变对象位于元组 t = (m, n)
中时,我想用 t[1] = 34
更新我的可变对象,但 Python 认为这是在尝试修改不可变对象。
所以我猜答案是,根据我能够理解的那份文档的一小部分,我正在尝试的不是 Pythonic。所以如果我不能按照我想要的方式去做,那么下一个最好的事情是什么?这样,如果有一天有人必须维护我的代码,它就不会过于冒犯。
【问题讨论】:
【参考方案1】:您的基本obj.value = newvalue
基本上是最好、最容易理解的方式。正如您所猜测的,在 Python 中无法覆盖赋值。
您可以在您的班级上实现__call__()
来完成作业,这样您就可以只做obj(newvalue)
。但是,对于不经意的读者来说,根本不清楚这是重新分配。
另一个想法是实现__ilshift__()
,这样你就可以做到obj <<= newval
。如果你足够用力地眯着眼睛,那至少看起来像是某种突变体重新分配操作。如果它不是数字类型,我可能会考虑它。但是<<
与int
具有明确定义的含义,并且由于您伪装成该类型,恕我直言,以这种方式使用它会令人困惑。
【讨论】:
感谢您提出的想法,以及对我对这些概念的有限理解的改进。我暂时不考虑代码,因为我还有真正的工作要做,但是当需要更新时,我会做出决定。以上是关于在不可变对象中修改可变对象的pythonic方法的主要内容,如果未能解决你的问题,请参考以下文章