将逻辑运算符(和部分表达式)传入函数参数Python

将逻辑运算符(和部分表达式)传入函数参数Python,python,sqlalchemy,logical-operators,Python,Sqlalchemy,Logical Operators,在SQLAlchemy中,可以执行以下操作: mytable.query.filter(mytable.some_col < 5).all() 您可以传递lambda函数来执行此操作;然后将它们作为任何正常函数进行处理: >>> def someFunction (condition): return [row for row in range(100) if condition(row)] >>> someFunction(lambd

在SQLAlchemy中,可以执行以下操作:

mytable.query.filter(mytable.some_col < 5).all()

您可以传递lambda函数来执行此操作;然后将它们作为任何正常函数进行处理:

>>> def someFunction (condition):
        return [row for row in range(100) if condition(row)]
>>> someFunction(lambda x: x % 11 == 0)
[0, 11, 22, 33, 44, 55, 66, 77, 88, 99]
>>> someFunction(lambda x: x % 23 == 0)
[0, 23, 46, 69, 92]
当然,您也可以传递更复杂的对象并对其进行更复杂的检查,而不是像我的示例中那样传递简单的int对象,例如:

lambda x: x.someOtherProperty.evenAMethod('with a parameter') > 42

对于问题中的具体示例:更改
table_obj.filter
以调用
condition
参数,并将行作为参数:

def filter(self, condition):
    return table_obj([row for row in self.rows if condition(row)])
    #                                                      ^^^^^
    #                                                     new part
然后,可以使用lambda表达式指定过滤器:

 print a.filter(lambda row_obj: row_obj.val3 == 7)
 #              ^^^^^^^^^^^^^^^
 #                 new part

这将为您提供理想的结果。

正如您所提到的,SQLAlchemy允许以下表达式:

mytable.query.filter(mytable.some_col < 5).all()

你也可以做同样的事情来达到同样的效果。

不幸的是,这有点琐碎,而且实现起来有点粗糙,但是你可以这样做

import operator
class Comparator:
     def __init__(self,fieldName,compareToValue,my_operator):
         self.op = my_operator
         self.field = fieldName
         self.comparedTo = compareToValue
     def __call__(self,row):
         my_row_val = getattr(row,self.field)
         return self.op(my_row_val,self.comparedTo)
class row_obj:
    class RowItem:
         def __init__(self,name):
              self.name = name
         def __eq__(self,other):
             return Comparator(self.name,other,operator.eq)
    val1 = RowItem("val1")
    val2 = RowItem("val2")
    val3 = RowItem("val3")
    val4 = RowItem("val4")

    def __init__(self, val1, val2, val3, val4):
        self.val1 = val1
        self.val2 = val2
        self.val3 = val3
        self.val4 = val4
    def __str__(self):
        return str([self.val1,self.val2,self.val3,self.val4])
    def __repr__(self):
        return str(self)


class MyTable:
    def __init__(self,rows):
        self.rows = rows
    def filter(self,condition):
        for row in self.rows:
            if condition(row):
               yield row

rows = [row_obj(1,2,3,4),row_obj(1,2,7,4),row_obj(1,2,3,4),row_obj(7,7,7,7)]
mytable = MyTable(rows)
print list(mytable.filter(row_obj.val3 == 7))

这不仅仅是为了让您了解您必须选择的路径,这将是非常重要的(并且有点粗糙)

这并不是在解决问题-如果不清楚,很抱歉,但我想为上面定义的对象引用特定列。@mgoldwaser是的,它很好地解决了问题。请参阅我的编辑,了解如何将概念转换为您的确切示例。这是可行的,但为什么不可行:
打印列表(mytable.filter(row_obj.val3==7或True))
>>> User.first_name == 'John'
<sqlalchemy.sql.elements.BinaryExpression object at 0x10f0991d0>
import operator
class Comparator:
     def __init__(self,fieldName,compareToValue,my_operator):
         self.op = my_operator
         self.field = fieldName
         self.comparedTo = compareToValue
     def __call__(self,row):
         my_row_val = getattr(row,self.field)
         return self.op(my_row_val,self.comparedTo)
class row_obj:
    class RowItem:
         def __init__(self,name):
              self.name = name
         def __eq__(self,other):
             return Comparator(self.name,other,operator.eq)
    val1 = RowItem("val1")
    val2 = RowItem("val2")
    val3 = RowItem("val3")
    val4 = RowItem("val4")

    def __init__(self, val1, val2, val3, val4):
        self.val1 = val1
        self.val2 = val2
        self.val3 = val3
        self.val4 = val4
    def __str__(self):
        return str([self.val1,self.val2,self.val3,self.val4])
    def __repr__(self):
        return str(self)


class MyTable:
    def __init__(self,rows):
        self.rows = rows
    def filter(self,condition):
        for row in self.rows:
            if condition(row):
               yield row

rows = [row_obj(1,2,3,4),row_obj(1,2,7,4),row_obj(1,2,3,4),row_obj(7,7,7,7)]
mytable = MyTable(rows)
print list(mytable.filter(row_obj.val3 == 7))