用于函数参数预处理的python decorator

时间:2012-12-04 08:12:08

标签: python decorator

我原来的问题是我需要剥离一个字符串,然后由操作员分割。

s = " a & b | c & d "
l = map(lambda x : map(lambda x:x.strip() , x.strip().split('&')), s.strip().split('|'))

这对人们来说太麻烦了,所以我想用decorator来做这个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 个答案:

答案 0 :(得分:0)

我不得不承认我不完全理解为什么你需要装饰师。

一种相对简单的标记化这些表达式的方法是使用正则表达式:

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']

正则表达式由三个OR-ed组成:

  • [^|&\s]+匹配&|和空格以外的字符序列。
  • &匹配&
  • [|]匹配|

如果您不需要捕获运算符,则可以将正则表达式简化为r'[^|&\s]+'

编辑:如果您不希望拆分空格,正如您在评论中所暗示的那样,以下内容应该有效:

In [18]: map(string.strip, re.findall(r'[^|&]+|&|[|]', 'asdasd&sd  asd| asdsa & asdsda'))
Out[18]: ['asdasd', '&', 'sd  asd', '|', 'asdsa', '&', 'asdsda']