docs: def map2rpn(map, obj):
      """
      Convert a Mongodb-like dictionary to a RPN list of operands and operators.
  
      Reverse Polish notation (RPN) is a mathematical notation in which every
      operator follows all of its operands, e.g.
  
      3 - 4 + 5 -->   3 4 - 5 +
  
      >>> d = {2.0: {'$eq': 1.0}}
      >>> assert map2rpn(d, None) == [2.0, 1.0, '$eq']
      """
      rpn = []
  
      for k, v in map.items():
  
          if k in _ALL_OPS:
              if isinstance(v, collections.abc.Mapping):
                  # e.g "$not": {"$gt": "one"}
                  # print("in op_vmap",k, v)
                  values = map2rpn(v, obj)
                  rpn.extend(values)
                  rpn.append(k)
  
              elif isinstance(v, (list, tuple)):
                  # e.g "$and": [{"$not": {"one": 1.0}}, {"two": {"$lt": 3}}]}
                  # print("in_op_list",k, v)
                  for d in v:
                      rpn.extend(map2rpn(d, obj))
  
                  rpn.append(k)
  
              else:
                  # Examples
                  # 1) "$eq"": "attribute_name"
                  # 2) "$eq"": 1.0
                  try:
                      #print("in_otherv",k, v)
                      rpn.append(getattr(obj, v))
                      rpn.append(k)
  
                  except TypeError:
                      #print("in_otherv, raised",k, v)
                      rpn.extend([v, k])
          else:
              try:
                  k = getattr(obj, k)
              except TypeError:
                  k = k
  
              if isinstance(v, collections.abc.Mapping):
                  # "one": {"$eq": 1.0}}
                  values = map2rpn(v, obj)
                  rpn.append(k)
                  rpn.extend(values)
              else:
                  #"one": 1.0
                  rpn.extend([k, v, "$eq"])
  
      return rpn