因为每次输入MongoDB的命令都很复杂,老把自己绕迷糊了,所以写了这个小脚本
哪里有不正确,请多多指正。新手求教
class ff(object):
def __init__(self,qq):
self.qq = qq
def __gt__(self,qq):# >
return ff({'$gt':{self.qq:qq.qq}})
def __lt__(self,qq):# <
return ff({'$lt':{self.qq:qq.qq}})
def __eq__(self,qq):# ==
return ff({'$eq':{self.qq:qq.qq}})
def __and__(self,qq):# &
return ff({'$and':[self.qq,qq.qq]})
def __or__(self,qq):# |
return ff({'$or':[self.qq,qq.qq]})
def __le__(self, qq): # self <= rhs 小于等于
return ff({'$lte':{self.qq:qq.qq}})
def __ge__(self, qq):# self >= rhs 大于等于
return ff({'$gte':{self.qq:qq.qq}})
def __ne__(self, qq): # self != rhs 不等于
return ff({'$ne':{self.qq:qq.qq}})
def __ior__(self, qq):# self |= rhs 即不也不
return ff({'$nor':[self.qq,qq.qq]})
def __invert__(self):# ~self 取反
return ff({'$not':self.qq})
# 类方法,将所有变量变成类ff类型的变量,以便于使用运算符重载
@classmethod
def oo(als,a):
i = 0
b = ''
c = ''
while i < len(a):
if a[i] not in "~!&|()><=":
while True:
if i == len(a)-1:
c += a[i]
b += 'ff(' + c + ')'
i+=1
break
elif a[i] in "~!&|()><=":
if c:
b += 'ff(' + c + ')'
c = ''
break
c += a[i]
i += 1
else:
b += a[i]
i+=1
# print(b) # 查看
return eval(b).qq
# a = "'age'>1"
# print(ff.oo(a))
# a = "('age'!=12)"
# print(ff.oo(a))
# a = "('age'==12)"
# print(ff.oo(a))
# a = "('age'>23)|('age'<12)"
# print(ff.oo(a))
# a = "('age'>12)&('age'<23)"
# print(ff.oo(a))
# a = "~(('age'>12)&('age'<23))"
# print(ff.oo(a))
# a = "(('age'>12)&('age'<23))|('score'>90)"
# print(ff.oo(a))
if __name__ == '__main__':
print("每个运算单独用括号括起来,例如:(('age'>12)&('age'<23))|('score'>90)\n按ctrl + c 结束本程序",)
print()
while True:
a = input("请输入:")
try:
print(ff.oo(a))
except:
print("输入有误,请检查!")
a = "'age'>1"
print(ff.oo(a)) # {'$gt': {'age': 1}}
a = "('age'!=12)"
print(ff.oo(a)) # {'$ne': {'age': 12}}
a = "('age'==12)"
print(ff.oo(a)) # {'$eq': {'age': 12}}
a = "('age'>23)|('age'<12)"
print(ff.oo(a)) # {'$or': [{'$gt': {'age': 23}}, {'$lt': {'age': 12}}]}
a = "('age'>12)&('age'<23)"
print(ff.oo(a)) # {'$and': [{'$gt': {'age': 12}}, {'$lt': {'age': 23}}]}
a = "~(('age'>12)&('age'<23))"
print(ff.oo(a)) # {'$not': {'$and': [{'$gt': {'age': 12}}, {'$lt': {'age': 23}}]}}
a = "(('age'>12)&('age'<23))|('score'>90)"
print(ff.oo(a)) # {'$or': [{'$and': [{'$gt': {'age': 12}}, {'$lt': {'age': 23}}]}, {'$gt':{'score': 90}}]}