NameError를 방지하기 위한 함수 전달
코드 후반부에 정의된 함수를 호출하려고 할 때 NameError 예외가 발생하면 실망스러울 수 있습니다. Python의 정의 순서는 일반적으로 선언 전에 함수 사용을 금지하지만, 특정 기술을 사용하면 이 제한을 피할 수 있습니다.
예를 들어, 아직 정의되지 않은 사용자 정의 cmp_configs 함수를 사용하여 목록을 정렬하려면 Python의 즉시 함수 기능을 사용할 수 있습니다.
<code class="python">print("\n".join([str(bla) for bla in sorted(mylist, cmp=cmp_configs)])) def cmp_configs(x, y): ... # Function implementation</code>
이 시나리오에서는 정렬된 함수 호출이 별도의 함수 내에 래핑되어 cmp_configs 정의에 대한 즉각적인 필요성을 해결합니다. 외부 함수가 호출되면 sorted와 cmp_configs가 모두 정의되어 적절한 실행이 보장됩니다.
앞으로 선언하는 함수가 필요한 또 다른 일반적인 상황은 재귀입니다. 다음 예를 고려하십시오.
<code class="python">def spam(): if end_condition(): return end_result() else: return eggs() def eggs(): if end_condition(): return end_result() else: return spam()</code>
이 재귀 패턴이 발생하면 스팸 전에 계란 정의를 이동하면 문제가 해결될 것이라고 가정할 수 있습니다. 그러나 두 함수 사이의 순환 종속성으로 인해 이 접근 방식에서는 여전히 NameError가 발생합니다.
이 특정 상황을 해결하기 위해 사용자 정의 함수를 계란 함수 자체 내에 배치할 수 있습니다.
<code class="python">def eggs(): if end_condition(): return end_result() else: def spam(): if end_condition(): return end_result() else: return eggs() return spam() # Explicitly calling the inner 'spam' function</code>
또는 람다 식을 사용하여 동일한 결과를 얻을 수 있습니다.
<code class="python">def eggs(): if end_condition(): return end_result() else: return lambda: spam() # Returns a callable object that implements spam</code>
요약하면 일반적으로 함수 정의의 사용 전 원칙을 준수하지만 함수를 앞으로 선언하는 것이 불가피한 시나리오가 있습니다. . 프로그래머는 즉각적인 함수나 람다 표현식을 활용하여 이러한 제한을 피하고 기능을 손상시키지 않으면서 원하는 코드 구조를 유지할 수 있습니다.
위 내용은 Python에서 나중에 정의된 함수를 호출할 때 NameError를 어떻게 방지할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!