Je viens de remarquer il y a 2 nom-fonctions susceptibles exit()
et sys.exit()
en Python. Quelle est la différence et quelle est la meilleure situation pour utiliser l'un plutôt que l'autre?
Réponse
Trop de publicités?exit
est une aide pour le shell interactif - sys.exit
est destiné à l'utilisation dans les programmes.
Le module du site (qui est importé automatiquement au démarrage, sauf si l'option-S option de ligne de commande est donné) ajoute plusieurs constantes intégrées dans l'espace de noms (par exemple,
exit
). Ils sont utiles pour l'interactif interpréteur shell et ne doivent pas être utilisées dans les programmes.
Techniquement, ils ne sont pour la plupart les mêmes: sensibilisation SystemExit
. sys.exit
le fait dans 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;
}
Alors qu' exit
est défini dans site.py:
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')
Notez qu'il existe une troisième option de sortie, à savoir les os._exit, qui sort sans faire appel à des pointeurs de nettoyage, de rinçage stdio tampons, etc. (et qui devrait normalement être utilisés dans le processus de l'enfant après un fork()
).