我想知道是否有一种简单的方法可以避免在以下代码中使用eval:
eval('6001 >= 6005')
我一直在寻找几个小时试图找到一个简单的替代品,因为学习eval并不是一个好习惯,特别是当你不知道谁将会使用该程序时。
我使用它的背景是这样的:
两个比较变量中的每一个都是pandas dataframe列中的值,因此它也可能如下所示:
eval('"my_city_name" == "your_city_name"')
非常感谢任何帮助!感谢
答案 0 :(得分:1)
您可以通过实施您想要允许的比较来避免eval()
:
STRINGS = ['6001 >= 6005', '"my_city_name" == "your_city_name"', '13 != 14', '1 < 4']
COMPARISONS = {
'==': lambda a, b: a == b,
'!=': lambda a, b: a != b,
'>=': lambda a, b: a >= b,
}
for string in STRINGS:
operand1, comparison, operand2 = string.split()
if comparison in COMPARISONS:
print(string, (COMPARISONS[comparison])(operand1, operand2))
else:
print(string, "Unknown comparison")
这只是一个例子,实际上你需要做一些类型检查,数字转换等等,但关键是要确定哪些比较对你很重要。
答案 1 :(得分:0)
以下是我最终的结果:
def transform(self, attribute):
try:
attribute = float(attribute)
if math.isnan(attribute):
attribute = "NULL"
print type(attribute)
return attribute
except ValueError:
attribute = str(attribute)
print type(attribute)
return attribute
def equals(self, attribute, value):
return self.transform(attribute) == self.transform(value)
def not_equals(self, attribute, value):
return self.transform(attribute) != self.transform(value)
def greater_than(self, attribute, value):
return self.transform(attribute) > self.transform(value)
def greater_than_equal(self, attribute, value):
return self.transform(attribute) >= self.transform(value)
def less_than(self, attribute, value):
return self.transform(attribute) < self.transform(value)
def less_than_equal(self, attribute, value):
return self.transform(attribute) <= self.transform(value)
由于我只需要少数几个操作员,这是我能想到的最好的解决方案。 transform()
只是为了处理我在特定数据集中遇到的一些比较问题。希望这可以帮助将来的某个人!如果有人有任何意见或建议,请告诉我。