Реализация из set.issubset
и set.issuperset
настаивает на построении набора из аргумента в первую очередь:
static PyObject *
set_issubset(PySetObject *so, PyObject *other)
{
setentry *entry;
Py_ssize_t pos = 0;
int rv;
if (!PyAnySet_Check(other)) {
PyObject *tmp, *result;
tmp = make_new_set(&PySet_Type, other);
if (tmp == NULL)
return NULL;
result = set_issubset(so, tmp);
Py_DECREF(tmp);
return result;
}
if (PySet_GET_SIZE(so) > PySet_GET_SIZE(other))
Py_RETURN_FALSE;
while (set_next(so, &pos, &entry)) {
rv = set_contains_entry((PySetObject *)other, entry->key, entry->hash);
if (rv < 0)
return NULL;
if (!rv)
Py_RETURN_FALSE;
}
Py_RETURN_TRUE;
}
PyDoc_STRVAR(issubset_doc, "Report whether another set contains this set.");
static PyObject *
set_issuperset(PySetObject *so, PyObject *other)
{
PyObject *tmp, *result;
if (!PyAnySet_Check(other)) {
tmp = make_new_set(&PySet_Type, other);
if (tmp == NULL)
return NULL;
result = set_issuperset(so, tmp);
Py_DECREF(tmp);
return result;
}
return set_issubset((PySetObject *)other, (PyObject *)so);
}
PyDoc_STRVAR(issuperset_doc, "Report whether this set contains another set.");
issuperset
создает набор из аргумента, затем звонит other.issubset(self)
. (issubset
также настаивает на наличии набора в качестве аргумента, но он получает его, поэтому в этом случае преобразование не требуется.) Они могли бы довольно легко добавить путь кода к issuperset
для обработки неустановленных аргументы без преобразования набора, но они этого не сделали.
Я подозреваю, что причиной этого может быть ошибка при вызовах типа {1}.issuperset([2, [3]])
, где аргумент содержит нехешируемые элементы. Однако также вероятно, что никто не удосужился его оптимизировать. Поиск в системе отслеживания проблем Python для issuperset
обнаруживает 0 проблем с оптимизацией issuperset
, даже не закрытых проблем. Существует закрытая проблема о еще сложная оптимизация для issubset
, что удивительно, но хотя это привело бы к аналогичным изменениям поведения исключения, ни один из ответов по проблеме ничего не сказал об этом .