2013-03-05 2 views
1

Я делаю свои первые попытки на Python.Как установить атрибут во вложенном объекте в 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 '' 

, но я боялся, что это было не так просто, как это ...

Вопрос:
Как обновить значение last в моих используя объект setattr? Или существует другой способ обновления атрибутов вложенных объектов?

+0

«... но я боялся, что это было не так просто, как это ...»? На самом деле это легче, чем вы думали. Похоже, это помогло бы ознакомиться с Python [структурами данных] (http://docs.python.org/2/tutorial/datastructures.html), такими как [словарь] (http://docs.python.org/ 2/учебник/datastructures.html # словари). –

+0

хорошо ... true. Первый день с Python :-) – frequent

ответ

1

Я думаю, что вам нужно сделать, это:

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

Как setattr нуждается в строке имени атрибута, который будет установлен

+0

, похоже, не работает. Также я могу использовать 'setattr' дальше в коде с помощью' res ["user"] ' – frequent

+0

@frequeent Но что вам нужно? Вы хотите, чтобы машина имела атрибут last, или вы хотите, чтобы у него был атрибут, имя которого находится внутри переменной? –

+0

машина должна иметь атрибут 'last' со временем записи в журнале – frequent

0

Я не понимаю, почему, но я могу установить значение из last, как это:

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

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

    print machine 

Если кто-то может объяснить, было бы неплохо :-)

+4

'machine' является' dict'. Вот почему вы можете установить значение '' last ''. – mike

1

Не используйте setattr. Просто присвойте значение значению "last" для каждого словаря machine.

(на самом деле вы ответили на свой вопрос!)