美文网首页
Python生成多级嵌套字符串的一种实现思路

Python生成多级嵌套字符串的一种实现思路

作者: Codmowa | 来源:发表于2019-11-05 15:30 被阅读0次

    最近有个需求是写一个多级的 可以嵌套的 where filter
    例如下面的 sql filter

    Supp_name = 'uniqlo' and  (Supp_no > '5' and  (Sum_not_a_qty > 'wu~~~~'))
    

    分析上述 sql 语句 可以得出 总共有 三级嵌套 由里到外分别是

    1.(Sum_not_a_qty > 'wu~~~~')
    2.(Supp_no > '5' and  (Sum_not_a_qty > 'wu~~~~'))
    3.Supp_name = 'uniqlo' and  (Supp_no > '5' and  (Sum_not_a_qty > 'wu~~~~'))
    

    那么在 python 里面是这么生成的

        supp_no  =  DvFilter("Supp_no").GREATER_THAN(5) # 2
        Sum_not_a_qty = DvFilter("Sum_not_a_qty").GREATER_THAN("wu~~~~") # 1
        supp_no.AND(Sum_not_a_qty) # 2
        dv.addFilter("Supp_name").Equal_to("uniqlo").AND(supp_no) # 3
    
        print(dv.filter.sql_text)
    

    Dvfilter class 的部分实现如下

        def valueSwitcher(self,expr):
            if type(expr).__name__ == "DvFilter":
                self.field_dict.update(expr.field_dict)
                self.field_dict[expr.fileld_name]="0"
                return "({expr})".format(expr=expr.sql_text)
            else:
                return "'{expr}'".format(expr=expr)
    
        def Equal_to(self,expr):
            self.sql_text =  "{field_name} = {expr}"\
            .format(field_name=self.sql_text,expr= self.valueSwitcher(expr))
            return self
        def GREATER_THAN(self,expr):
            self.sql_text =  "{field_name} > {expr}"\
            .format(field_name=self.sql_text,expr= self.valueSwitcher(expr))
            return self
    
        def AND(self,expr):
            self.sql_text = "{field_name} and  {expr}"\
            .format(field_name=self.sql_text,expr= self.valueSwitcher(expr))
            return self
    

    如果看过 Csharp Linq 的实现方式 可以了解. return self 十分类似于 下面这种

      public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source)
      {
      }
    

    因为 return 了 self . 所以可以 连续 链式的调用, 当然在方法处理的时候 要考虑到链式调用所带来的问题 例如:

        dv.addFilter("Supp_name").Equal_to("uniqlo").AND(supp_no).Equal_to("a")
        #output
        Supp_name = 'uniqlo' and  (Supp_no > '5' and  (Sum_not_a_qty > 'wu~~~~')) = 'a'
    

    显然生成的嵌套级别是不对的

    相关文章

      网友评论

          本文标题:Python生成多级嵌套字符串的一种实现思路

          本文链接:https://www.haomeiwen.com/subject/dcasbctx.html