2010-05-15 2 views
3

이 질문은 this question보고에서 온 : 그것은 (튜플 같은) 반복 가능 객체 고정 번호로 2 개의 인수를 취하는 함수를보고 내 제일 싫어 하는게 중 하나를되었거나 있어 개인적으로두 개 이상의 iterables를 사용하는 Python 함수를 좋아하지 않습니다. 좋은 생각입니까?

def fringe8((px, py), (x1, y1, x2, y2)): 

두 개 더 많은 사전 (Shotgun API처럼). 모든 자세한 정보 및 이중 괄호 첨부 인클로저 때문에 사용하기가 어렵습니다.

>>> class Point(object): 
...  def __init__(self, x, y): 
...   self.x = x 
...   self.y = y 
...  
>>> class Rect(object): 
...  def __init__(self, x1, y1, x2, y2): 
...   self.x1 = x1 
...   self.y1 = y1 
...   self.x2 = x2 
...   self.y2 = y2 
...  
>>> def fringe8(point, rect): 
...  # ... 
... 
>>> 
>>> point = Point(2, 2) 
>>> rect = Rect(1, 1, 3, 3) 
>>> 
>>> fringe8(point, rect) 

두 개 이상의 반복 가능한 인수를 복용하는 것은 정당화 상황이 있습니까 :

이 더 좋지 않을까요? 분명히 표준 인 itertools 파이썬 라이브러리가 필요하지만, 유지 보수가 용이하고 유연한 코드 설계에서 꽤 잘 보이지 않습니다. 귀도는 그것을 설계 오류, 또는 적어도 부당한 합병증을 고려 의미 -

답변

7

풀기를 가진 def 구문,

def fringe8((px, py), (x1, y1, x2, y2)): 

처럼 파이썬 3에서 사라졌습니다. 명명 된 튜플은 사용자가 제안하는 명확한 목적을 위해 특수 목적의 클래스보다 훨씬 우수 할 수 있습니다.

그러나 여러 개의 반복 가능한 인수를 사용하는 함수는 완벽하게 훌륭합니다. itertools 물론 응용 프로그램에 필요할 수있는 모든 다중 반복 조작을 캡슐화 할 수는 없습니다. iterable을 "스트림"(무제한 스트림)으로 생각하면 여러 스트림을 하나로 병합하려는 방대한 방법이 있습니다 (예 : 정렬 된 것으로 알려진 스트림을 생각하고 당신은 복제물의 제거 여부와 상관없이, 또는 노조의 교차로를 만들 수 있습니다.

함수 서명 당 하나 이상의 반복 가능 항목에 대한 완벽하게 임의적 인 금지 명령을 따르기 위해 왜 API의 설계를 왜곡해야합니까?!

+0

아 좋다! 그래서 파이썬 3이 널리 적용될 때 더 이상 저에게 문제가되지 않을 것입니다. 그건 아주 좋은거야. –

+0

@Xavier, right : "self-unpacked"튜플 args는 결코 파이썬 3에서는 사용되지 않습니다.하지만 다른 문제는 Py3에서 반복적 인 "views"로 강화됩니다! -) –

+0

@Alex, iterable "views"? 좀 더 힌트를 줄 수 있니? –

1

저는 사람들이 목록과 사전을 데이터 구조로 과다 사용하는 경향이 있다고 생각합니다. 클래스를 정의하거나 생성자를 다루는 작업이 필요없는 데이터를 그룹화하는 간단한 방법이라고 생각합니다. 그러나이 데이터로 더 많은 작업을 시작하면 목록에서 2 번째이고 5 번째 데이터가 어떤 것인지 기억하기 어렵습니다. 클래스를 만들면 사물을보다 명확하게 정의 할 수 있으며 데이터 구조에서 직접 작동하는 함수를 분류 할 수 있습니다.

여러 개의 iterable을 가지고 있다고 생각하는 반면 여기서는 문제가 아닙니다. 일부 함수는 실제로 여러 목록을 필요로합니다 (내장 된 zip 참조). 그러나 당신이 준 예제는 튜플이 더 사용하기 쉽기 때문에 사용되는 경우라고 생각하지만 명확하지 않을 수 있습니다.

관련 문제