这个问题是关于打印报告的用户和他们的当前状态的员工做登录或注销在几台机器上的公司。
class Event:
def __init__(self, event_date, event_type, machine_name, user):
self.date = event_date
self.type = event_type
self.machine = machine_name
self.user = user
def get_event_date(event):
return event.date
def current_users(events):
events.sort(key=get_event_date)
machines = {}
for event in events:
if event.machine not in machines:
machines[event.machine] = set()
if event.type == "login":
machines[event.machine].add(event.user)
elif event.type == "logout":
machines[event.machine].remove(event.user)
return machines
def generate_report(machines):
for machine, users in machines.items():
if len(users) > 0:
user_list = ", ".join(users)
print("{}: {}".format(machine, user_list))
events = [
Event('2020-01-21 12:45:56', 'login', 'myworkstation.local', 'jordan'),
Event('2020-01-22 15:53:42', 'logout', 'webserver.local', 'jordan'),
Event('2020-01-21 18:53:21', 'login', 'webserver.local', 'lane'),
Event('2020-01-22 10:25:34', 'logout', 'myworkstation.local', 'jordan'),
Event('2020-01-21 08:20:01', 'login', 'webserver.local', 'jordan'),
Event('2020-01-23 11:24:35', 'logout', 'mailserver.local', 'chris'),
]
users = current_users(events)
print(users)
我已经成功编译并在我的pycharm上得到了输出:
{'webserver.local': {'jordan'}}
Process finished with exit code 0
但我得到了一个错误jupyter笔记本电脑。
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-11-46e68509ab0d> in <module>
----> 1 users = current_users(events)
2 print(users)
<ipython-input-8-5fb178c90d75> in current_users(events)
11 machines[event.machine].add(event.user)
12 elif event.type == "logout":
---> 13 machines[event.machine].remove(event.user)
14 return machines
15
KeyError: 'chris'
我知道这是因为我们的事件列表中有一个用户从一台他没有登录过的机器上注销了。
但我的问题是,这样的“chris”keyerror是什么意思,或者为什么我的pycharm编译后显示的结果是jupyter notebook没有显示的?
5条答案
按热度按时间k7fdbhmy1#
在您的代码中,对于用户
chris
,没有login
的条目。因此,在current_users()
函数中,当它遇到chris
的条目时,它试图从集合中删除该元素。但是
machines['mailserver.local']
在那个集合中没有chris
的条目。由于没有这样的条目,您会得到上面提到的错误。一个简单的解决方案是在尝试删除条目之前检查条目是否存在于集合中。
7hiiyaii2#
嗯,“克里斯”注销了,但从未登录过。
remove
失败,如果没有找到该键。在删除
machines[event.machine]
之前,您应该检查该用户是否包含在其中。idfiyjo83#
chris在没有登录的情况下注销,您应该添加一个条件来检查用户是否注销并且他的名字在机器中[event.users]
uoifb46i4#
在
current_user
函数中,只需在if
语句后添加一行kninwzqo5#
我多加了几张支票以防万一。