V2EX 首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Flask

这种语法是怎么实现的?

  •  
  •   cevincheung · 9 天前 · 2391 次点击
    model.query.filter(model.c.filed1 > model.c.cfiled2).all()
    

    model.c.field1 > model.c.field2 这不是个比较语句么?不是会把结果当成参数传进去么?

    18 回复  |  直到 2017-10-13 15:42:03 +08:00
        1
    Morriaty   9 天前
    def __gt__(self, other):
    if self.data > other.data:
    return "condition_string_one"
    else:
    return "two"
        2
    cevincheung   9 天前
    @Morriaty #1

    所以像其他的等于、数组、json 都是这样?
        3
    guoziyan   9 天前
    scala 会认为是 lambda python 也是这么处理的吗
        4
    jakes   9 天前 via iPhone
    操作符重载
        5
    xmcp   9 天前 via iPhone
    这应该是这个库的一个语法糖。让__lt__返回一个奇怪的对象传到 filter 里。
        6
    jyf   9 天前
    python 的 orm 库里好多这种 都是生成器把戏 这个会重载生成器 然后分析你原始的输入 替换成相应的 sql
        7
    raiz   8 天前
    应该是重载运算符,返回一个 callable 对象,filter 函数里回调这个方法吧
        8
    northisland   8 天前
    一直觉得 numpy 是个比较神的库

    竟然有
    mat_a[...] = mat_b[:, 1, :, :] 这种操作。谁知道这种运算符是咋搞出来的?没时间查源码。
        9
    ToughGuy   8 天前
    这不就登录传一个 bool 值进去么, 有神码奇怪的。
        10
    ToughGuy   8 天前
    In [1]: x = lambda x: print(x)
    In [2]: x(1>2)
    False
    In [3]: x(1>0)
    True
        11
    ToughGuy   8 天前
    额 上面例子匿名函数变量名和参数一样, 看起来有点奇怪。

    In [1]: x = lambda y: print(y)
    In [2]: x(1>2)
    False
    In [3]: x(1>0)
    True
    In [4]: print(1>2)
    False
    In [5]: print(1>0)
    True
        12
    xmcp   8 天前
    @ToughGuy 不好意思,这还真不是一个 bool 值,那行代码的作用是按照那两列的大小关系筛选数据库
        13
    linuxchild   8 天前
    重构了吧 - -
        14
    CSM   8 天前   ♥ 1
    @northisland Python 里的 `...` 是 `ellipsis` 的实例,又名 `Ellipsis`:
    >>> ...
    Ellipsis
    >>> ... is Ellipsis
    True
    >>> type(Ellipsis)
    <class 'ellipsis'>

    而 `mat_b[:, 1, :, :] ` 就是个多维切片嘛。。。
        15
    yonka   8 天前
    class Field:
    def field_value(self, o):
    return getattr(o, field_name) # field_name 用 meta class 等机制得到
    def __gt__(self, other):
    return lambda o: cmp(self.field_value(o), other.field_value(o))
        16
    weifding   8 天前
    就是个匿名函数。
        17
    msg7086   8 天前
    大致可以理解成 model.c.filed1.__gt__(model.c.cfiled2) 。
    DSL 里比较常用的技巧,重载各种运算符然后返回各种构造器并且内部构建语法树。
        18
    ToughGuy   7 天前
    @xmcp

    被表象迷惑了, 哈哈哈哈。
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1581 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 59ms · UTC 06:53 · PVG 14:53 · LAX 23:53 · JFK 02:53
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1