1
lithiumii 2019-04-25 15:27:27 +08:00 2
前两天刚有人水了一贴
https://www.v2ex.com/t/557286 |
2
shintendo 2019-04-25 15:31:35 +08:00 2
因为对世界本质的洞察
|
3
mimzy 2019-04-25 15:44:57 +08:00
1. 一种选择而已,避免你拿到一个对象去猜它到底是 .len() .length() 还是 .size()
2. 在 CPython 中 len() 对于内置类型会读取 ob_size 字段而不是调用 __len__ 方法,更快 具体参见 Fluent Python 英文版第 14 页 |
4
lihongjie0209 2019-04-25 15:48:12 +08:00
|
5
shuax 2019-04-25 15:54:40 +08:00
代码可以短一个字节
|
6
wwqgtxx 2019-04-25 16:37:39 +08:00 via iPhone
@lihongjie0209 自动补全?你都不知道你一个函数传进来的会是什么类型,怎么自动补全?( type annotation 是 py3 才支持的,而且仅仅是个标记,也不是什么强验证)
|
7
karllynn 2019-04-25 16:37:48 +08:00
无所谓吧,go 不也是内置函数
|
8
lihongjie0209 2019-04-25 17:26:54 +08:00 1
@wwqgtxx 你怕是用的假的 IDE 吧
|
9
youngce 2019-04-25 17:32:26 +08:00 1
1. 假如有人给一个对象自定义了一个方法叫 XXX.len()
2. 上面这种情况,你不知道返回的数据类型会是什么,因为任何人都可以定义一个类似的接口,并给你返回一些让你意想不到的返回值。 3. 这样看来 len(XXX)返回一个 int 是不是方便快捷 |
10
wwqgtxx 2019-04-25 17:58:27 +08:00 via iPhone 1
|
11
iorilu 2019-04-25 20:43:15 +08:00
其实就是定一个标准
所谓的 magic 方法, 我理解就是定一个内部标准 只要支持取长度的, 开发人员默认加一个__len__, 调用的人比较方便, 不需要查到底是什么方法 |
12
lihongjie0209 2019-04-25 20:48:32 +08:00
@wwqgtxx 你觉得在这个问题上用 python 内置的 len ()可以解决?
|
13
lhx2008 2019-04-25 20:59:53 +08:00
我有一个想法,就是作者的灵感来自操作符重载,如果把 len 看成一个操作符(内置关键字),或许你就可以理解了。
|
14
iamxiaoq 2019-04-25 21:06:47 +08:00 via Android
同意楼上,把 len 看作求一个对象长度的运算符,这样只要实现了__len__就相当于重载了这样一个求长度的运算符。不是函数的角度,而是运算符。
|
15
Cbdy 2019-04-25 21:38:17 +08:00 via Android
不好的设计,历史遗留问题,没有必要强行解释
|
16
Vegetable 2019-04-25 21:45:25 +08:00
没谁逼着用吧?我有的时候不喜欢用 str()也会用.__str__()
len()/str()/int()这样我觉得挺好的 |
17
1iuh 2019-04-25 22:11:51 +08:00
就是一个标准,一个共识, 你 len()一个对象,一定会得到它长度。 大家都遵循这个共识,就不用去猜是 a.length、a.len 、还是 a.len(), a.length() 。 至于 IDE 能不能补全,不是设计语言的人会去考虑的东西。
|
18
1iuh 2019-04-25 22:15:49 +08:00
如果不愿意遵循这个共识,python 也没拦着你去实现 a.length a.len a.len() a.length() 。
|
19
huangzhe8263 2019-04-25 22:27:49 +08:00
|
20
MonoLogueChi 2019-04-25 22:34:50 +08:00 via Android
@youngce 给一个返回值是确定的,如果返回值不确定,编译通不过的
|
21
msg7086 2019-04-25 22:43:04 +08:00
有洁癖可以去用 Ruby ……
|
22
Dvel 2019-04-25 23:28:51 +08:00
|
23
lihongjie0209 2019-04-26 08:58:17 +08:00
@huangzhe8263 你怎么保证它传给你的对象支持 len ?你又没有静态检查
|
24
chinesehuazhou 2019-04-26 10:16:18 +08:00 via Android
@lithiumii 那篇帖是我发的,没想到才几天就有人问。不过,这里的回复,相比起来,友善的、有理性的多些。(目前来看)
|
25
kuangwinnie 2019-04-26 12:12:54 +08:00
我感觉这个是个特别特别特别好的设计
并没有必要分清 size(), .length, .length() 这种结构啊。。。 如果你需要弄清一个有长度的东西,那就直接 len() 非常符合 py 本身的哲学。 |
26
Arnie97 2019-04-26 14:23:38 +08:00 via Android
从设计者的角度来看,可以类比做 sizeof 单目运算符,然后为了跟其他运算符的调用规范保持一致。
当然,这一设计是否比后缀形式更好就是另一个话题了。我个人认为后缀 /管道一类的设计减少了括号嵌套,语序符合实际执行顺序,有利于可读性;但是,你不能指着一门 1991 年发布的语言,问他的调用规范为什么没有学 1995 年的 Java 和,1995 年的 Ruby 和 1998 年的 C++。 |
27
mizuku 2019-04-27 14:26:59 +08:00
这是 Python 哲学的一部分.不然就到处都是 getLength,setLength 了
|