Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 22, 2014 10:58:27

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

вывести пользовательские атрибуты объекта

пожалуйста помогите записать функцию outputDB() в более короткой форме

import shelve
class Record:
    def __init__(self, temp):
        print('rrr')
        self.id = temp['id']
        self.type = temp['type']
        self.number = temp['number']
        self.video = temp['video']
        self.audio = temp['audio']
        
db = shelve.open('data')
keys = ['id', 'type', 'number', 'video', 'audio'];
def outputDB():
    print('---------------------------------------------')
    for record in db:
        print(record, ': ', end = '\n')
        print(db[record].id, end = '\n')
        print(db[record].type, end = '\n')
        print(db[record].number, end = '\n')
        print(db[record].video, end = '\n')
        print(db[record].audio, end = '\n')
        print('=================')
while 1:
    action = int(input('1 - print, 2 - write'))
    if(action == 1):
        outputDB()
        break
    else:
        temp = {}
        for key in keys:
            print('enter value for ', key)
            value = input('enter value: ')
            if '___' in value:
                    temp[key] = value.split('___')
            else:
                    temp[key] = value			
                
        while 1:
            print('exists indexes: \n')
            keys = []
            for k in db:
                print(k, end = "\n")
                keys.append(k)
            print(keys)    
            index = input('enter index')
            if(index in keys):
                print('index exist')
            else:
                db[index] = Record(temp)
                break                
db.close()
print('stop')
dir(db)

проблема в том, что мне приходится при выводе перечислять каждый атрибут. нельзя ли записать короче? например с использованием цикла

Офлайн

#2 Янв. 22, 2014 11:56:51

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

вывести пользовательские атрибуты объекта

zlodiak
если объект db может быть приведен с помощью __dict__ то можно так, используя join и генератор списка

def outputDB()
    print('---------------------------------------------')
    for record in db:
         print('\n'.join([str(getattr(a,key)) for key in a.__dict__.keys()]))
    print('=================')

P.S. остальной код не комментирую, ибо задача была четко расписана



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Янв. 22, 2014 12:47:35

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

вывести пользовательские атрибуты объекта

да, остальной код ужасненький, это я и сам знаю)

спасибо за подсказку и за ссылку. но поясните ещё пожалуйста следующее.
как я понял, в вашем коде вместо a нужно подставить record? но после запуска outputDB() в таком виде консоль выводит такое сообщение об ошибке:

print('\n'.join())
AttributeError: ‘str’ object has no attribute ‘__dict__’

что я сделал неправильно?..

Офлайн

#4 Янв. 22, 2014 23:55:28

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

вывести пользовательские атрибуты объекта

zlodiak
прошу прощения, код не исправил при копипасте:

    for record in db:
       print('\n'.join([str(getattr(db[record],key)) for key in db[record].__dict__.keys()]))



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version