Python-декоратор для предварительной обработки аргументов функции
Моя первоначальная проблема заключается в том, что мне нужно удалить строку, а затем разделить ее оператором.
s = " a & b | c & d "
l = map(lambda x : map(lambda x:x.strip() , x.strip().split('&')), s.strip().split('|'))
это слишком громоздко для чтения людьми, поэтому я думаю использовать декоратор для предварительной обработки strip().
вот мое текущее решение, но оно не работает!
Обновить:
query_AND =lambda wl: '.*'+'.*'.join(wl)+'.*'
def d_query_AND(query_split):
def d_query_AND_f(query_split):
return query_AND(query_split)
#return query_spli
return d_query_AND_f
@d_query_AND
def query_split(p):
return [v for v in p.split('&')]
print query_split("asd & asdsa & sadsa")
1 ответ
Должен признать, я не до конца понимаю, зачем тебе нужен декоратор.
Один из относительно простых способов токенизации этих выражений - использование регулярного выражения:
In [12]: re.findall(r'[^|&\s]+|&|[|]', ' a & b | c & d ')
Out[12]: ['a', '&', 'b', '|', 'c', '&', 'd']
In [13]: re.findall(r'[^|&\s]+|&|[|]', 'asdasd&sdasd| asdsa & asdsda')
Out[13]: ['asdasd', '&', 'sdasd', '|', 'asdsa', '&', 'asdsda']
Регулярное выражение состоит из трех компонентов ИЛИ-ed вместе:
[^|&\s]+
соответствует последовательности символов, отличных от&
,|
и пробелы.&
Матчи&
,[|]
Матчи|
,
Если вам не нужно захватывать операторы, регулярное выражение можно упростить до r'[^|&\s]+'
,
edit: если вы не хотите разделять пробелы, как вы подразумеваете в комментариях, должно работать следующее:
In [18]: map(string.strip, re.findall(r'[^|&]+|&|[|]', 'asdasd&sd asd| asdsa & asdsda'))
Out[18]: ['asdasd', '&', 'sd asd', '|', 'asdsa', '&', 'asdsda']