传递表达到函数?

2024-09-28 20:18:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我不太清楚我在这里的意思,所以请容忍我。。

在SQLAlchemy中,在某些情况下,我似乎应该将表达式传递给^{}。当我自己尝试实现这样的事情时,我最终得到了:

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

>>> someFunc(5 == 5)
True

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

我在努力实现这样的目标

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

 >>> magic(5 == 5)
 5 == 5

如果其中一个参数是对象呢?


Tags: 函数righttrue目标sqlalchemyvalue表达式def
3条回答

不能。表达式5 == 5被求值,然后结果才传递给someFunc。不管表达式是什么,函数只得到True(确切地说,是True对象)。

编辑:关于您的编辑,this question有点接近。

编辑2:可以将表达式作为字符串传递并使用eval,如下所示:

>>> def someFunc(expression_string):
...    print(expression_string, "evaluates to", eval(expression_string))

>>> someFunc("5 == 5")
5 == 5 evaluates to True

不知道这对你有没有帮助。请记住eval是一个强大的工具,因此将任意(甚至可能是用户生成的)输入传递给它是危险的。

如果将“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

这比传递字符串更像是Python。这就是像^{}这样的函数的工作原理。

那些带有filter()的SQLAlchemy示例令人费解。我不知道SQLAlchemy的内部原理,但我猜在一个类似query.filter(User.name == 'ed')的例子中,User.name是一个特定于SQLAlchemy的类型,有一个__eq()函数的奇怪实现,它为filter()函数生成SQL,而不是进行比较。Ie:他们制作了一些特殊的类,可以让您键入发出SQL代码的Python表达式。这是一种不寻常的技术,除非构建一种连接两种语言的东西,比如ORM,否则我会避免这种技术。

纳尔逊解决方案的一个更像Python的变体是使用标准库中operator模块中的运算符函数;不需要创建自己的lambdas。

>>> from operator import eq
>>> def magic(left, op, right):
...   return op(left, right)
... 
>>> magic(5, eq, 5)
True

相关问题 更多 >