AttributeError: Обектът „NoneType“ няма атрибут „userprofile“

Продължавам да получавам тази грешка и някак съм заседнал. Знам, че има нещо общо с последната част от кода, но освен това съм най-вече объркан и не съм много сигурен как да го поправя/изпълня корекции.

Разделът, който извиква панел (част от меню с визуални опции):

    self.AutojoinMemosPanel = GUI.Options.Panels.AutojoinMemos.Panel(self.config,self)
    self.pages.addWidget(self.AutojoinMemosPanel)

Панел:

from PyQt4 import QtCore
from PyQt4 import QtGui

class MemoEntryItem(QtGui.QListWidgetItem):
def __init__(self,MemoName):
    QtGui.QListWidgetItem.__init__(self,MemoName)
    self.MemoName = MemoName

class Panel(QtGui.QWidget):
def __init__(self,Config,userprofile):
    QtGui.QWidget.__init__(self)
    self.Config = Config

    self.AutoIdentifyCheck = QtGui.QCheckBox("Automatically identify with nickserv")
    self.PasswordLabel = QtGui.QLabel("Password:")
    self.PasswordEntry = QtGui.QLineEdit()
    self.PasswordEntry.setEchoMode(QtGui.QLineEdit.Password)

    self.TitleLabel = QtGui.QLabel("Memos to join on startup:")
    self.MemosList = QtGui.QListWidget()
    self.MemoNameEntry = QtGui.QLineEdit()
    self.RemoveButton = QtGui.QPushButton("REMOVE")
    self.AddButton = QtGui.QPushButton("ADD")

    Layout = QtGui.QVBoxLayout(self)
    Layout.setAlignment(QtCore.Qt.AlignTop)
    Layout.addWidget(self.AutoIdentifyCheck)
    NickservPasswordLayout = QtGui.QHBoxLayout()
    NickservPasswordLayout.addWidget(self.PasswordLabel)
    NickservPasswordLayout.addWidget(self.PasswordEntry)
    Layout.addLayout(NickservPasswordLayout)
    Layout.addWidget(self.TitleLabel)
    Layout.addWidget(self.MemosList)
    Layout.addWidget(self.MemoNameEntry)
    AddRemoveButtonLayout = QtGui.QHBoxLayout()
    AddRemoveButtonLayout.addWidget(self.RemoveButton)
    AddRemoveButtonLayout.addWidget(self.AddButton)
    Layout.addLayout(AddRemoveButtonLayout)

    self.connect(self.RemoveButton,QtCore.SIGNAL("clicked()"),self,QtCore.SLOT("RemoveSelectedMemo()"))
    self.connect(self.AddButton,QtCore.SIGNAL("clicked()"),self,QtCore.SLOT("AddMemoFromTextEntry()"))

    if self.Config.userprofile.userprofile.get("AutoIdentify",False):
        self.AutoIdentifyCheck.setChecked(True)

    self.PasswordEntry.setText(self.Config.userprofile.userprofile.get("NickservPassword",""))

    for MemoName in self.Config.config.get("AutojoinMemos",[]):
        self.AddMemoEntry(MemoName)

@QtCore.pyqtSlot()
def RemoveSelectedMemo(self):
    self.MemosList.takeItem(self.MemosList.currentRow())

@QtCore.pyqtSlot()
def AddMemoFromTextEntry(self):
    MemoName = str(self.MemoNameEntry.text()).strip()
    if (MemoName != ""):
        self.AddMemoEntry(MemoName)
        self.MemoNameEntry.setText("")

def AddMemoEntry(self,MemoName):
    self.MemosList.addItem(MemoEntryItem(MemoName))

def SaveOptions(self):
    MemosListed = []

    for MemoIndex in range(self.MemosList.count()):
        MemoItem = self.MemosList.item(MemoIndex)
        MemosListed.append(MemoItem.MemoName)

    self.Config.set("AutojoinMemos",MemosListed)

    self.Config.userprofile.userprofile["AutoIdentify"] = self.AutoIdentifyCheck.isChecked()
    self.Config.userprofile.userprofile["NickservPassword"] = str(self.PasswordEntry.text())
    self.Config.userprofile.save()

Някаква помощ?


person user2566140    schedule 09.07.2013    source източник
comment
Може да искате да добавите езиков таг към въпроса (напр. [python]).   -  person A.E. Drew    schedule 10.07.2013
comment
изглежда self.Config.userprofile е None   -  person karthikr    schedule 10.07.2013
comment
@karthikr Или self.Config.   -  person thomasd    schedule 10.07.2013
comment
Можете ли да ни покажете как използвате класа Panel?   -  person Jason Sperske    schedule 10.07.2013
comment
Не може да бъде self.Config.userprofile, защото би извело грешка AttributeError: 'Config' object has no attribute 'userprofile', преди да се опита да получи достъп до втория userprofile (вижте моя отговор).   -  person Rick Hanlon II    schedule 10.07.2013


Отговори (1)


На пръв поглед тук може да се случва едно от двете неща. При по-задълбочена проверка има само един.

Да приемем, тъй като не сте посочили изрично, че проблемният ред е:

if self.Config.userprofile.userprofile.get("AutoIdentify",False):  

След това, когато получите грешката

AttributeError: 'NoneType' object has no attribute 'userprofile'

означава, че се опитвате да получите достъп до атрибут, който не съществува (което е значението зад has no attribute 'userprofile'), и че обектът, за който проверявате атрибут, не съществува, тъй като типът на обект, който не съществува, е NoneType (което е значението зад 'NoneType' object).

Така че, за да отстраните грешки, искате да потърсите възможности, при които обектът, осъществяващ достъп до userprofile, може да бъде None (т.е. да не е присвоен или нулев). Това е възможно при

self.Config.userprofile #1

и

self.Config.userprofile.userprofile #2  

В #1, ако стойността на Config е None, тогава self.Config.userprofile ще хвърли тази AttributeError, защото Config е NoneType обект и следователно няма атрибути - да не говорим за userprofile атрибут.

В #2, ако стойността на userprofile на self.Congig е None, тогава self.Config.userprofile.userprofile ще хвърли тази AttributeError, защото userprofile е NoneType обект и следователно също няма атрибути.

Можете обаче да премахнете една от тези две опции.

Помислете за това, #2 никога не би могъл да изведе тази грешка, защото ако атрибутът userprofile на обекта self.Config беше None (както е обяснено по-горе), тогава първо ще изведете различна грешка:

AttributeError: 'Config' object has no attribute 'userprofile'

Ако Config обект е има атрибут userprofile тогава ще получите грешката:

AttributeError: 'userprofile' object has no attribute 'userprofile'

Следователно Config трябва да бъде None, което означава, че не подавате Config със стойност към __init__.

Надяваме се, че това ще ви помогне да коригирате проблема си и да отстраните по-добре сами!

person Rick Hanlon II    schedule 09.07.2013
comment
Това е фантастична разходка - person Aaron D; 10.07.2013
comment
Как да предам Config със стойност на init? - person user2566140; 10.07.2013
comment
Как в момента настройвате стойността на Config? - person llb; 10.07.2013
comment
__init__ е конструкторът на вашия обект Panel, така че ще предадете конфигурацията, когато създавате обекта Panel. Не съм сигурен къде създавате панелния обект, но бихте направили (за каквато и да е конфигурацията, като променлива c): p=Panel(c) Това ще предаде c като Config в метода __init__. - person Rick Hanlon II; 10.07.2013