Передача оператора сравнения со значением в функцию - PullRequest
0 голосов
/ 09 июля 2019

Я определяю функцию, где один параметр должен быть оператором сравнения.

Я пробовал разные версии команд преобразования, таких как 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 раз, с !=, == и <.

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Если вы хотите передать и оператор сравнения, и его значение в качестве одного аргумента, у вас есть несколько вариантов:

  1. Использование operator функций и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. Использование более сложных методов :

    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
    

Применение любого из этих подходов к вашей функции с несколькими аргументами должно быть тривиальным.

0 голосов
/ 09 июля 2019

Используйте модуль 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
...