出于设计原因,与Ruby或Smalltalk相比,Python的连接似乎不关注连接的项目,而是关注符号。


9

我认为OOP的基础之一是,我们有对象,这是我们有兴趣处理的项目,然后我们向它们发送消息。

因此,看起来很自然,我有一组项目,并且需要将它们放入一个字符串中,因此可以这样做:

  ["x", "o", "o"].join(" | ")    # joining a tic-tac-toe row in Ruby

(Smalltalk的操作方式与此相同)。" | "在某种程度上,它被认为是一个参数,是如何加入的一个象征。它可以是" "也一样,如果游戏板是要简单。因此,联接元素" | "并不是我们特别感兴趣的东西,也不是程序中的主要对象具有特别的重要性或意义。

如果Python使用

  " | ".join(["x", "o", "o"])

确实感觉有点奇怪,几乎感觉就像我们在向论点传递消息,以告诉论点某些事情。也许Python更具程序性?告诉连接字符串为我们执行一些职责?

是否保存实现,以便我们不必join为每个集合类定义一个?但是我们是否也可以为任何集合类编写一次(例如在Ruby中)不是真的吗?

module Enumerable
  def my_join(joiner)
    self.inject {|a,b| a.to_s + joiner + b.to_s}
  end
end

(类似这样,调用to_s每个项目,依靠to_s每个类的做自己的事情,转换为字符串,然后将它们串联)。因此,我们不必为String,Hash或Set或我们拥有的任何集合类中的每一个实现。

还是Python出局不走OOP路线?它采用len("abc")type([])替代"abc".len()或者[].type()甚至在Python3也似乎。Python是出于设计原因这样做吗?


7
摘自《 Python的禅宗》:“应该有一种-最好只有一种-显而易见的方法。尽管起初除非您是荷兰人,否则这种方法可能并不明显。”
kdgregory

2
在一种形式中,集合知道如何使用定界符将其自身转换为字符串,在另一种形式中,字符串知道如何使用自身作为定界符来连接集合。它们都是面向对象的,但是会改变动词的主语和宾语。
kdgregory 2015年

Maybe Python is more procedural?Python是一种过程语言,具有一些功能上的附加功能(“ Python获得了lambda,reduce(),filter()和map(),这是由Lisp黑客提供的,他们错过了它们并提交了工作补丁”),直到在版本中出现某处为止2.首次投入使用大约十五年了。

1
甚至在今天,Python甚至都没有尝试成为一种OOP语言,它完全是多种范例。

像C ++一样,Python是允许OOP的语言。这与Java或Smalltalk之类的OOP语言不同。
弄死了机器人

Answers:


9

Python的join旨在处理任何可迭代的。这意味着设计师必须决定将其放置在何处。由于它不仅可用于列表,而且总是需要使用(分隔符)并返回字符串,因此他们决定将其作为字符串类型的一部分。

Armin Ronacher说的比我好:

http://lucumr.pocoo.org/2011/7/9/python-and-pola/#seemingly-inverse-logic

“想象一下Python不会那样工作。您必须先将iterable转换为实际列表,然后才能将其转换为字符串。Ruby人们现在认为Ruby通过混合模块解决了这一问题,他们肯定是正确的是一个选择,但这是一种有意义的设计决策,具有多种含义:Python通过在实际实现可以在其他地方使用这些协议来鼓励松散耦合。一个对象是可迭代的,系统中的另一部分知道如何实现它成字符串。”


1
OP尝试在本module Enumerate节中解决此问题,但是Python不能那样工作,对于所有可以将其放入此方法的迭代器,没有一个单一的超类。

我试图用Ruby 2.0太... HashString居然没有一个集合类作为超......他们的超只是Object。因此,这两个类仅依赖于具有Enumerable mixin ...据我了解,类似于接口的行为允许集合的行为集
nonopolarity

因此,“可迭代”不是类或带有实际代码的东西,而是鸭子输入模式的事实,这在很大程度上是一个局限性?另外,这仅仅是因为Python希望通用性强,以便能够在具有相同实现的任何集合上工作(而如果许多其他标准库实际上适用于该集合,则许多其他标准库只会为每个集合实现它)。
凯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.