将列表转换为字符串的语义

jac*_*rdy 6 python list concatenation

许多编程语言(包括Python)都支持这样的操作:

", ".join(["1","2","3"])
Run Code Online (Sandbox Code Playgroud)

返回字符串

"1, 2, 3"
Run Code Online (Sandbox Code Playgroud)

我理解是这种情况,但是我不理解它背后的设计决策 - 当然join在列表上执行操作会在语义上更有效,如下所示:

["1","2","3"].join(", ")
Run Code Online (Sandbox Code Playgroud)

如果有人能够解释设计决定并对其有所了解,我会很感激.

编辑:看起来Javascript join在列表中有方法; 如果有人有特定语言遵循的惯例,请随意评论/回答有关该特定语言的选择.

mgi*_*son 3

对于Python,有一些反对的理由。首先,如果它是接受任意可迭代的字符串方法,那么您只需要支持join字符串对象上的该方法,它就会自动处理任何可迭代的对象。否则,自定义可迭代对象还需要支持join方法等。

考虑:

", ".join(["1","2","3"])
", ".join(("1","2","3"))
", ".join(str(x) for x in xrange(1,4))
", ".join({'1':None,'2':None,'3':None})
", ".join({'1','2','3'})  #set literal syntax -- python2.7+
", ".join("123")
Run Code Online (Sandbox Code Playgroud)

6 种不同的类型都可以通过一个方法简单地支持(我只接触过内置类型)。

其次,只有当列表中的所有内容都是类型时,才可以使用join列表basestring。在列表上提供一个方法似乎很愚蠢,如果您在包含错误内容的列表上使用它会引发异常——至少,这里的 API 看起来有点棘手(对我来说)。当然,您可能会争辩说,list.remove如果使用错误的参数调用,可能会引发异常。确实如此——但一般来说,您只是删除一个项目。它的运作水平低于join应有的水平。当然,这个论点比我提出的第一个论点弱,所以如果你不喜欢它,就回到论点 1 吧。