2013-06-23 3 views
0

Nevermind, кажется, что независимо от того, что такое authorLast, он не распознает его; он дает ту же ошибку. Может быть что-то не так с operator.attrgetter?Атрибут объекта как список

Заранее спасибо.

Короткие, самодостаточная Correct (компилируется), пример:

import operator 

class Source: 
    sources_count = 0 
    list_of_sources = [] 

    def __init__(self, title, author, year, publisher, city_of_publication, summary, type, tags): #basic attributes of Source class with addition to list_of_sources 
     self.title = title 
     self.author = author 
     self.aSplit = author.split() 
     self.authorFirst = self.aSplit[0] 
     self.authorLast = self.aSplit[1] 
     self.year = year 
     self.publisher = publisher 
     self.city_of_publication = city_of_publication 
     self.summary = summary 
     self.type = type 
     self.tags = tags 
     Source.sources_count += 1 
     Source.list_of_sources.append(self) 


s2 = Source("Hi", "Jacob Jenkins", "2013", "Publisher", "City", "Summary", "Print", "this, is, tag") 
s1 = Source("Hoop", "Chelsea Chibbles", "2013", "Publisher", "City", "Summary", "Print", "this, is, tag") 

print(s2.authorFirst) 
print(s2.authorLast) 
print(s1.authorFirst) 
print(s1.authorLast) 

key_last_name = operator.attrgetter("authorLast") 
sorted_list = sorted(Source.list_of_sources, key=key_last_name) 
print(sorted_list[0].authorLast, sorted_list[1].authorLast) 

Не имеет ошибку. Теперь я проверяю остальную часть кода. Как только я выхожу из этих трех частей (класс, метод и функция), он работает нормально. Может быть, это имеет какое-то отношение к травлению.

РЕДАКТИРОВАТЬ: Проблема, похоже, исправлена. Мое подозрение в том, что я замачивал файлы до внесения изменений в атрибуты, поэтому у объектов на самом деле не было указанных атрибутов, потому что они были маринованы до того, как существовали атрибуты. Теперь он отлично работает.

+0

Просьба показать воспроизводимый пример. Кроме того, вы, кажется, смешиваете 'aSplit' и' a_split'. –

+0

Что вы подразумеваете под воспроизводимым примером? – Aristides

+0

В идеале, образец кода, который мы можем запустить. Или, по крайней мере, образец, который позволит нам понять, что происходит. Прямо сейчас мы не знаем, чей '__init__' вы показываете (хотя, вероятно,' Source') и что 'list_of_sources' (вероятно, список всех экземпляров) и как вы создаете экземпляры. Тот факт, что атрибут относится к списку, не должен быть проблемой в любом случае –

ответ

2

После создания списка, пролистать Source.list_of_sources, как это:

for src in Source.list_of_sources: 
    if not hasattr(src, "authorLast"): 
     print (src.aSplit) 

Смотрите, если вы получаете какие-либо экземпляры Source, которые не имеют атрибут authorLast.

EDIT:

Вот безопасный способ присвоить имя/фамилия, в случае, если вы получите автор только с 1 имя:

self.asplit = self.author.split() 
if len(self.asplit) == 1: 
    self.asplit.append('') 
self.authorFirstName = self.asplit[0] 
self.authorLastName = self.asplit[-1] 

Это также помогает, если автор что-то как «F Scott Fitzgerald», давая вам имя «F» и фамилию «Fitzgerald». Явный выбор asplit [1] для фамилии ошибочно дал бы «Скотту».

+0

спасибо, но проблема все еще остается, даже если это не 1 имя – Aristides

+0

Это, вероятно, ответ, который помог мне больше всего. Спасибо! – Aristides

1

У вас должна быть ошибка в другом месте вашего скрипта. attrgetter прекрасно работает для обеих строк и списков:

>>> from operator import attrgetter 
>>> class Book: 
    def __init__(self, author): 
     self.author_split = author.split() 
     self.author_first = self.author_split[0] 
     self.author_last = self.author_split[1] 
    def __repr__(self): 
     return 'Book(%r)' % ' '.join(self.author_split) 


>>> books = Book('Stephen King'), Book('Dean Koontz') 
>>> sorted(books, key=attrgetter('author_first')) 
[Book('Dean Koontz'), Book('Stephen King')] 
>>> sorted(books, key=attrgetter('author_last')) 
[Book('Stephen King'), Book('Dean Koontz')] 
>>> sorted(books, key=attrgetter('author_split')) 
[Book('Dean Koontz'), Book('Stephen King')] 
+0

AttributeError: Объект 'Source' не имеет атрибута 'aSplit' – Aristides

+0

@Aristides, что вы запустили? В любом месте кода RH нет ссылки 'aSplit'. – PaulMcG

+0

ой извините я побежал self.asplit = self.author.split() если Len (self.asplit) == 1: self.asplit.append ('') self.authorFirstName = self.asplit [0 ] self.authorLastName = self.asplit [-1] – Aristides