Для меня самое большое преимущество для re.compile
является способностью разделить определение regex от его использования.
Даже простое выражение такой как 0|[1-9][0-9]*
(целое число в основе 10 без начальных нулей) может быть достаточно сложным, который Вы не должны перепечатывать его, проверить, сделали ли Вы какие-либо опечатки, и позже должны перепроверить, существуют ли опечатки, когда Вы начинаете отлаживать. Плюс, более хорошо использовать имя переменной, такое как цифра или num_b10, чем 0|[1-9][0-9]*
.
, конечно, возможно сохранить строки и передать их re.match; однако, это меньше читаемо:
num = "..."
# then, much later:
m = re.match(num, input)
По сравнению с компиляцией:
num = re.compile("...")
# then, much later:
m = num.match(input)
, Хотя это довольно близко, последняя строка вторых чувств, более естественных и более простых, когда используется неоднократно.
Не в автоматическом режиме. Что вы можете сделать, так это написать свой код таким образом, чтобы внешние зависимости были заключены в объекты, которые передаются извне. В производственной среде вы просто подключите настоящие адаптеры, но во время тестирования вы можете подключить их к заглушкам или имитаторам.
Если вы действительно настаиваете, вы можете использовать расширение runkit , которое изменяет php модель программирования, чтобы вы могли переопределять классы и функции во время выполнения. Однако это внешнее и нестандартное расширение, так что имейте это в виду. Стандарт deacto - это ручной подход, как я описал выше.