我正在尝试扩展下面的'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函数必须支持高级查询,例如:
- 返回所有居住在纽约市的人,他们的职业要么是律师,要么是工程师
- 返回所有居住在(纽约市或西雅图市(或其职业是律师的人
- 返回所有居住在(纽约市或西雅图市(并且他们的职业是律师的人
- 返回所有居住在纽约市和Age>40
- 返回所有从事会计或年龄的人员>30
- 更多这样的组合
如何在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'])