python-3.x KeyError:'chris' -实际上是什么问题?

35g0bw71  于 2023-04-13  发布在  Python
关注(0)|答案(5)|浏览(122)

这个问题是关于打印报告的用户和他们的当前状态的员工做登录或注销在几台机器上的公司。

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没有显示的?

k7fdbhmy

k7fdbhmy1#

在您的代码中,对于用户chris,没有login的条目。因此,在current_users()函数中,当它遇到chris的条目时,它试图从集合中删除该元素。
但是machines['mailserver.local']在那个集合中没有chris的条目。由于没有这样的条目,您会得到上面提到的错误。
一个简单的解决方案是在尝试删除条目之前检查条目是否存在于集合中。

elif event.type == "logout" and event.user in machines[event.machine]:
    machines[event.machine].remove(event.user)
7hiiyaii

7hiiyaii2#

嗯,“克里斯”注销了,但从未登录过。
remove失败,如果没有找到该键。
在删除machines[event.machine]之前,您应该检查该用户是否包含在其中。

if event.user in machines[event.machine]:
    machines[event.machine].remove(event.user)
idfiyjo8

idfiyjo83#

chris在没有登录的情况下注销,您应该添加一个条件来检查用户是否注销并且他的名字在机器中[event.users]

elif event.type == "logout" and event.user in machines[event.machine] :
  machines[event.machine].remove(event.user)
uoifb46i

uoifb46i4#

current_user函数中,只需在if语句后添加一行

elif event.type=="logout" and event.user not in machines[event.machine]:
    continue
kninwzqo

kninwzqo5#

elif event.type == "logout":
    for login_event in events:
        if (login_event.user == event.user) and (login_event.type == "login") and (login_event.date < event.date) and (login_event.machine == event.machine):
            machines[event.machine].remove(event.user)

我多加了几张支票以防万一。

相关问题