Предположим, у меня есть какой-то менеджер контекста (из библиотеки третьей стороной), что я использую, как так:Условные или дополнительные управляющие контекстные с утверждением
with freeze_time(test_dt):
lines_of_code_1
lines_of_code_2
lines_of_code_3
Но, предположим, что, если не существует никакого значения для test_dt, менеджер контекста не должен работать, но все оставшееся код должен работать, например, так:
if test_dt:
with freeze_time(test_dt):
lines_of_code_1
lines_of_code_2
lines_of_code_3
else:
lines_of_code_1
lines_of_code_2
lines_of_code_3
Предположим, что lines_of_code
здесь 2-3 строки кода, которые точно совпадают, есть уборщик способ пишу это? Я знаю, что я мог бы написать что-то вроде этого:
def do_thing():
lines_of_code_1
lines_of_code_2
lines_of_code_3
if test_dt:
with freeze_time(test_dt):
do_thing()
else:
do_thing()
Но я не сумасшедший об этом форматировании. Кроме того, я не хочу, чтобы мусор этот шаблон по всему моему коду.
Существует одна последняя возможности, но я не уверен, что это будет работать: подклассы менеджера контекста и пропуская __enter__
и __exit__
функции, если test_dt данный пуст, так как:
class optional_freeze_time(object):
def __init__(self, test_dt=None):
if test_dt:
self.ctx_manager = freeze_time(test_dt)
else:
self.ctx_manager = None
def __enter__(self, *args, **kwargs):
if self.ctx_manager:
self.ctx_manager.__enter__(*args, **kwargs)
def __exit__(self, *args, **kwargs):
if self.ctx_manager:
self.ctx_manager.__exit__(*args, **kwargs)
Я тестировал это с пустым классом менеджера контекста, и, похоже, он ведет себя правильно. Тем не менее, я беспокоюсь, будет ли реальный менеджер контекста вести себя правильно, если я это сделаю (я не очень хорошо знаком с внутренними принципами того, как он работает).
Не могли бы вы дать менее абстрактный пример? Да, вы могли бы изменить диспетчер контекста, чтобы он не делал все, что он делает при вводе и выходе из 'if input is None:'. Вы проверили, что вы написали? – jonrsharpe
может сделать объект 'blank_context_manager', который ничего не делает и переопределяет' context_manager .__ new__', чтобы вернуть пустой, если нет ввода, уменьшит количество условных выражений до 1. –
Возможный дубликат [Условный оператор с Python] (http://stackoverflow.com/questions/27803059/conditional-with-statement-in-python) –