Я преподаю кодирование с использованием Python, и в некоторых заданиях студентам желательно реализовать функциональность, которая в противном случае обеспечивается встроенными функциями или методами встроенных классов. В качестве примера задания я хочу, чтобы ученики написали две функции - одну с именем insert_sorted()
, которая добавляет элемент в список, чтобы список оставался отсортированным, а другую с именем insertion_sort()
, которая возвращает новый список и использует insert_sorted()
для сортировки. .
Мой доступ к коду учащихся осуществляется через тестовые случаи, в которых я могу вызывать эти функции. Проблема в том, что в функции insert_sorted()
учащиеся могут использовать метод list.sort()
, а в функции insertion_sorted()
они могут использовать встроенную функцию sorted()
.
Легко переопределить встроенные функции (которые в этом случае могут вызвать исключение с сообщением о том, что их использование запрещено). Я также могу переопределять объекты и функции во встроенных модулях (например, мне нужно было запретить использование функции math.factorial()
). Но я не могу заменить метод встроенного типа, как в коде ниже:
def error():
raise Exception("Not allowed.")
list.sort = error
Я получаю сообщение об ошибке:
Traceback (most recent call last):
File "main.py", line 3, in <module>
list.sort = error
TypeError: can't set attributes of built-in/extension type 'list'
Есть ли способ запретить использование определенных методов во встроенных классах?