Namedtuple 大于或小于给出意外结果的运算符
Namedtuple greater than or less than operators giving unexpected result
使用 namedtuples 时,对象似乎有一个默认的 "value",允许使用 < >
运算符比较两个命名元组。任何人都可以解释这个值来自哪里或者为什么这个代码 returns True
?有没有一种聪明的方法可以让 >
运算符在不使用 Person.age
的情况下比较年龄?
>>>from collections import namedtuple
>>>Person = namedtuple('Person', ['age', 'name'])
>>>bob = Person('20', 'bob')
>>>jim = Person('20', 'jim')
>>>bob < jim
True
你可以这样做:
from collections import namedtuple
class Person(namedtuple('Person', ['age', 'name'])):
def __gt__(self, other):
return self.age > other.age
def __lt__(self, other):
return self.age < other.age
def __eq__(self, other):
return self.age == other.age
但是,Person
小于或大于年龄真的有意义吗?为什么不明确检查 Person.age
?
似乎是在使用字符串比较,只是连接值:
>>> Person = namedtuple('Person', ['age', 'name'])
>>> bob = Person('20', 'bob')
>>> jim = Person('20', 'jim')
>>> bob < jim
True
>>> bob = Person('20', 'jin')
>>> bob < jim
False
>>> bob = Person('20', 'jim')
>>> bob < jim
False
>>> bob = Person('21', 'jim')
>>> bob < jim
False
>>> bob = Person('19', 'jim')
>>> bob < jim
True
使用 namedtuples 时,对象似乎有一个默认的 "value",允许使用 < >
运算符比较两个命名元组。任何人都可以解释这个值来自哪里或者为什么这个代码 returns True
?有没有一种聪明的方法可以让 >
运算符在不使用 Person.age
的情况下比较年龄?
>>>from collections import namedtuple
>>>Person = namedtuple('Person', ['age', 'name'])
>>>bob = Person('20', 'bob')
>>>jim = Person('20', 'jim')
>>>bob < jim
True
你可以这样做:
from collections import namedtuple
class Person(namedtuple('Person', ['age', 'name'])):
def __gt__(self, other):
return self.age > other.age
def __lt__(self, other):
return self.age < other.age
def __eq__(self, other):
return self.age == other.age
但是,Person
小于或大于年龄真的有意义吗?为什么不明确检查 Person.age
?
似乎是在使用字符串比较,只是连接值:
>>> Person = namedtuple('Person', ['age', 'name'])
>>> bob = Person('20', 'bob')
>>> jim = Person('20', 'jim')
>>> bob < jim
True
>>> bob = Person('20', 'jin')
>>> bob < jim
False
>>> bob = Person('20', 'jim')
>>> bob < jim
False
>>> bob = Person('21', 'jim')
>>> bob < jim
False
>>> bob = Person('19', 'jim')
>>> bob < jim
True