Wie stellt CPython fest, ob ein Benutzer ein optionales Argument angegeben hat?Python

Python-Programme
Anonymous
 Wie stellt CPython fest, ob ein Benutzer ein optionales Argument angegeben hat?

Post by Anonymous »

Ich begann mich zu fragen, wie CPython den Unterschied zwischen None als Standardargument und None als angegebenem Argument erkennen kann.
Zum Beispiel löst dict.pop() einen KeyError aus, wenn der Schlüssel nicht existiert. .pop() akzeptiert auch ein Argument für einen Standardrückgabewert. In diesem Beispiel könnten wir die Standardrückgabe auf None setzen, also: some_dict.pop(some_key, None)
Wenn Sie pop in Python definieren würden, hätten Sie wahrscheinlich:

Code: Select all

def pop(some_key, default=None):
In diesem Fall würde es keinen Unterschied machen, ob Sie die Standardeinstellung als „Keine“ definiert oder einfach weggelassen haben, aber Python kann den Unterschied erkennen. Ich habe ein bisschen in CPython gestöbert und die Implementierung von dict.pop():
gefunden

Code: Select all

PyObject *
_PyDict_Pop(PyObject *dict, PyObject *key, PyObject *deflt)
{
Py_hash_t hash;

if (((PyDictObject *)dict)->ma_used == 0) {
if (deflt) {
Py_INCREF(deflt);
return deflt;
}
_PyErr_SetKeyError(key);
return NULL;
}
if (!PyUnicode_CheckExact(key) ||
(hash = ((PyASCIIObject *) key)->hash) == -1) {
hash = PyObject_Hash(key);
if (hash == -1)
return NULL;
}
return _PyDict_Pop_KnownHash(dict, key, hash, deflt);
}
Ich kann ungefähr verstehen, wie das funktioniert. Allerdings kann ich deflt anscheinend nur in dieser Funktionsdefinition finden (mir wurde vorgeschlagen, dass CPython einen Nullzeiger für „None“ hat, aber ich würde ihn wahrscheinlich nicht erkennen), daher kann ich nicht ganz nachvollziehen, wie CPython das Problem löst, ob vom Benutzer ein Standardwert bereitgestellt wurde oder nicht. Wie lautet hier der Ausführungspfad?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post