繁体   English   中英

python“ in”运算符反映魔术方法

[英]python “in” operator reflected magic method

| 运算符有两种魔术方法,正常的和反射的。

# object + other
__or__(self, other)
    # Implements bitwise or using the | operator.

# other + object
__ror__(self, other)
    # Implements reflected bitwise or using the | operator.

in运算符只有一种魔术方法。

# item in object
__contains__(self, item)
    # __contains__ defines behavior for membership tests using in and not in.

如何in操作员反映魔术方法中实现?

# object in sequence
__rcontains__(self, sequence):
    # defines behavior for self in or not in sequence

当您要实现sql条件时,它将很有用

class Field(object):
    def __lt__(self, other):
        return '<', self._value, other

Model.objects.filter(Field('a') > 1)
Model.objects.filter(Field('a') in [1, 2, 3, 4])

您不能这样做,因为in运算符在语义上与对象“包含”另一个对象的定义相关。 因此,必须在容器类(此处为list )中定义操作,而不是在值( Field )中定义。

为了说明这一点, in您的情况下,应像这样使用:

Field('a') in [Field('a'), Field('b'), Field('c')]

当然,这不是您想要的。

正如您在注释中所提到的,最接近您想要的是使用类似Django的fieldname__in==[1, 2, 3, 4]或SQLAlchemy的Table.fieldname.in_([1, 2, 3, 4]) 例如,您可以向Field添加一个方法:

Field('a').is_in([1, 2, 3])

另一种方法是创建一个特定的容器类,以便您可以编写:

Field('a') in Values([1, 2, 3])

但是它不仅更冗长(需要额外导入),而且我认为很难理解背后的实际情况。

这也将起作用:

Field('a') == [1, 2, 3]

但是同样,由于它不尊重==的语义,因此感觉更加“神奇”和混乱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM