web-dev-qa-db-fra.com

Quel est le délai d'expiration global par défaut

Python 3.4. Essayer de trouver quel est le délai d'expiration par défaut dans urllib.request.urlopen ().

Sa signature est: urllib.request.urlopen (url, data = None, [timeout,] *, cafile = None, capath = None, cadefault = False, context = None)

Le doc dit que son "timeout global par défaut", et en regardant le code son: socket._GLOBAL_DEFAULT_TIMEOUT

Quelle est toujours la valeur réelle en secondes?

24
user3139774

Je soupçonne que cela dépend de la mise en œuvre. Cela dit, pour CPython:

De socket.create_connection ,

Si aucun délai d'expiration n'est fourni, le paramètre d'expiration global par défaut renvoyé par: func: getdefaulttimeout est utilisé.

De socketmodule.c ,

static PyObject *
socket_getdefaulttimeout(PyObject *self)
{
    if (defaulttimeout < 0.0) {
        Py_INCREF(Py_None);
        return Py_None;
    }
    else
        return PyFloat_FromDouble(defaulttimeout);
}

plus tôt dans le même fichier,

static double defaulttimeout = -1.0; /* Default timeout for new sockets */

Il ressemble donc à Py_None, alias None, est le délai d'expiration par défaut. En d'autres termes, urlopen n'expire jamais. Du moins pas depuis la fin Python. Je suppose qu'un timeout peut toujours se produire si les fonctions de mise en réseau fournies par l'OS ont elles-mêmes des timeouts.


Edit: oups, je suppose que je n'avais pas du tout besoin de plonger à la source pour la réponse, car il est juste là dans le docs .

Une valeur de None indique que les nouveaux objets socket n'ont pas de délai d'expiration. Lorsque le module socket est importé pour la première fois, la valeur par défaut est None.

26
Kevin