![](/img/trans.png)
[英]Python “magic method” for customizing the behaviour of the in operator
[英]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.