파이썬에서 값을 반환하는 함수의 이름을 어떻게 지정해야합니까?


13

파이썬 에서 함수의 이름을 선택하는 것에 대해 혼란 스럽습니다 . 때때로 파이썬 내장 함수는 function 및 string method 와 같이 필수적 입니다. 로 : 때때로 그들은 그러한없는 이름이 같은 긴급하지 않다 예를 들어, 그리고 하지 않습니다 .printfindlencalculate_lentypefind_type

나는 print우리가 사용하지 않는 (ie None) 값 을 반환하고 (예 : 화면에 문자열을 표시하는) 값 을 반환 하므로 그 이름이 필수적이라는 것을 이해할 수 있습니다 .

그러나 len우리가 사용하고 무언가를 수행하는 값을 반환합니다 (즉, 시퀀스 또는 매핑에있는 항목 수 계산). 이름은 중요 하지 않습니다 . 다른 한편으로, find문자열 메소드 (as len)는 우리가 사용하고 무언가를 수행하는 값을 반환하며 그 이름은 필수적 입니다.

이 질문을 한 것은 Caesar 암호를 사용하여 문자열을 암호화하고 해독하는 스크립트를 검토하는 것입니다. 검토자는 다음과 같이 말했습니다.

그냥 직감 : 기능은 일을합니다. 따라서 함수의 좋은 이름은 필수적 rotate_letter입니다 rotated_letter. 대신을 사용 합니다 .

rotated_letter숫자로 회전 된 문자를 나타내는 단일 문자 문자열을 반환합니다. 내가 사용, 더 나은 무엇인지 모른다 rotated_letter는 같은 값을 반환로 randint함수 임의 모듈 , 그것을하지 않습니다 generate_randint.

따라서이 경우 사용할 값을 반환하는 함수의 이름을 어떻게 지정해야합니까? 나는 이름을 확인해야합니다 필수적 아니면 그냥 명사 . 다른 경우는 같은, 그것을 수행하는 방법을 분명 부울 기능 등, is_even그리고 is_palindrome우리가 단지처럼을 예 / 아니오 질문 , 또한 기능 만 수행하고 반환이 아닌 사용 치 ( None등) print및 목록 방법 sort.


그것은 실제로 함수의 이름을 지정할 때 명령을 사용하는 매우 일반적인 관행입니다. 예를 들어, rotated_letter 함수의 회전 문자를 저장하는 변수의 이름을 어떻게 지정합니까?
JoulinRouge

그것은 당신의 예 중 일부를 생각하는 좋은 방법이 아닙니다. len예를 들어, "길이"로 생각하는 것이 좋습니다. 인수에 대한 메타 수준의 설명을 얻습니다.
Izkata

답변:


10

합리적이고 명사가 짧고 모호하지 않은 경우 동사를 사용하십시오.

대부분의 경우 함수는 (제외) 동사이어야하고 클래스, 변수 및 매개 변수는 명사 여야합니다. 를 사용하여 작성된 속성을 포함한 속성도 명사 여야합니다 @property. 부작용이있는 기능의 경우에 특히 그렇습니다. [1] 함수가 무언가를 반환한다면, 동사가 무언가를 추가하는지 아니면 그냥 "잡음"인지 평가해야합니다

  • make_list(foo)vs. list(foo): 명사가 동사보다 읽기 쉽습니다. 또한 list실제로 클래스이며 클래스는 명사 여야합니다.
  • open(foo)vs. file(foo): 동사는 명사보다 읽기 쉽고 명사보다 동사에 "옵션"을 부여하는 것이 더 낫기 때문에 명사는 Python 3에서 제거되었습니다 open(). 유일한 "표준"[2] 방식 Python 3에서 파일 객체를 만드는 방법
  • foo.get_bar()vs. foo.bar()vs. foo.bar( 두 명사 라고 가정 foo하고 bar) 첫 번째 옵션은 "get"이 우리가 아직 모르는 것을 추가하지 않기 때문에 옳습니다. 두 번째는 bar밖으로 나가는 foo것이 비용이 많이 드는 작업이거나 부작용을 일으키는 Bar(foo)경우 Bar에 적합합니다 (클래스 인지 고려할 수도 있음 ). 세 번째는 부작용이없는 저렴한 운영이고 , 대체 구현으로 인해 비용이 많이 들지 않을 경우에 적합합니다 .
  • xs.sort()vs. sorted(xs)if xs가 목록 인 경우 : 첫 번째는 필수입니다. 목록을 정렬하십시오. 리스트를 제자리에서 수정하고 아무것도 리턴하지 않습니다. 두 번째는 선언적입니다. 정렬 된 목록으로, 정확히 반환되는 목록입니다. 둘 다 동사입니다.

[1] : 값을 반환하고 부작용이있는 것은 상호 결합 할만한 설득력있는 디자인 이유가없는 한 상호 배타적입니다. 따라서 부작용이있는 함수는 아마도 아무것도 반환하지 않아야하므로 명사로 만드는 것은 거의 의미가 없습니다.
[2] : io모듈에는 파일 버퍼링, 자동 텍스트 인코딩 / 디코딩 등을 추가하거나 제거하는 데 사용할 수있는 약간 낮은 수준의 작업 이 있으며 개체 지향 클래스이므로 명사입니다. 대부분의 사용자는 이러한 것들을 직접 가지고 놀 필요가 없습니다. 대신 open()적절한 클래스를 선택하고 자동으로 인스턴스화합니다.


감사합니다! 에서는 " foo.get_bar() vs.` foo.bar () '대 foo.bar' 사이의 차이가 무엇 번째세 번째 ?
Mahmood Muhammad Nageeb

세 번째는 속성 또는 기본 속성입니다. 두 번째는 방법입니다.
케빈

따라서 내가 이해한다면 rotated_letter명령을하지 않고 선언적으로 유지하는 것이 적절 합니까?
Mahmood Muhammad Nageeb

이 경우 letter컨텍스트에 의해 암시 되는지 확실하지 않습니다 .
Kevin

+1 list은 수업입니다
Dušan Maďar

0

rotated_letter방법처럼 보이지 않습니다. 속성처럼 보입니다. 첫 번째 아이디어는 다음과 같습니다.

var letter = caesar.rotated_letter

기대 letterString 형의 값이 아닌 기능을 포함 할 수 있습니다. 거기에서 다음과 같은 다른 이름을 선택했습니다.

def rotate_letter(self):
    pass

또는 대신 속성을 사용하십시오.

@property
def rotated_letter(self):
    return self.whatever

len그리고 type다른 이름이 될 것이기 때문에 긴 입력하는 것으로 같은 이름이 지정됩니다. 그것들은 많이 사용되며 모든 파이썬 프로그래머가 어쨌든 배우게 될 핵심 파이썬 함수의 특별한 상태를 가지고 있으며, 타사 라이브러리의 이름보다 훨씬 관련성이 없습니다.

len특히, 당신이하지 말아야 할 것의 좋은 예입니다 귀하의 코드 : 당신이 같은 전체 이름을 사용할 것으로 예상하고 있습니다 length(짧은 형식이 매우 인기가 같은 경우를 제외하고 max같은 동사를) 사용할 compute_length. 아니면 속성을 수 : len([1, 5, 6])됩니다 [1, 5, 6].length. 예를 들어, C #에서는 다음 형식이 사용됩니다 new [] { ... }.Length.

역사적 이유도있을 수 있습니다 len. C #과 같은 다른 언어가 선호 되는 방법 Count이며 일반적 으로 방법입니다 (행동이 .NET Framework를 통해 일관성이 없지만). Count동사는 직관적이므로 직관적으로 메소드로 호출하는 경향이 있습니다.

값 반환 또는 작업 수행

함수는 항상 작업을 수행해야합니다. 간신히 값을 반환하면 속성이어야합니다. 다음과 같은 경우 함수가 속성으로 변환되어야한다는 힌트가 있습니다.

  • 이 함수에는 거의 return ...문장이 없습니다.

  • 자연스럽게 당신의 마음 속에 나오는 함수의 이름 get_something은입니다 product.get_price().

이제 함수가 있다면 네 가지 유형 중 하나 일 수 있습니다.

  • 순수 할 수 있습니다. 즉 환경에 영향을주지 않으면 서 값을 반환합니다. 예 : road.measure_distance().

  • 아무것도 반환하지 않고 환경에 영향을 줄 수 있습니다. 예 : product_database.remove_record(1234).

  • 환경에 영향을 미치고 값을 반환 할 수 있습니다. 예 : value.increment()과 같은 사용 value++.

  • 아무것도 할 수없고 아무것도 반환 할 수 없습니다. 예 : time.sleep(1).

이름이 함수 유형에 대한 강력한 힌트를 줄 수있는 경우는 거의 없지만 대부분의 경우 이름에서 거의 유형을 알 수 없습니다.


나는 대답이 "예"라고 가정하지만, 반드시 물어봐야합니다. 파이썬의 관점에서 전적으로 대답하고 있습니까? 다른 언어에서는 기능과 속성의 분리가 항상 사실이 아니기 때문에; 함수가 "조치를 수행해야"한다는 것도 사실은 아닙니다. 이것이 파이썬의 규칙입니까? (나는 Python을 작성하지만 모든 PEP를 읽지는 않았으며 확실히 전문가는 아닙니다. BTW를 공감하지 않았습니다).
Andres F.

@AndresF .: 나는 파이썬의 관점에서 대답하고 있습니다. 속성이 존재하지 않는 Java와 같은 언어에서 getSomethingsetSomething대신 속성의 사용 일반적인 이름입니다.
Arseni Mourzenko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.