其实我经常好奇一件事, 为什么 Python 得 dict 没有 set 方法, 有人知道什么历史原因吗
经常操作 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
好的, 比较底层得方法, 有空学习下
前端基本上属于不会,js 语法能看懂。 家里生意需要开发个系统用,后端不是问题,前端选什么好,最好能够比较好地兼容移动端。 如果有示例项目就好了。 兼容移动端 建议直接微信小…
各位大牛 谁有 ios 企业签名资源 价格便宜的 朋友公司现在有个 app ,ios 端用户在 5w 左右,每天安装量在 1000 左右,目前用的有点贵 还频繁掉签 或者有什么…
总是有很多很多人来问我对Rust语言怎么看的问题,在各种地方被at,其实,我不是很想表达我的想法。因为在不同的角度,你会看到不同的东西。编程语言这个东西,老实说很难评价,在学术…