Considere o seguinte:
def some_function():
return 1
def some_generator():
yield 1
No código acima, some_function
é uma função, enquanto some_generator
é um gerador. Eles parecem bastante semelhantes.
O problema que tenho ao ler o código é que preciso varrer todas as linhas de uma "função" procurando a yield
palavra - chave antes de poder determinar se é realmente uma função ou um gerador!
Parece-me que usar uma palavra-chave diferente para geradores faria mais sentido, por exemplo:
gen some_generator():
yield 1
Quais são os méritos de usar a def
palavra - chave para geradores e funções? Por que uma nova palavra-chave não foi introduzida para separar funções e geradores?
design
programming-languages
python
Derek Kwok
fonte
fonte
gen
vez dedef
não tornaria essa transformação significativamente mais onerosa.Respostas:
"Quais são os méritos de usar a palavra-chave def para geradores e funções?"
Embora eles sejam mecanicamente diferentes, na prática, quando eu os uso, eles geralmente são efetivamente os mesmos para mim conceitualmente (não penso muito em chamar
range()
vsxrange()
).No entanto, em termos de compreensão rápida do que é a função, concordo que algo se perca com o uso de
def
, mas as coisas não devem ser muito ofuscadas dentro da função para começar.Mesmo um implícito
return None
pode confundir o comportamento pretendido de uma função depois de um longo período de condicionais (como em, erareturn None
pretendido como um comportamento final ou uma supervisão na lógica). Mas essas são apenas minhas crenças sobre isso.Eu não acho que meu argumento seja particularmente convincente, portanto, irei adiar para o PEP 255 :
fonte
await
(easync with
easync for
) construções de sintaxe adicionados no PEP 492 , que funcionam muito semelhante aoyield from
, exigem a função que está acostumado em ser declarado usandoasync def
em vez de um apenasdef
.A adição de novas palavras-chave corre o risco de quebrar os programas existentes. Os designers de idiomas geralmente tentam evitar adicionar novas palavras-chave, especialmente para os recursos de idioma adicionados depois que o idioma já ganhou popularidade. Cada palavra-chave que eles adicionam é um identificador que os programas não têm permissão para usar para outros fins, portanto, a adição de uma palavra-chave pode potencialmente interromper os programas existentes. Os designers de idiomas precisam avaliar os benefícios de uma nova palavra-chave em relação aos custos.
Duvido que definir uma palavra-chave separada para geradores traria muitos benefícios. Entender se um símbolo corresponde ao nome de uma função ou ao nome de um gerador é algo importante para os chamadores, e os chamadores não devem (e às vezes não podem) olhar para qual palavra-chave foi usada para implementá-la. Essa é a responsabilidade de melhores convenções e documentação de nomes.
fonte
Geradores são funções que avaliam preguiçosamente. Dado que eles são a mesma coisa na base, faz sentido que eles usem a mesma palavra-chave. Uma opção pode ser usar um comentário para identificar qual é qual para uma determinada instância:
fonte
Eu acho que é porque é mais pitônico, mas o que eu sei? ;)
Eu realmente não acho que isso importe muito. É mais fácil lembrar para mim, porque não há necessidade de memorizar os dois.
EDIT: O PEP pode dizer, você pode investigar lá.
fonte