其实我经常好奇一件事, 为什么 Python 得 dict 没有 set 方法, 有人知道什么历史原因吗

63 天前
 iorilu

经常操作 dict

d = {}
d['name'] ='tom'
d['age'] = 30

这样得代码, 其实我很想有一个 set 方法, 我觉得这样 比上面写法更好

而且 dict 明明有 get 方法, 有 set 很合理

而且还有个 setdefault 方法, 而且这个方法很容易混淆, 因为这个方法 主要作用是获取值, 并不是设置值得, 这个名字一看都不清楚什么意思

总的来说, 我认为应该有 set 方法

但 python 一直没有, 而且既然没有, 后面加上应该不会有任何不兼容

当然这么明显得事情 python 开发组不可能不知道, 那么到底是什么原因 不能放一个 set 方法呢

3175 次点击
所在节点    Python
27 条回复
guyeu
63 天前
set 关键字应该是正解,其次应该是 set 的含义在 dict 这个场景并不能很好地表达这个方法的目的。

dict 是键值对的集合,往集合里添加内容应该是 put 或 insert 。
julyclyde
63 天前
@DOLLOR 嗯我错了。不是保留关键词
是 built-in type
你如果用 set 做变量名,相当于覆盖了内置的 set 数据类型吧?
llsquaer
63 天前
setdefault 是设置默认值,如果有就不设置了。 你用这个取值?防御性编程啊。
e3c78a97e0f8
62 天前
[Zen of Python:]( https://peps.python.org/pep-0020/)

There should be one-- and preferably only one --obvious way to do it.

虽然 Python 开发者自己也经常搞出同一件事的几种做法,但是他们每次都能找到一堆理由。你这个做法完全是 style preference ,并不符合 Zen Of Python 。
sgld
61 天前
d['name'] = 'tom'

这个本身不就是调用的__setitem__ 嘛,所以为啥还需要再建立一个 set()方法再调这个方法呢?

存在这个方法才是真正的多此一举吧。就像 6 楼说的,get 方法是因为需要在不存在时返回默认值。否则直接[]取也是一样的。
sgld
61 天前
@iorilu Python 对序列取值就是用的[],你可能只是不习惯而已。就像取属性用的是 . 这个也对应了`__getattr__(self, name)`

你这单纯不习惯,不同语言有所不同很正常吧
woodfizky
61 天前
其实是有类似你说的方法的,但是是 magic method 。

d['key'] = 'value' 等同于 d.__setitem__('key', 'value')

字典主要是还有一个 update 方法,实际上就是遍历 key, value 去做__setitem__


确实有时候会给人一种设计上不一致的感觉:
value = d['key'] 也就是 value = d.__getitem__('key')
上面这种方括号用法有 KeyError 的风险,
d['key'] = 'value' 同样是方括号用法,同样是对应一个魔法方法,这个却不会有问题。
然后我换一种风格,用 d.get('key') 和 d.update(other_dict), 都不会出现 KeyError 。

字典 get 方法和__getitem__方法的逻辑并不一样,前者是默认取不到值取默认值,且默认值为 None ;后者取不到值直接报错,且不提供默认值参数。

不过仔细看看就知道了,get 方法是属于字典这种 python 中的 Mapping 类的,并不是直接对应__getitem__这种魔法方法的。通用类是并没有自带 get 和 set 这种方法的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1080237

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX