1

私は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または、ネストされたオブジェクト属性を更新する別の方法はありますか?

4

3 に答える 3

1

使用しないでくださいsetattr。各辞書の"last"キーに値を割り当てるだけです。machine

(実際にあなたはあなた自身の質問に答えました!)

于 2013-03-05T17:13:26.823 に答える
1

これを行う必要があると思います:

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

setattrには、設定する属性の名前の文字列が必要です。

于 2013-03-05T16:21:31.360 に答える
0

理由はわかりませんが、次のlastように値を設定できます。

  print machine
  print machine["last"]
  print res["time"]

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

  print machine

誰かが説明できるなら、いいでしょう:-)

于 2013-03-05T16:39:07.320 に答える