AttributeError: объект «NoneType» не имеет атрибута «профиль пользователя»

Я продолжаю получать эту ошибку, и я как бы застрял. Я знаю, что это как-то связано с последним фрагментом кода, но, кроме этого, я в основном запутался и не совсем уверен, как его исправить/внедрить исправления.

Раздел, вызывающий Panel (часть меню визуальных параметров):

    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. Я не уверен, где вы создаете объект Panel, но вы бы сделали (для любой конфигурации, как переменную c): p=Panel(c) Это передаст c как Config в методе __init__. - person Rick Hanlon II; 10.07.2013