파이썬의 조인은 조인 할 항목이 아니라 루비 또는 스몰 토크와 비교할 때 디자인상의 이유로 심볼에 집중하는 것 같습니다.


9

OOP의 초석 중 하나는 우리가 다루고 싶은 아이템 인 객체가 있고 메시지를 보낸다는 것입니다.

따라서 항목 모음이 있고 하나의 문자열에 넣어야한다는 것이 당연한 것처럼 보일 수 있습니다.

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

(Smalltalk는 동일한 방식으로 수행합니다). 은 " | "어떤 방법이 인수를 결합하는 방법의 토큰 하나로서 생각입니다. 그것은 할 수 있습니다 " "게임 보드는 간단하는 경우도. 따라서 결합 요소 " | "는 특히 우리가 관심을 갖고있는 것이 아닙니다. 특히 중요하거나 중요한 프로그램의 주요 대상은 아닙니다.

파이썬이 그것을 사용한다면

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

무언가에 대해 논쟁을하기 위해 우리가 논쟁에 메시지를 전달하는 것처럼 느껴지는 것은 다소 이상하게 느껴집니다. 아마도 파이썬이 더 절차 적입니까? 결합 문자열이 우리에게 어떤 의무를 수행하도록 지시하려면?

우리가 가지고있는 join각 컬렉션 클래스에 대해 정의 할 필요가 없도록 구현을 저장 해야합니까? 그러나 루비에서와 같이 컬렉션 클래스에 대해 한 번만 쓸 수 있다는 것은 사실이 아닙니다.

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 또는 우리가 가진 컬렉션 클래스에 대해 구현할 필요가 없습니다.

아니면 파이썬이 OOP 경로를 따르지 않습니까? 그것은 사용 len("abc")하고 type([])대신 "abc".len()또는 [].type()심지어 Python3도 보인다에서. 파이썬은 디자인상의 이유로 이런 식으로합니까?


7
에서 파이썬의 선 : "그것을 할 one-- 바람직 하나 --obvious 방법이 있어야 그런 식으로는하지 않는있는 거 네덜란드 처음에는 명확하지 않을 수 있지만.."
kdgregory

2
한 형식에서 컬렉션은 구분 기호가있는 문자열로 자신을 변환하는 방법을 알고 있고 다른 문자열은 자체를 구분 기호로 사용하여 컬렉션을 연결하는 방법을 알고 있습니다. 둘 다 객체 지향적이지만 동사의 주제와 대상을 변경합니다.
kdgregory

Maybe Python is more procedural?파이썬은 버전에 어딘가에 나타날 때까지 몇 가지 기능적 추가 기능 ( "Python은 람다, reduce (), filter () 및 map (), Lisp 해커가이를 놓치고 작업 패치를 제출 한 예의)을 얻었습니다")을 추가 한 절차 적 언어였습니다. 2. 처음 작업 한 지 약 10 년 반이 지났습니다.

1
그리고 오늘날에도 파이썬은 OOP 언어가 되려고 노력하지도 않고 철저한 다중 패러다임입니다.

C ++과 마찬가지로 Python은 OOP를 허용하는 언어입니다. 이것은 Java 또는 Smalltalk와 같은 OOP 언어와 동일하지 않습니다.
로봇

답변:


9

파이썬의 조인 은 모든 iterable 에서 작동하도록 설계되었습니다 . 이것은 디자이너가 어디에 넣을지를 결정해야한다는 것을 의미합니다. 단순히 목록 이상으로 작동하지만 항상 (구분자) 가 필요 하고 문자열을 반환 하므로 문자열 유형의 일부로 만들기로 결정했습니다.

Armin Ronacher는 나보다 더 잘 말합니다.

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

"파이썬이 그런 식으로 작동하지 않는다고 상상해 보자. iterable을 실제리스트로 변환하여 문자열로 변환해야한다. 루비 사람들은 이제 루비가 모듈을 섞어서이 문제를 해결했다고 주장 할 것이다. 파이썬은 실제 구현을 다른 곳에 구현할 수있는 이러한 프로토콜을 사용함으로써 느슨한 결합을 장려합니다. 하나의 객체는 반복 가능하고 시스템의 다른 부분은 그것을 만드는 방법을 알고 있습니다. 문자열로. "


1
OP 종류의 module Enumerate섹션 에서이 문제를 해결하려고 시도 하지만 Python은 그런 식으로 작동하지 않습니다.이 방법을 넣을 수있는 모든 반복자에 대한 단일 수퍼 클래스는 없습니다.

내가 너무 루비 2.0에 시도 ... Hash그리고 String실제로 슈퍼 클래스와 같은 컬렉션 클래스가없는 ... 자신의 슈퍼 클래스는 단지입니다 Object. 따라서이 두 클래스는 Enumerable 믹스 인에 의존합니다 ... 컬렉션의 동작 집합을 허용하는 인터페이스와 같은 것으로 이해합니다
nonopolarity

"iterable"이 실제 코드를 가진 클래스 나 무언가가 아니라 오리 타이핑 패턴이라는 사실의 한계는 거의 없습니다. 또는 Python은 동일한 구현으로 모든 컬렉션에서 작업 할 수 있도록 일반화되기를 원했기 때문입니다 (다른 표준 라이브러리는 실제로 해당 컬렉션에 적용되는 경우 각 컬렉션에 대해 다른 많은 표준 라이브러리가 구현할 수 있음).
Kat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.