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


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와 같은 언어에서 getSomething와 setSomething대신 속성의 사용 일반적인 이름입니다.
— Arseni Mourzenko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.