将表达式传递给python中的函数?

Ian*_*n P 17 python arguments function operators

我不太清楚我的意思,所以请耐心等待..

在sqlalchemy中,似乎我应该传递一个表达式?到过滤器()在某些情况下.当我尝试自己实现这样的东西时,我最终得到:

>>> def someFunc(value):
...    print(value)

>>> someFunc(5 == 5)
True
Run Code Online (Sandbox Code Playgroud)

如何从函数内部获取传递给==的值?

编辑:我正在努力实现这样的目标

 >>> def magic(left, op, right):
 ...    print(left+" "+op+" "+right)

 >>> magic(5 == 5)
 5 == 5
Run Code Online (Sandbox Code Playgroud)

编辑:如果其中一个参数是一个对象怎么办?

Nel*_*son 26

如果你将"op"作为一个函数,你可以实现你的例子:

>>> def magic(left, op, right):
...     return op(left, right)
...
>>> magic(5, (lambda a, b: a == b), 5)
True
>>> magic(5, (lambda a, b: a == b), 4)
False
Run Code Online (Sandbox Code Playgroud)

这比传递一个字符串更像Pythonic.这就是sort()这样的函数的工作方式.

那些带有filter()的SQLAlchemy示例令人费解.我不知道关于SQLAlchemy的内部结构,但我猜测像query.filter(User.name =='ed')这样的例子是User.name是一个SQLAlchemy特有的类型,有一个奇怪的__eq()函数的实现,它为filter()函数生成SQL而不是进行比较.即:他们创建了特殊的类,允许您键入发出SQL代码的Python表达式.这是一种不寻常的技术,我除了建立一些像ORM这样的桥接两种语言之外的东西.

  • 是的,但是由于lambda的内部参数,将它放在括号中会使得在这种情况下更容易阅读. (4认同)

Ned*_*ily 7

Nelson解决方案的更加pythonic变体是使用标准库中的操作员模块的操作员功能; 没有必要创建自己的lambdas.

>>> from operator import eq
>>> def magic(left, op, right):
...   return op(left, right)
... 
>>> magic(5, eq, 5)
True
Run Code Online (Sandbox Code Playgroud)