Pythonの結合は、結合するアイテムではなく、設計上の理由から、RubyやSmalltalkと比較してシンボルに焦点を当てているようです。


9

OOPの基礎の1つは、私たちが処理したい項目であるオブジェクトを持っていること、そしてそれらにメッセージを送信することだと思いました。

したがって、当然のことながら、アイテムのコレクションがあり、それらを1つの文字列に入れる必要があるため、次のようにします。

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

(Smalltalkも同じ方法です)。これ" | "は、何らかの方法で、それを結合する方法の1つのトークンとしての議論と考えられています。それはすることができ" "、ゲームボードを簡素にする場合、あまりにも。したがって、結合要素" | "は、特に私たちが関心を持っているものではありません。特に重要または重要なのは、プログラムの主要なオブジェクトではありません。

Pythonがそれを使用する場合

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

何かについて議論をするために、私たちが議論にメッセージを渡しているように感じるのは、少し奇妙に感じます。多分Pythonはもっと手続き的ですか?参加する文字列に私たちに何らかの義務を果たすように伝えるには?

実装を保存して、joinコレクションクラスごとにを定義する必要がないようにするのですか?しかし、Rubyなどの任意のコレクションクラスに対して1回だけ記述することもできるというのは本当ではありません。

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

(このようなものは、to_s各項目を呼び出しto_s、各クラスのに依存して独自の適切な処理を実行し、文字列に変換してから、それらを連結します)。そのため、文字列、ハッシュ、セットのそれぞれ、または私たちが持っているあらゆるコレクションクラスを実装する必要はありません。

または、Pythonは正しくOOPルートになりませんか?これは、使用len("abc")してtype([])の代わりに、"abc".len()または[].type()さえのpython3でもそれはそうです。Pythonは設計上の理由でこのようにしていますか?


7
以下からのPythonの禅:「それを行うには選ぶ-および好ましくはただ1 --obviousの方法があるはずその方法は、あなたがない限りしているオランダの最初は明白ではないかもしれないが。。」
kdgregory 2015

2
1つの形式では、コレクションはそれ自体を区切り文字付きの文字列に変換する方法を知っています。もう1つの形式では、文字列はそれ自体を区切り文字として使用してコレクションを連結する方法を知っています。どちらもオブジェクト指向ですが、動詞の主語と目的語を変更します。
kdgregory 2015

Maybe Python is more procedural?Pythonは、いくつかの機能が追加された手続き型言語でした(「Pythonはラムダ、reduce()、filter()、map()を取得しました。バージョンをどこかで見逃して作業パッチを提出したLispハッカーの好意により)」。 2.それが最初に取り組まれてから約10年半。

1
そして今日でも、PythonはOOP言語になることすら試みておらず、完全にマルチパラダイムです。

C ++と同様に、PythonはOOPを可能にする言語です。これは、JavaやSmalltalkのようなOOP言語と同じではありません。
Gort the Robot、2015

回答:


9

Pythonのjoinは、あらゆる反復可能オブジェクトで機能するように設計されています。これは、設計者が配置する場所を決定する必要があったことを意味します。リストだけでなく、常に(セパレータ)を必要とし、文字列を返すため、文字列型の一部にすることにしました。

アーミン・ロナッチャーは私よりも良いと言います:

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

「Pythonがそのように機能しないことを想像してください。イテラブルを実際のリストに変換してから文字列に変換する必要があります。Rubyの人々は、Rubyがこの問題をモジュールで混合することで解決すると主張します。オプションですが、これは多くの影響を与える言語での意識的な設計上の決定です。Pythonは、実際の実装が他の場所にある可能性がある場所でこれらのプロトコルを使用することにより、疎結合を促進します。文字列に。」


1
OPはmodule Enumerateセクションでこれに対処しようとしますが、Pythonはそのように機能しません。このメソッドを配置できるすべてのイテレータに単一のスーパークラスはありません。

私もRuby 2.0で試してみましたがHashString実際にはスーパークラスとしてのコレクションクラスはありません...それらのスーパークラスはただObjectです。したがって、これらの2つのクラスは、列挙型ミックスインに依存しています...私が理解しているように、コレクションの一連の動作を可能にするインターフェイスのようなもの
非極性

つまり、「反復可能」が実際のコードを持つクラスや何かではなく、アヒルのタイピングパターンであるという事実の制限です。あるいは、Pythonが同じ実装で任意のコレクションを操作できるように一般的になりたいと思ったからです(他の多くの標準ライブラリは、実際にそのコレクションに適用される場合、コレクションごとにそれを実装するだけです)。
Kat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.