【问题标题】:how to set an attribute in a nested object in Python?如何在 Python 的嵌套对象中设置属性?
【发布时间】:2013-03-05 16:16:43
【问题描述】:

我正在第一次尝试 Python。

我需要遍历日志,解析日志条目,然后更新一个对象,其中包括日志中列出的机器的嵌套对象。

这就是我所拥有的:

import re
format_pat= re.compile( 
    r"(?P<host>(?:[\d\.]|[\da-fA-F:])+)\s" 
    r"(?P<identity>\S*)\s" 
    r"(?P<user>\S*)\s"
    r"\[(?P<time>.*?)\]\s"
    r'"(?P<request>.*?)"\s'
    r"(?P<status>\d+)\s"
    r"(?P<bytes>\S*)\s"
    r'"(?P<referer>.*?)"\s'
    r'"(?P<user_agent>.*?)"\s*' 
)

from json import JSONEncoder
class MyEncoder(JSONEncoder):
    def default(self, o):
      return o.__dict__ 

# JSON response object
class ResponseObject(object):
    def __init__(self, dict):
      self.__dict__ = dict


# check for JSON response object
try:
    obj
except NameError:
    obj = ResponseObject({})

test = ['2001:470:1f14:169:15f3:824f:8a61:7b59 - SOFTINST [14/Nov/2012:09:32:31 +0100] "POST /setComputer HTTP/1.1" 200 4 "-" "-" 102356']

# log loop
for line in test:
  try:
    # try to create object from log entry
    m = format_pat.match(line)
    if m:
      res = m.groupdict()
      res["status"] = int(res["status"])

      # register machine if not done
      if not hasattr(obj, res["user"]):
        setattr(obj, res["user"], {"downtime":"0","flag":"false","downstart":"0","init":res["time"],"last":"","uptime":"","downtime":"","totaltime":""})


      machine = getattr(obj, res["user"])
      flag = machine["flag"]
      start = machine["downstart"]
      down = machine["downtime"]
      last = machine["last"]

      print "done"
      # set last
      last = res["time"]

      # PROBLEM this does not work
      setattr(machine, last, res["time"])
      print machine

    else:
      print "nope"
  except:
      print "nope base"

print MyEncoder().encode(obj)

我在尝试setattr() 时遇到的错误是

AttributeError: 'dict' object has no attribute ''

但我怕没有这么简单……

问题:
如何使用“setattr”更新嵌套对象中的last 值?还是有另一种更新嵌套对象属性的方法?

【问题讨论】:

  • "...但我怕没有这么简单..."?它实际上比您想象的更容易。听起来这有助于熟悉 Python data structures,例如 dictionary
  • 嗯……是的。使用 Python 的第一天 :-)

标签: python object nested nested-attributes setattr


【解决方案1】:

我认为你需要这样做:

setattr(machine, 'last', res["time"])

由于setattr需要设置属性名称的字符串

【讨论】:

  • 似乎不起作用。我也可以在代码中使用setattr 进一步使用res["user"]
  • @frequeent 但是你想要什么?您希望机器有一个名为 last 的属性,还是希望它有一个名称在变量 last 内的属性?
  • 机器应该有一个属性last与日志条目的时间
  • @frequent 好的,那么您需要完全按照我的回答进行操作,您遇到了什么错误?
  • 还是一样的错误 'AttributeError: 'dict' object has no attribute 'last''。不过你的回答很有道理。我不明白为什么它不起作用。
【解决方案2】:

不要使用setattr。只需为每个 machine 字典的 "last" 键分配一个值。

(实际上你回答了你自己的问题!)

【讨论】:

    【解决方案3】:

    我不明白为什么,但我可以像这样设置last 的值:

      print machine
      print machine["last"]
      print res["time"]
    
      # this works
      machine["last"] = res["time"]
    
      print machine
    

    如果有人能解释一下,那就太好了:-)

    【讨论】:

    • machinedict。这就是为什么你可以设置"last"键的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多