Comecei a aprender python e estou me perguntando por que a função vazia é necessária em uma linguagem de programação
por exemplo, em python:
def empty_func():
pass
mesmo em scripts de shell, função vazia, funções vazias estão disponíveis.
Meus entendimentos e pergunta:
Por que a linguagem de programação precisava de funções vazias? É apenas para brincar com a linguagem de programação ou nada mais que realmente importa?
Se isso tiver um objetivo, alguém pode descrever o caso de uso ou dar um exemplo real do uso de funções vazias?
Ou existe alguma tradição de linguagens de programação que permitam funções vazias?
EDIT (Coisas que recebi ao ler suas respostas):
- Para esboçar algoritmos ou com funções abstratas
- Para enviar formulários sem ação, é necessário executar
- Espaço reservado para algumas operações obrigatórias
Respostas:
Nas linguagens shell da família Bourne, o
:
comando, que nada faz, geralmente é usado em duas situações:Espaço reservado para quando algo espera um comando obrigatório, por exemplo
já que
do
requer pelo menos um comando.Descartando os argumentos, mas realizando efeitos colaterais dentro da lista de argumentos, por exemplo,
Tenho certeza de que provavelmente existem outros aplicativos que os especialistas em shell conheceriam :)
No Python (e em outras línguas) é usado com menos frequência. Pode atuar como argumento para uma função de ordem superior quando você realmente não deseja fazer nada. Por exemplo, digamos que você tenha uma função que envia um formulário e permite que uma função seja chamada de forma assíncrona após a conclusão do envio:
Dessa forma, se o
callback
item não for fornecido, o envio ainda será concluído, mas nenhuma ação adicional será executada. Se você tivesse usadoNone
como o valor padrão, teria que verificar explicitamente se o retorno de chamada eraNone
, adicionando confusão ao código.fonte
Depende de onde você está no ciclo de desenvolvimento, mas às vezes, ao esboçar um algoritmo, você deseja abstrair sobre blocos complexos sem implementá-los imediatamente.
Você sabe como
init_stuff
vai funcionar, é bastante simples na sua cabeça, mas você realmente não precisa disso imediatamente, então a declara como uma função vazia. Isso permitirá que seu código seja compilado e executado sem se preocupar com os detalhes sangrentos.Outro uso para aplicativos liberados é ao usar herança. Suponha que você tenha uma classe grande que define o comportamento do código específico da plataforma. Você pode acabar com uma lógica semelhante a esta:
Esse código funcionará em muitas plataformas, mas algumas plataformas podem não precisar da inicialização do sistema de arquivos. Então sua herança ficará assim (virtual com = 0 em C ++ significa apenas que as classes derivadas DEVEM implementar esses métodos):
Então, uma implementação específica dessa classe (interface) pode não fazer nada para alguns desses métodos. Como alternativa, a classe base poderia declarar métodos vazios para init / release em vez de declará-los virtuais.
Finalmente (e vergonhosamente), às vezes você mantém um aplicativo muito antigo. Você teme que os métodos de exclusão quebrem as coisas. Isso acontece quando você tem uma herança complexa que não é entendida corretamente ou quando você tem muitos ponteiros de função (retornos de chamada). Você apenas exclui o código dentro deles para que eles sejam chamados de qualquer maneira sem quebrar nada.
fonte
O Rufflewind fez um bom trabalho ao cobrir quando você pode usar uma função vazia em um programa concluído. Na minha experiência, ele tende a ser usado com mais frequência em programas inacabados, para que você possa planejar o que vai escrever e ainda compilar até que você possa realmente implementá-lo. Em outras palavras, geralmente é apenas um espaço reservado.
É necessário no caso do python porque usa recuo para marcar blocos, ao contrário de linguagens do tipo C que usam chaves
{}
. Isso significa que, se você não tiverpass
, o analisador não saberá se você deseja deixá-lo vazio ou se esqueceu. A inclusãopass
torna o analisador muito mais simples e fornece uma palavra conveniente para procurar quando você procura blocos não implementados.fonte
NotImplementedError
é uma solução mais adequada, pois "Erros nunca devem passar silenciosamente" e chamar uma função não implementada em um programa ativo é um erro.pass
2) teste de gravação unidade que valor testes de retorno 3) verificar teste falhar (como método retorna indefinido) 4) implementar o método 5) verificar teste agora passaEmbora não seja algo que você esperaria fazer no Python, há momentos no mundo dos drivers de dispositivo em que você precisa fornecer uma função vazia, para lidar com um evento que você (a) sabe que não vai acontecer ou ( b) não se importa, mesmo que isso aconteça.
Você também vê isso em C com retornos de chamada. Ocasionalmente, você verá um código que ASSUME que você forneceu um retorno de chamada e tenta chamá-lo, ignorando o risco de um ponteiro nulo. Tudo o que você pode fazer nesse caso é fornecer uma rotina de retorno de chamada vazia. (Sim, eu tenho um fornecedor específico em mente.)
fonte
pass
muito como espaço reservado ao escrever código, especialmente em classes, quando quero algo executável antes que tudo esteja completo. É realmente o equivalente do{}
python, o qual o python não pode fazer, pois não usa chaves. Nesse sentido, todas as línguas que eu conheço permitem isso, é que apenas algumas delaspython
exigem uma palavra-chave. Mesmo nos dias de assembléia que tivemosNOP
.