Как CPython определяет, предоставил ли пользователь необязательный аргумент?Python

Программы на Python
Ответить
Anonymous
 Как CPython определяет, предоставил ли пользователь необязательный аргумент?

Сообщение Anonymous »

Мне стало интересно, как CPython может определить разницу между None в качестве аргумента по умолчанию и None в качестве указанного аргумента.
Например, dict.pop() выдаст ошибку KeyError, если ключ не существует. .pop() также принимает аргумент для возвращаемого значения по умолчанию. В этом примере мы могли бы установить возврат по умолчанию None, поэтому: some_dict.pop(some_key, None)
Если бы вы определили pop в Python, вы бы, вероятно, сделали:

Код: Выделить всё

def pop(some_key, default=None):
В этом случае не имеет значения, определили ли вы значение по умолчанию как None или просто пропустили его, но Python может заметить разницу. Я немного покопался в CPython и нашел реализацию dict.pop():

Код: Выделить всё

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);
}
Я примерно понимаю, как это работает. Однако я не могу найти deflt, кроме как в этом определении функции (мне подсказали, что CPython имеет нулевой указатель для None, но я, вероятно, не узнаю его), поэтому я не могу понять, как CPython решает проблему того, было ли пользователем задано значение по умолчанию. Каков здесь путь выполнения?


Подробнее здесь: https://stackoverflow.com/questions/591 ... l-argument
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»