파이썬 생성기와 함수가 왜“def”키워드를 공유합니까?


10

다음을 고려하세요:

def some_function():
    return 1

def some_generator():
    yield 1

위의 코드 some_function에서 함수 some_generator이며, 발전기입니다. 그들은 매우 비슷해 보입니다.

코드를 읽을 때 발생하는 문제 yield는 실제로 키워드가 함수인지 아니면 발전기인지를 결정하기 전에 키워드를 찾는 "기능"의 모든 줄을 스캔해야한다는 것입니다!

발전기에 다른 키워드를 사용하는 것이 더 합리적이라고 생각합니다.

gen some_generator():
    yield 1

def생성기와 함수 모두에 키워드를 사용하면 어떤 장점이 있습니까? 함수와 생성기를 분리하기 위해 새로운 키워드가 도입되지 않은 이유는 무엇입니까?


나는 실제 대답을 모르지만 종종 목록을 반환하는 함수를 작성하기 시작한 다음 적절하게 보일 때 생성기로 변환합니다. 구문이 일치하면 더 자연 스럽습니다.
로봇 고트

2
@StevenBurnap Derek의 제안 gen대신 비슷한 것을 사용하는 것이 def그 변환을 훨씬 더 번거롭게 만들지는 않습니다.
jamesdlin

2
일반적으로 언어 디자이너는 일반적으로 불필요한 키워드를 추가하지 않도록 노력합니다. 추가 한 모든 키워드는 프로그램이 다른 목적으로 사용할 수없는 식별자입니다.
jamesdlin

@ jamesdlin : 그러나 문제는 새로운 키워드가 필요 하다는 주장입니다 .
Giorgio

1
@ jamesdlin : 물론 본문을 보면 함수와 생성기를 구별 할 수 있지만 질문은 다른 키워드를 사용하면 코드를 더 읽기 쉽게 만들 수 있다고 주장합니다.
Giorgio

답변:


14

"제너레이터와 함수 모두에 def 키워드를 사용하면 어떤 장점이 있습니까?"

내가 그들을 사용할 때 그들은 실제로, 기계적 다르지만 그들은 (내가 많이 호출 생각하지 않는 개념적으로 종종 나에게 효과적으로 동일 range()xrange()).

함수가 무엇인지 빨리 이해한다는 측면에서의 사용으로 무언가가 손실 def된다는 데 동의하지만, 함수 내에서 시작하기에 너무 혼란스럽지 않아야합니다.

암시 return None적조차도 긴 조건부 이후에 함수의 의도 된 동작을 혼동시킬 수 있습니다 ( return None논리에서 최종 동작 또는 감독 으로 의도 된 것임). 그러나 이것들은 그것에 대한 나의 믿음입니다.

나는 내 주장이 특히 설득력이 없다고 생각하지 않으므로 PEP 255를 연기 할 것입니다 .

문제 : "def"대신 다른 새 키워드 (예 : "gen"또는 "generator")를 도입하거나 구문을 변경하여 생성기 기능과 비 생성기 기능을 구별하십시오.

단점 : 실제로 (생각하는 방식) 발전기 함수이지만 재개 가능한 왜곡이 있습니다. 이들이 어떻게 설정되는지에 대한 기술은 비교적 작은 기술적 인 문제이며, 새로운 키워드를 도입하면 발전기가 어떻게 시작되는지에 대한 역학을 지나치게 강조 할 수 있습니다 (생성기의 중요한 부분).

Pro : 실제로 (생각하는 방식) 생성기 함수는 실제로 마술처럼 생성기 반복자를 생성하는 팩토리 함수입니다. 이런 점에서 그것들은 생성자 이외의 함수와 근본적으로 다르며 함수보다 생성자처럼 작동하므로 "def"를 재사용하는 것이 가장 혼란 스러울 수 있습니다. 본문에 묻힌 "수율"문장은 의미가 너무 다르다는 경고는 충분하지 않습니다.

BDFL : "def"가 유지됩니다. 어느 쪽의 주장도 완전히 설득력이 없기 때문에 언어 디자이너의 직감을 상담했습니다. 그것은 PEP에서 제안 된 구문이 너무 덥지도, 너무 춥지도 않다는 것을 정확하게 말해줍니다. 그러나 그리스 신화의 델파이 오라클과 마찬가지로 왜 그런지 알려주지 않으므로 PEP 구문에 대한 논쟁에 반박하지 않습니다. 내가 생각해 낼 수있는 최선은 (반론에 동의하는 것 외에는 ... 이미 만들어진) "FUD"입니다. 이것이 처음부터 언어의 일부 였다면 Andrew Kuchling의 "Python Warts"페이지를 만들었을 것입니다.


1
그것은 새로운 것을 주목할 필요가있다 await(그리고 async withasync for추가) 구문 구조 PEP (492) 과 매우 유사 작동 yield from, 그들이 사용하는 선언에 사용하고있는 기능을 요구하는 async def대신 단지의를 def.
Feuermurmel

2
  1. 새 키워드를 추가하면 기존 프로그램이 중단 될 위험이 있습니다. 언어 디자이너는 일반적으로 새로운 키워드를 추가하지 않으려 고 시도합니다. 특히 언어가 이미 인기를 얻은 후에 추가 된 언어 기능의 경우 더욱 그렇습니다. 추가 한 모든 키워드는 프로그램이 다른 목적으로 사용할 수없는 식별자이므로 키워드를 추가하면 기존 프로그램이 손상 될 수 있습니다. 언어 디자이너는 비용 대비 새로운 키워드의 이점을 평가해야합니다.

  2. 나는 의심 정의 발전기에 대해 별도의 키워드 것은 많은 이점을 가질 것이다. 심볼이 함수의 이름 또는 생성기의 이름과 일치하는지 이해하는 것은 호출자에게 중요한 것이며 호출자는 해당 키워드를 구현하는 데 사용 된 키워드를 볼 필요가 없습니다 (때로는 안될 수도 있음). 그것은 더 나은 명명 규칙과 문서화의 책임입니다.


1

생성기는 느리게 평가되는 함수입니다. 기본적으로 동일한 것을 사용하면 동일한 키워드를 사용하는 것이 좋습니다. 한 가지 옵션은 주석을 사용하여 주어진 인스턴스에 대한 주석을 식별하는 것입니다.

def some_function(): #This is a function.
    return 1

def some_generator(): #This is a generator.
    yield 1

0

파이썬이 더 많기 때문에 추측하지만 무엇을 알고 있습니까? ;)

나는 그것이 그렇게 많이 중요하다고 생각하지 않습니다. 둘 다 외울 필요가 없기 때문에 기억하기가 더 쉽습니다.

편집 : PEP는 당신이 거기에서 조사 할 수 있다고 말할 수 있습니다.


감사! 실제로 PEP는 말합니다! 생성기의 새 키워드에 대한 장단점 및 최종 결정에 대해서는 PEP-255 를 참조하십시오 .
데릭

파이썬적인 의미로 : "파이썬에서 행해지는 방식"?
Giorgio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.