Ограничить использование методов во встроенных классах для программирования заданий - PullRequest
0 голосов
/ 06 мая 2018

Я преподаю кодирование с использованием 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'

Есть ли способ запретить использование определенных методов во встроенных классах?

1 Ответ

0 голосов
/ 06 мая 2018

запрещенный фрукт может помочь вам:

Этот проект призван помочь вам достичь небес во время написания тестов, но может привести вас в ад, если используется в рабочем коде.

Это в основном позволяет исправлять встроенные объекты, объявленные в C через питона.

Вот пример:

from forbiddenfruit import curse

def broken_sort(self):
    print("NOT DOING ANYTHING!")
    return None

curse(list, "sort", broken_sort)

some_list = [3, 4, 5, 1, 2]
some_list.sort()
print(some_list)

Выводит:

NOT DOING ANYTHING!
[3, 4, 5, 1, 2]

Похоже, он не работает надежно в моей системе, и выдает

[1, 2, 3, 4, 5]

половина времени. Это из-за состояния гонки ? Я понятия не имею. : - / Проект может стоить небольшого исследования.

...