筛选Python对象



我正在尝试扩展下面的'get_people'Python函数。

def get_people(profession, cities):
all_people = _load_people() # loads all_people from in-mem cache.
data = []
for people in all_people:
if people.profession is profession and people.address.city in cities:
data.append(people)
return data

class People:
def __init__(self, first, last, age, profession, address):
self.first = first
self.last = last 
self.age = age
self.profression = profession
self.address = address

def __repr__(self):
return self.first + " " + self.last + " " + str(self.age) 

class Address:
def __init__(self, city, street, zipcode):
self.city = city
self.street = street
self.zipcode = zipcode

现在get_people((python函数必须支持高级查询,例如:

  1. 返回所有居住在纽约市的人,他们的职业要么是律师,要么是工程师
  2. 返回所有居住在(纽约市或西雅图市(或其职业是律师的人
  3. 返回所有居住在(纽约市或西雅图市(并且他们的职业是律师的人
  4. 返回所有居住在纽约市和Age>40
  5. 返回所有从事会计或年龄的人员>30
  6. 更多这样的组合

如何在get_people((函数中接受这样的过滤输入?我想设计PersonFilter类,并将PersonFilter类作为get_person函数的输入。

任何设计PersonFilter类的领导都将不胜感激。

实现这一点的更简单、更灵活的方法是将filter作为get_people函数参数传递。此功能将接收一个People对象:

def get_people(filter):
all_people = _load_people() # loads all_people from in-mem cache.
data = []
for people in all_people:
if filter(people):
data.append(people)
return data

在您的第一个查询中,例如:

返回所有居住在纽约市的人,他们的职业是要么是律师,要么是工程师。

你可以制作这样的东西:

people = get_people(lambda people: people.addres.city == 'New York'
and people.profession in ['lawyer', 'engenier'])

最新更新