Я действительно борюсь с какой-то частью кода. Я знаю, что он может быть реорганизован, но я не могу найти красивое и элегантное решение.Рефакторинг кода с декораторами python?
Вот две функции (гораздо больше функций этого рода в моем коде):
def fooA(param1, param2):
if param2 == True:
code_chunk_1
fooA_code #uses only param1
if param2 == True:
code_chunk_2
def fooB(param1, param2):
if param2 == True:
code_chunk_1
fooB_code #uses only param1
if param2 == True:
code_chunk_2
Моя первая идея состояла в том, чтобы использовать этот декоратор:
def refactorMe(func):
def wrapper(*args):
if args[-1]:
code_chunk_1
func(*args)
if args[-1]:
code_chunk_2
return wrapper
И наконец:
@refactorMe
def fooA(param1, param2):
fooA_code #uses only param1
@refactorMe
def fooB(param1, param2):
fooB_code #uses only param1
К сожалению, я не доволен этим решением:
- Этот декоратор «навязчивый» и специфический для fooB функций fooA &
- param2 не используется больше в fooA & fooB теле, но мы должны держать его в подписи функции
Возможно Я не использую декоратор для своей первоначальной цели?
Есть ли другой способ рефакторинга кода?
Большое спасибо!
Извините, я не понимаю вашу проблему. Decorator предлагает вам код рефакторинга и исключает дублированный код. Param2 можно отправить в декоратор или быть частью функции. Таким образом, вы знаете, что принимает функция. Кроме того, используйте док-строки для разработки использования. – iElectric
Что случилось с «специфичным для функций fooA & fooB»? Можете ли вы объяснить, почему это плохо? –
Потому что у меня есть утверждение «args [-1]» в декораторе. Означает, что украшенная функция всегда должна иметь последний логический параметр и не может использоваться в общих случаях. – Thorfin