将逻辑运算符(和部分表达式)传入函数参数Python
在SQLAlchemy中,可以执行以下操作:将逻辑运算符(和部分表达式)传入函数参数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
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))