将带有值的比较运算符传递给函数

Passing a comparison operator with a value into a function

我正在定义一个函数,其中一个参数应该是一个比较运算符。

我尝试过不同版本的转换命令,例如 float 和 input

我正在尝试的代码:

def factor_test(factor1, factor2, criteria1, text, criteria2):
    bool_mask1 = rnt2[factor1].str.contains(criteria1,na=False)
    bool_mask2 = rnt2[factor2] criteria2
    # Returns values that are TRUE i.e. an error, not an Boolean dataframe but actual values
    test_name = rnt2[(bool_mask1) & (bool_mask2)] 

criteria2 应该是 > 0.75:

bool_mask2 = rnt2[factor2] > 0.75

最好是一个参数,我可以同时输入>0.75,该函数应该使用大约15次,!===<.

使用operator模块:

def factor_test(factor1, factor2, criteria1, text, criteria2, op):
    bool_mask1 = rnt2[factor1].str.contains(criteria1,na=False)
    bool_mask2 = op(rnt2[factor2], criteria2)
    test_name = rnt2[(bool_mask1) & (bool_mask2)] 

然后用不同的运营商打电话:

import operator

factor_test(factor1, factor2, criteria1, text, criteria2, operator.le)  # <=
factor_test(factor1, factor2, criteria1, text, criteria2, operator.eq)  # ==
# etc

如果您想将比较运算符及其值作为一个参数传递,您有多种选择:

  1. 使用operator functions and functools.partial:

    import operator
    from functools import partial
    
    # simple example function
    def my_function(condition):
        return condition(1)
    
    two_greater_than = partial(operator.gt, 2)
    my_function(two_greater_than)
    # True
    
  2. 使用dunder methods:

    two_greater_than = (2).__gt__
    my_function(two_greater_than)
    # True
    
  3. 使用lambda(如

    two_greater_than = lambda x: 2 > x
    my_function(two_greater_than)
    # True
    
  4. 使用函数:

    def two_greater_than(x):
        return 2 > x
    
    my_function(two_greater_than)
    # True
    

将这些方法中的任何一种应用于带有多个参数的函数应该是微不足道的。