У меня есть два одинаковых кода, которые нужно разобрать, и я не уверен в самом питоническом способе выполнить это.
Предположим, что у меня есть два похожих "кода"
secret_code_1 = 'asdf|qwer-sdfg-wert$$otherthing'
secret_code_2 = 'qwersdfg-qw|er$$otherthing'
оба кода заканчиваются на $$otherthing
и содержат число значений, разделенных символом -
Сначала я подумал о том, чтобы использовать functools.wrap
для разделения некоторой общей логики на логику, специфичную для каждого типа кода, примерно так:
from functools import wraps
def parse_secret(f):
@wraps(f)
def wrapper(code, *args):
_code = code.split('$$')[0]
return f(code, *_code.split('-'))
return wrapper
@parse_secret
def parse_code_1b(code, a, b, c):
a = a.split('|')[0]
return (a,b,c)
@parse_secret
def parse_code_2b(code, a, b):
b = b.split('|')[1]
return (a,b)
Однако, делая это, это путает некоторые параметры, которые вы должны фактически передать функциям parse_code_*
i.e.
parse_code_1b(secret_code_1)
parse_code_2b(secret_code_2)
Итак, чтобы упростить формальные параметры функции, я изменил логику на что-то вроде этого:
def _parse_secret(parse_func, code):
_code = code.split('$$')[0]
return parse_func(code, *_code.split('-'))
def _parse_code_1(code, a, b, c):
"""
a, b, and c are descriptive parameters that explain
the different components in the secret code
returns a tuple of the decoded parts
"""
a = a.split('|')[0]
return (a,b,c)
def _parse_code_2(code, a, b):
"""
a and b are descriptive parameters that explain
the different components in the secret code
returns a tuple of the decoded parts
"""
b = b.split('|')[1]
return (a,b)
def parse_code_1(code):
return _parse_secret(_parse_code_1, code)
def parse_code_2(code):
return _parse_secret(_parse_code_2, code)
Теперь вам легче рассуждать о том, что вы передаете этим функциям:
parse_code_1(secret_code_1)
parse_code_2(secret_code_2)
Однако этот код значительно более подробный.
Есть ли лучший способ сделать это? Означает ли объектно-ориентированный подход с классами?