我在函数中有一块代码进行了一些比较,即:
if customer_info['total_dls'] < min_training_actions \
or customer_info['percentage'] > train_perc_cutoff:
continue
elif customer_id not in test_set \
or test_set[customer_id]['total_dls'] < min_testing_actions:
num_uncertain +=1
continue
elif test_set[customer_id]['percentage'] <= test_perc_cutoff:
num_correct +=1
else:
num_incorrect +=1
现在有时我需要将这些比较大于,有时我需要它们小于。所有其余代码完全相同。现在,我可以创建两个基本上重用相同代码的函数,但在此之前,是否有一些简洁的方法来变换比较运算符,所以我可以使用相同的代码块并将比较作为变量传递?类似于:compare(var1, var2, polarity)
。 我知道我自己可以做到这一点,但我想知道这样的情况下的标准是什么。是否有一些非常pythonic的做法,我不知道?
[编辑]重点强调问题的最重要部分[/编辑]
答案 0 :(得分:8)
您可以使用operator
module;它具有充当比较运算符的函数:
import operator
if foobar:
comp = operator.lt
else:
comp = operator.gt
if comp(spam, eggs):
如果spam
小于或等于eggs
,则会使用此测试,具体取决于foobar
的真实情况。
这完全符合您的比较作为变量的要求。
这当然是我用来避免重复自己的东西;如果您在比较方向上有两段不同 的代码,请使用operators
中的函数来参数化比较。
答案 1 :(得分:1)
我不会通过任何方式使运算符动态来重构这一点。我认为比较并不是那么相似,并且迫使它们看起来更相似,使代码混淆。这有点像红鲱鱼。
我会把复杂的检查放在一个函数中,比如
def customer_trained_enough(customer_info):
return (
customer_info['total_dls'] < min_training_actions
or customer_info['percentage'] > train_perc_cutoff)
def customer_tested_enough(test_info):
return test_info['total_dls'] >= min_testing_actions
def percentage_too_high(test_info):
return test_info['percentage'] > test_perc_cutoff
然后代码变为:
if customer_trained_enough(customer_info):
continue
if (customer_id not in test_set or
not customer_tested_enough(test_set[customer_id])):
num_uncertain += 1
elif not percentage_too_high(test_set[customer_id]):
num_correct += 1
else:
num_incorrect += 1
我猜到了这些函数的一些名称,并且不得不否定其中两个函数的逻辑以使名称有用。
答案 2 :(得分:0)
在尝试为未知ML模型构建模块时,我遇到了同样的问题。有些需要执行最低分,其他则需要最高分,具体取决于使用的指标。我通过了一个超过&#39;布尔变量并写了一个小函数:
def is_better(gt,a,b):
return a>b if gt else a<b