我有一个Employee类,我想返回“名称”列表。
class Employee(object):
def __init__(self, id, name, members=None):
self.id = id
self.name = name
self.members = members
self.is_team = members is not None
通过数据馈送,实例创建一个Employee对象。
from employee import Employee
anne = Employee(0, 'Anne')
bob = Employee(1, 'Bob')
carlos = Employee(2, 'Carlos')
carol = Employee(3, 'Carol')
charlie = Employee(4, 'Charlie')
cherry = Employee(5, 'Cherry')
dave = Employee(6, 'Dave')
emma = Employee(7, 'Emma')
mary = Employee(8, 'Mary')
peggy = Employee(9, 'Peggy')
trent = Employee(10, 'Trent')
admin = Employee(90, 'Admin', [anne, bob, carlos])
engineering = Employee(91, 'Engineering', [carlos, trent, bob])
catering = Employee(92, 'Catering', [emma, anne, bob])
people = [anne, bob, carlos, carol, charlie, cherry, dave, emma, mary,
peggy, trent, admin, engineering, catering]
到目前为止,我的解决方案,
import feed
def get_names(person, e_list):
try:
for p in e_list:
if p == person and p in e_list:
print(p.name)
except AttributeError:
print('Not found')
print([e.name for e in get_names(feed.carlos, feed.people)])
我希望返回的数据是:
['Admin', 'Catering']
因为卡洛斯属于两者。
答案 0 :(得分:1)
我可以用OOP解决此问题:
class Employee(object):
def __init__(self, id, name):
self.id = id
self.name = name
self.teams = []
class Team(Employee):
teams = []
def __init__(self, id, name, members):
super().__init__(id, name)
self.members = members
for member in self.members:
member.teams.append(name)
self.__class__.teams.append(self)
@classmethod
def find_employee_teams(cls, person):
found_teams = []
if isinstance(person, str):
for team in cls.teams:
for member in team.members:
if member.name == person:
found_teams.append(team.name)
return found_teams
elif isinstance(person, Employee):
return person.teams
# TODO error handling in case person is neither
carlos = Employee(2, 'Carlos')
admin = Team(90, 'Admin', [carlos])
engineering = Team(91, 'Engineering', [carlos])
print(Team.find_employee_teams('Carlos'))
print(Team.find_employee_teams(carlos))
输出
['Admin', 'Engineering']
['Admin', 'Engineering']
find_employee_teams
应该用Employee
而不是Team
来实现。
答案 1 :(得分:0)
您应该检查该人的成员列表。
import feed
def get_names(person, e_list):
try:
for p in e_list:
all_members = p.members
if all_members and person in all_members:
print(p.name)
yield p
except AttributeError:
print('Not found')
print([e.name for e in get_names(feed.carlos, feed.people)])
答案 2 :(得分:0)
您应该在自己的班级中代表一个团队。团队不是员工。这样,您可以使代码更易于阅读和理解。
class Employee(object):
employees = set()
def __init__(self, id, name):
self.id = id
self.name = name
Employee.employees.add(self)
def in_teams(self):
""" Return the teams an employee is member of. """
teams = []
for team, members in Team.teams.items():
if self in members:
teams.append(team)
continue
return teams
class Team(object):
teams = dict()
def __init__(self, name, members=None):
self.name = name
if members:
self.members = members
else:
self.members = set()
Team.teams[self.name] = self.members
def add_member(self, employee):
""" Add an employee to the team. """
if employee not in self.members:
self.members.add(employee)
def rm_member(self, employee):
""" Remove an employee from the team. """
if employee in self.members:
self.members.remove(employee)
if __name__ == "__main__":
# Employees
anne = Employee(0, "Anne")
bob = Employee(1, "Bob")
carlos = Employee(2, "Carlos")
trent = Employee(10, "Trent")
dave = Employee(6, "Dave")
# Teams
admins = Team("admin", {anne, bob, carlos})
engineering = Team("engineering", {carlos, trent, bob})
engineering.rm_member(trent)
engineering.add_member(dave)
for employee in Employee.employees:
teams = employee.in_teams()
if teams:
print(f"{employee.name} is in the teams {teams}.")
else:
print(f"{employee.name} is in no team.")
答案 3 :(得分:0)
在打印和返回函数值之间,您会感到困惑。您当前的代码会打印出一些内容(无论如何都不是您想要的内容),但返回None。
此外,您的测试是完全错误的:您应扫描<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^preview/(.+)$ /preview/index.php?tslug=$1&cat=$2 [QSA,L]
</IfModule>
以查看团队,并查看e_list
是否是团队成员。
代码可能变为:
person
话虽这么说,团队不应该是名为 Employee 的类的成员。您最好构建一个类的层次结构:
def get_names(person, e_list):
return [t.name for t in e_list if t.is_team and person in t.members]
这样,角色可以是团队或员工。