经常操作 dict
d = {}
d['name'] ='tom'
d['age'] = 30

这样得代码, 其实我很想有一个 set 方法, 我觉得这样
比上面写法更好
而且 dict 明明有 get 方法, 有 set 很合理
而且还有个 setdefault 方法, 而且这个方法很容易混淆, 因为这个方法
主要作用是获取值, 并不是设置值得, 这个名字一看都不清楚什么意思
总的来说, 我认为应该有 set 方法
但 python 一直没有, 而且既然没有, 后面加上应该不会有任何不兼容
当然这么明显得事情 python 开发组不可能不知道, 那么到底是什么原因
不能放一个 set 方法呢

set 是 python 语言的关键词

我也觉得很合理。

python 语言本身的设计理念就是想一出是一出,很自由,没啥特殊原因,纯粹当时设计者拍脑袋觉得这样够用,后续也没啥大问题就不改了。

因为有 setitem 方法。提供 dict.get 方法是因为 getitem 在 key 不存在时会抛出异常。

.update() 啊 LZ 可以了解一下一个叫 UserDict 的东西。

get 是为了默认值 set 是为了啥? 因为你 java 先入为主的概念

不懂就问,d.set('name', 'tom')d['name'] = 'tom' 好在哪儿呢?

= 号作为分隔符更清晰

d.set('name', 'tom'),是把 name 给 tom 还是把 tom 给 name ?d['name'] = 'tom'这种方式没有这个二义性

真的会有歧义吗,好奇有哪个 API 设计类似方法的时候把 value 放在前面吗?

苹果的 OC 和 SWIFT 都是值在前面 KEY 在后面[dict setObject:@"value" forKey:@"key"]你如果经常在不同语言中穿梭,或者你只是想看看一个你不懂的语言的逻辑,没有二义性的体验真的好很多

不是吧? python 里 set 可以作为变量名、函数名用

get , set 相互匹配我如果用 get 取值, 然后用 set 赋值不是很合理吗比如count = p.get('count', 0)p.set('count', count+1)

这个世界本来就是不对等的。可以使用 p['count'] += 1

我也不知道为啥没有显式的 set ,但是你可以自己实现一个pythonimport ctypesclass PyType(ctypes.Structure): passclass PyObject(ctypes.Structure): Py_ssize_t = ( ctypes.c_int64 if ctypes.sizeof(ctypes.c_void_p) == 8 else ctypes.c_int32 ) _fields_ = [ ("ob_refcnt", Py_ssize_t), ("ob_type", ctypes.POINTER(PyType)), ]class PyTypeObject(PyObject): _fields_ = [ ("dict", ctypes.POINTER(PyObject)) ]def inject(class_, method, force=False): def _(function): name_, dict_ = class_.__name__, class_.__dict__ proxy_dict = PyTypeObject.from_address(id(dict_)) namespace = {} ctypes.pythonapi.PyDict_SetItem( ctypes.py_object(namespace), ctypes.py_object(name_), proxy_dict.dict ) if not force and namespace.get(name_, {}).get(method, None): raise RuntimeError(f"已存在方法 {class_.__name__}.{method}()") namespace[name_][method] = function return _(dict, 'set')def dict_set(d, key, value): d.update({key: value})a = {}a.set("name", "hello")print(a)

好在没有 d['name'] = 'tom'可读性强

贴个代码真费劲 gist.githubusercontent.com/bob-zebedy/3bc893f0faaac010792079c1abcd2365/raw/151da073bb7221aa8df99ef1f2d260cd904ee784/magic.py

说实话把, 我就是不喜欢方框号操作, 因为我习惯性得觉得方括号就是操作数组类似得东西主要是我觉得 pyhon 开发组可以加上 set 方法, 至于用不用是开发人员得事, 毕竟还有个 setdefault 呢, 实际上也没啥用, 还不是加上了

OP 并没有深刻理解 pythonic

好的, 比较底层得方法, 有空学习下