빈 기능이 필요한 이유


9

나는 파이썬을 배우기 시작했고 프로그래밍 언어에서 빈 함수가 필요한지 궁금 합니다.

예를 들어 파이썬에서 :

def empty_func():
    pass

쉘 스크립트에서도 빈 함수 빈 함수를 사용할 수 있습니다.

나의 이해와 질문 :

  1. 프로그래밍 언어에 빈 함수가 필요한 이유는 무엇입니까? 프로그래밍 언어를 가지고 놀거나 정말 중요한 다른 것이 있습니까?

  2. 이것이 목적이 있다면 누구나 유스 케이스를 설명하거나 빈 함수 사용법의 실제 예를 제시 할 수 있습니까?

  3. 아니면 빈 함수를 허용하는 프로그래밍 언어의 전통이 있습니까?


편집 (당신의 답변을 읽은 것) :

  • 스케치 알고리즘 또는 추상 함수
  • 별도의 조치없이 양식을 제출해야합니다
  • 일부 필수 작업 자리 표시 자

1
프로그램 실행에서 찾거나 사용하려는 경우 STUBS로 사용할 수 있지만이를 통해 변경하려는 것은 없습니다.
G.Rassovsky

답변:


5

Bourne 제품군의 쉘 언어 :에서 전혀 수행하지 않는 명령은 일반적으로 두 가지 상황에서 사용됩니다.

  • 무언가가 필수 명령을 요구할 때의 자리 표시 자

    while some_condtion
    do :
    done
    

    이후는 do적어도 하나 개의 명령을 필요로한다.

  • 인수를 폐기하지만 인수 목록 내에서 부작용을 수행하는 경우

    : ${myvar=foo}

쉘 전문가가 알고있는 다른 응용 프로그램이있을 것이라고 확신합니다. :)

파이썬 (및 다른 언어)에서는 덜 자주 사용됩니다. 실제로 아무것도하고 싶지 않을 때 고차 함수에 대한 인수 역할을 할 수 있습니다. 예를 들어, 양식을 제출하고 제출이 완료된 후 함수를 비동기 적으로 호출 할 수있는 함수가 있다고 가정하십시오.

def submit(callback=empty_func):
    ...

이 방법을 callback제공하지 않으면 제출은 계속 진행되지만 추가 조치는 수행되지 않습니다. None기본값으로 사용한 경우 None코드에 혼란을 추가 하여 콜백이 있는지 여부를 명시 적으로 확인해야합니다 .


1

개발주기의 위치에 따라 다르지만 때로는 알고리즘을 스케치 할 때 복잡한 블록을 즉시 구현하지 않고 추상화하려는 경우가 있습니다.

def full_algo():
  init_stuff()
  process_stuff()
  ...

init_stuff작동 방식 을 알고 있지만 머리가 다소 간단하지만 실제로는 필요하지 않으므로 빈 함수로 선언하십시오. 그것은 당신의 코드가 까다로운 세부 사항을 신경 쓰지 않고 컴파일하고 실행할 수있게합니다.

출시 된 응용 프로그램의 또 다른 용도는 상속을 사용할 때입니다. 플랫폼 특정 코드의 동작을 정의하는 큰 클래스가 있다고 가정하십시오. 다음과 유사한 논리로 끝날 수 있습니다.

init_filesystem();
access_files();
release_filesystem();

이 코드는 많은 플랫폼에서 작동하지만 일부 플랫폼에서는 파일 시스템 초기화가 필요하지 않을 수 있습니다. 그런 다음 상속은 다음과 같이 보입니다 (C ++에서 = 0 인 가상은 파생 클래스가 해당 메소드를 구현해야 함을 의미합니다).

class FileSystem{
  virtual void init_filesystem() = 0;
  virtual void access_files() = 0;
  virtual void release_filesystem() = 0;
};

그런 다음이 클래스 (인터페이스)의 특정 구현은 해당 메소드 중 일부에 대해 아무 것도 수행하지 않을 수 있습니다. 또는 기본 클래스는 가상 선언 대신 초기화 / 릴리스에 대해 빈 메소드를 선언 할 수 있습니다.

마지막으로 (그리고 부끄러운 일) 때로는 아주 오래된 응용 프로그램을 유지 관리합니다. 방법을 삭제하면 문제가 발생하기를 두려워합니다. 올바르게 상속되지 않은 복잡한 상속이 있거나 많은 함수 포인터 (콜백)가있는 경우 발생합니다. 내부 코드를 삭제하면 아무 것도 깨지 않고 호출됩니다.


0

Rufflewind는 완성 된 프로그램에서 빈 기능을 사용할 수있을 때 잘 다루었습니다. 내 경험상, 그것은 완성되지 않은 프로그램에서 더 자주 사용되는 경향이 있으므로 실제로 무엇을 작성할 것인지 계획하고 실제로 구현할 때까지 컴파일 할 수 있습니다. 다시 말해 일반적으로 자리 표시 자일뿐입니다.

파이썬의 경우 괄호를 사용하는 C와 같은 언어와 달리 들여 쓰기를 사용하여 블록을 표시하기 때문에 필요합니다 {}. 즉,이없는 경우 pass파서는 비워 두어야하는지 또는 잊었는지 알 수 없습니다. 포함 pass하면 구문 분석기가 훨씬 단순 해지고 구현되지 않은 블록을 찾을 때 검색하기 편리한 단어를 제공합니다.


1
완료되지 않은 코드의 경우 NotImplementedError"오류가 자동으로 전달되지 않아야합니다"라는 오류가 발생하므로 라이브 프로그램에서 구현되지 않은 함수를 호출하는 것이 오류이므로 던지기 가 더 적합한 솔루션입니다.
ivan_pozdeev

조건에 따라서. 배송 코드는 그렇습니다. 그러나 코드가 한 시간 안에 구현 될 것으로 예상하고 단위 테스트를 수행하는 동안 구현되지 않은 상태로 두는 경우 구현을 그대로 두는 것이 더 나은 옵션 일 수 있습니다. 종종 내 워크 플로는 1) 쓰기 스터브 방법 pass 2) 쓰기 값을 테스트하는 쓰기 단위 테스트 3) 테스트 실패 확인 (메소드가 정의되지 않은 결과를 반환 함) 4) 구현 방법 5) 테스트 통과 확인
로봇 고트

0

파이썬에서 기대할 수있는 것은 아니지만, 장치 드라이버 세계에서는 빈 함수를 제공하거나 (a) 발생하지 않을 것으로 알고 있거나 ( b) 아무리 신경 쓰지 않아도됩니다.

콜백이있는 C에서도 이것을 볼 수 있습니다. 때로는 콜백을 제공했다고 가정하고 널 포인터의 위험을 무시하고 콜백을 시도하는 코드가 표시됩니다. 이 경우 빈 콜백 루틴을 제공하기 만하면됩니다. (예, 특정 공급 업체를 염두에두고 있습니다.)


pass코드를 작성할 때, 특히 클래스에서 모든 것이 완료되기 전에 실행 가능한 것을 원할 때 자리 표시 자로 많이 사용 했습니다. 실제로 파이썬은에 해당 {}합니다. 중괄호를 사용하지 않기 때문에 파이썬은 할 수 없습니다. 그런 의미에서 내가 아는 모든 언어는 이것을 허용합니다. 단지 몇 사람 만이 python키워드를 요구한다는 것입니다. 심지어 조립 일로 돌아와서도 NOP.
로봇

@StevenBurnap, 일반적으로 그런 일을 할 때 printf ( ">>> 루틴 XXX라는 \ n")의 로컬에 해당하는 것을 포함합니다.
John R. Strohm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.