【问题标题】:KeyError: 'chris' - what is the problem actually?KeyError: 'chris' - 实际上是什么问题?
【发布时间】:2020-10-21 12:51:42
【问题描述】:

问题是要打印一个公司的几台机器上的用户登录或注销的用户报告和他们当前的状态。

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 notebook 上遇到错误。

    ---------------------------------------------------------------------------
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 没有的结果?

【问题讨论】:

  • 我在 pycharm 中遇到同样的错误。你确定 events 列表在 pycharm 和 jupyter notebook 中是一样的吗?

标签: python-3.x oop


【解决方案1】:

在您的代码中,对于用户 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)

【讨论】:

    【解决方案2】:

    嗯,'chris' 已注销但从未登录。

    如果找不到该密钥,remove 将失败。

    您应该在删除之前检查用户是否包含在machines[event.machine] 中。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:
          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)
          

          我添加了更多检查以防万一。

          【讨论】:

            猜你喜欢
            • 2016-04-08
            • 2020-12-19
            • 2010-12-07
            • 1970-01-01
            • 2021-05-12
            • 2011-08-01
            • 2011-12-26
            • 1970-01-01
            • 2018-09-26
            相关资源
            最近更新 更多