9

대부분의 기능은 쉽게 이름을 지정할 수 있습니다. 일반적으로 함수 이름은 함수 또는 생성되는 결과의 유형을 기반으로합니다.Python Generator 함수 이름 - 접두어가 도움이됩니까?

그러나 생성기 함수의 경우 결과는 다른 유형에 비해 반복 가능할 수 있습니다. 함수가 지정된 형식의 개체를 반환하지 않기 때문에

def sometype(iterable): 
    for x in iterable: 
     yield some_transformation(x) 

sometype 이름은 오해의 소지가 느낀다. 실제로는 sometype 이상의 iterable입니다.

iter_sometype 또는 gen_sometype과 같은 이름은 Hungarian Notation과 너무 비슷합니다. 그러나 그것은 또한 기능의 의도를 분명히하는 것으로 보인다.

더 많은 특수화 된 사례가 있는데, 접두어가 도움이 될 수 있습니다. 이들은 대표적인 예이며 일부는 itertools에서 볼 수 있습니다. 그러나 우리는 종종 알고리즘 복잡성이있는 버전을 작성하여 을 itertools과 비슷하게 만들지 만 완벽한 적합은 아닙니다.

def reduce_sometype(iterable): 
    summary = sometype() 
    for x in iterable: 
     if some_rule(x): 
      yield summary 
      summary= sometype() 
     summary.update(x) 

def map_sometype(iterable): 
    for x in iterable: 
     yield some_complex_mapping(x) 

def filter_sometype(iterable): 
    for x in iterable: 
     if some_complex_rule(x): 
       yield x 

iter_, map_, reduce_, filter_ 접두사는 발전기 함수의 이름을 명확히 도움이됩니까? 아니면 시각적으로 혼란 스럽습니까?

접두어가 도움이된다면 어떤 접두사 접두사가 있습니까?

접미사가 도움이된다면 어떤 접미사 제안이 있습니까?

+0

당신은 일반화 된 것 같아요. 대부분 제 2와 제 3의 함수를 제너레이터 식 ala'(iterable의 x에 대해 some_mapping (x))'로 직접 작성하는 것입니다. 첫 번째 것은 실제로'reduce '하지 않습니다. 맵핑과 비슷합니다. 각'x'에 새로운'sometype'이 있기 때문입니다. –

+1

@ THC4k : 더 복잡하다고 상상해보십시오.'itertools'에서 너무 쉽게 복잡해졌습니다. 그렇게 복잡한 것이 아니기 때문에 기본 함수 프로그래밍 원칙을 위반합니다. 예를 들어, 최적화로 많은 예비 설정 작업이 필요할 수 있습니다. –

답변

6

파이썬 dictsiter*입니다. 또한 lxml 트리에는 iter 메서드가 있습니다. 읽기

for node in doc.iter(): 

그렇게 그 패턴을 다음과 친숙한 것, 내가

for item in sometypes_iter(): 

파이썬은 sorted 기능을 제공, sometypes_iter 그래서 난 analgously 쓸 수 있다는 sometypes의 발전기를 명명 생각 하는데요. 그 패턴에 따라, 나는 동사 기능은 과거 시제 만들 수도 있습니다 :이 기능을 충분이있는 경우 메소드 이름이 reduce 단축 할 수 있도록, 그것은, mapSomeTypes 클래스를 만들기 위해 적합 할 수 있습니다

sometypes_reduced 
sometypes_mapped 
sometypes_filtered 

, 및 filter.

sometype 이외의 형식을 허용하거나 반환하도록 함수를 일반화 할 수있는 경우 함수 이름에서 sometype을 제거하고 대신 형식보다 강조하는 이름을 선택하는 것이 좋습니다.