Python에서 파일 끝에 함수 선언


94

먼저 완전히 정의하지 않고 함수를 호출 할 수 있습니까? 이것을 시도 할 때 " function_name is not defined" 오류가 발생 합니다. 나는 C ++ 배경에서 왔기 때문에이 문제는 나를 괴롭힌다.

작동하기 전에 함수 선언 :

def Kerma():
        return "energy / mass"    

print Kerma()

그러나 먼저 정의하지 않고 함수를 호출하려고하면 문제가 발생합니다.

print Kerma()

def Kerma():
    return "energy / mass"

C ++에서 함수 앞에 헤더를 배치하면 호출 후에 함수를 선언 할 수 있습니다.

여기에 뭔가 빠졌나요?


5
파이썬에는 "선언"이 없습니다. 정의가 있거나 (완전해야 함) 아무것도 없습니다.
S.Lott

2
당신은 "문제를 준다"고 말한다. 그것에 대해 자세히 설명해 주시겠습니까?
Martin Del Vecchio


궁금한 사람이있는 경우 :Kerma is an acronym for "kinetic energy released per unit mass"
anon

1
나는 이것이 매우 오래 .py되었다는 것을 알고 있지만 왜 아무도 기능을 별도의 파일에 넣고 가져 오는 것을 권장하지 않았 습니까? 의도하지 않은 결과가 있습니까?
카일

답변:


145

파이썬에서 일종의 관용적 인 방법은 다음과 같이 작성하는 것입니다.

def main():
    print Kerma()

def Kerma():
    return "energy / mass"    

if __name__ == '__main__':
    main()

이렇게하면 main마지막에 함수를 계속 호출하는 한 원하는 순서대로 코드를 작성할 수 있습니다 .


4
@Muhammad : 이것은 실행 가능한 접근 방식이지만 확실히 파이썬에서는 관용적이지 않습니다. 정반대로 대부분의 main기능은 일반적으로 끝에 배치됩니다.
Eli Bendersky

14
@Eli Bendersky : if __name__ == '__main__':스위치가 일반적인 관용적 부분 이라고 제출하겠습니다 .
S.Lott

2
@Eli : 관용적 부분은 끝에 if 절입니다. 모듈의 최상위 수준에는 코드가없고, 마지막에는 모듈이 main 인 경우 주 함수를 호출합니다 .
Ned Batchelder

1
@Eli : 관용적 인 부분은 if ... __main__':. 나는 main나머지 코드 위에를 배치해야 한다고 말하지 않았습니다 . 나는 중요한 부분이 _\_main__마지막에 부르는 것이라고 말했고, 그 정의를 어디에 두는지는 중요하지 않습니다.
Muhammad Alkarouri

2
if name == ' main ': 스위치를 사용하면 함수를 주문하는 방법과 관련이 없습니다. 그게 옳은 일 (TM)입니다.
MKesper

18

Python 모듈 (.py 파일)이 실행되면 그 안에있는 최상위 명령문이 나타나는 순서대로 위에서 아래로 (시작에서 끝까지) 실행됩니다. 즉, 정의 할 때까지 참조 할 수 없습니다. 예를 들어 다음은 표시된 오류를 생성합니다.

c = a + b  # -> NameError: name 'a' is not defined
a = 13
b = 17

다른 언어와는 달리 defclass문에서 실행 가능한 파이썬 아니라 당신이 참조 할 수 없습니다 단지 선언적-있도록 하나 a또는 b그이 발생하고 정의 전까지. 이것이 첫 번째 예제에 문제가있는 이유입니다. 명령문이 실행되고 본문이 처리되고 결과 함수 개체가 함수 이름에 바인딩 Kerma()되기 전에 함수를 참조 def하므로 스크립트의 해당 지점에서 정의되지 않습니다.

C ++와 같은 언어로 된 프로그램은 일반적으로 실행되기 전에 사전 처리되며이 컴파일 단계 동안 전체 프로그램과 #include참조하는 모든 파일을 한 번에 읽고 처리합니다. Python과 달리이 언어는 사용하기 전에 함수의 이름과 호출 시퀀스 (또는 정적 유형의 변수)를 선언 (정의되지 않음) 할 수있는 선언적 명령문을 제공하므로 컴파일러가 해당 이름을 발견 할 때 확인하기에 충분한 정보를 갖습니다. 주로 유형 검사 및 유형 변환을 수반하며 실제 내용이나 코드 본문을 아직 정의 할 필요는 없습니다.


동적 언어로는 그렇게 할 수 없습니다. Perl은 동적 언어이며 정의하기 전에 함수를 호출 할 수 있습니다. 이는 컴파일 단계와 실행 단계가 있기 때문입니다 (이상하지만 유용하게 컴파일 단계 중에 코드를 실행하도록 정렬 할 수 있음). 이것은 작동합니다 : doit(); sub doit { print("I'm doing it!\n"); }
John Deighan 19

9

이것은 파이썬에서 가능하지 않지만 솔직히 말하면 곧 필요하지 않다는 것을 알게 될 것입니다. 코드를 작성하는 Python 방식은 프로그램을 클래스와 함수를 정의하는 모듈과 다른 모든 것을 가져와 실행하는 단일 "주 모듈"로 나누는 것입니다.

간단한 폐기 스크립트의 경우 끝에 "실행 가능 부분"을 배치하는 데 익숙해 지거나 대화 형 Python 셸을 사용하는 방법을 배우십시오.


1

Python은 동적 언어이며 인터프리터는 항상 변수 (함수, ...)의 상태를 호출 할 때 그대로 가져옵니다. 일부 if 블록에서 함수를 재정의하고 매번 다르게 호출 할 수도 있습니다. 그래서 호출하기 전에 정의해야합니다.


1

기꺼이 C ++처럼되고 함수 내에서 모든 것을 사용하려는 경우. 다음과 같이 파일 하단에서 첫 번째 함수를 호출 할 수 있습니다.

def main():
    print("I'm in main")
    #calling a although it is in the bottom
    a()

def b():
   print("I'm in b")

def a():
   print("I'm in a")
   b()

main()

그런 식으로 파이썬은 먼저 전체 파일을 '읽은'다음 실행을 시작합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.