No Python, existem duas funções com nomes semelhantes exit()
e sys.exit()
. Qual é a diferença e quando devo usar um sobre o outro?
No Python, existem duas funções com nomes semelhantes exit()
e sys.exit()
. Qual é a diferença e quando devo usar um sobre o outro?
Respostas:
exit
é um auxiliar do shell interativo - sys.exit
é destinado ao uso em programas.
O
site
módulo (que é importado automaticamente durante a inicialização, exceto se a-S
opção da linha de comandos for fornecida) adiciona várias constantes ao espaço para nome interno (por exemploexit
) . Eles são úteis para o shell do interpretador interativo e não devem ser usados em programas .
Tecnicamente, eles fazem basicamente o mesmo: aumentar SystemExit
. sys.exit
faz isso no sysmodule.c :
static PyObject *
sys_exit(PyObject *self, PyObject *args)
{
PyObject *exit_code = 0;
if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code))
return NULL;
/* Raise SystemExit so callers may catch it or clean up. */
PyErr_SetObject(PyExc_SystemExit, exit_code);
return NULL;
}
While exit
é definido em site.py e _sitebuiltins.py , respectivamente.
class Quitter(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return 'Use %s() or %s to exit' % (self.name, eof)
def __call__(self, code=None):
# Shells like IDLE catch the SystemExit, but listen when their
# stdin wrapper is closed.
try:
sys.stdin.close()
except:
pass
raise SystemExit(code)
__builtin__.quit = Quitter('quit')
__builtin__.exit = Quitter('exit')
Observe que existe uma terceira opção de saída, os._exit , que sai sem chamar manipuladores de limpeza, liberar buffers stdio, etc. (e que normalmente deve ser usado apenas no processo filho após a fork()
).
from module import *
.
Se eu usar exit()
um código e executá-lo no shell, ele mostrará uma mensagem perguntando se eu quero matar o programa ou não. É realmente perturbador.
Veja aqui
Mas sys.exit()
é melhor neste caso. Ele fecha o programa e não cria nenhuma caixa de diálogo.
sys.exit()
deve ser usado dentro de programas.
-S
seja usado. Uma maneira de fazê-lo funcionar mesmo com-S
é especificarfrom sys import *
.