Найти - Пользователи
Полная версия: вывести пользовательские атрибуты объекта
Начало » Python для новичков » вывести пользовательские атрибуты объекта
1
zlodiak
пожалуйста помогите записать функцию 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)

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

JOHN_16
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. остальной код не комментирую, ибо задача была четко расписана
zlodiak
да, остальной код ужасненький, это я и сам знаю)

спасибо за подсказку и за ссылку. но поясните ещё пожалуйста следующее.
как я понял, в вашем коде вместо a нужно подставить record? но после запуска outputDB() в таком виде консоль выводит такое сообщение об ошибке:
print('\n'.join())
AttributeError: ‘str’ object has no attribute ‘__dict__’

что я сделал неправильно?..
JOHN_16
zlodiak
прошу прощения, код не исправил при копипасте:
    for record in db:
       print('\n'.join([str(getattr(db[record],key)) for key in db[record].__dict__.keys()]))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB