AttributeError Питона: у объекта 'NoneType' нет атрибута 'ошибки' - PullRequest
3 голосов
/ 14 января 2012

Я знаю, что это было здесь много раз, но я не нашел правильный ответ для моего случая.
Во-первых: Я делаю простую систему баз данных (для себя), которая будетзапустить без хэшей и т. д. (пока, по крайней мере).Теперь я застрял.

import sys
import os

filename = ""
database = ""
path = ""
table = ""

class Nollty:
    returns = 0
    errors = 0

    def __init__(self, filename, database):
        self.filename = filename
        self.database = database
        self.path = self.filename + "databases/" + self.database
        openfile = open(self.path + "/db_required", "r")
        if not openfile.errors:
            self.returns = 1
        if not os.path.exists(self.path + "/db_required"):
            self.returns = 0
        openfile.close();

    def select(self, table):
        errors = 0
        self.table = table
        openfile = open(self.path + "/" + self.table, "r")
        if not openfile.errors:
            errors = 1
        if not os.path.exists(self.path + "/" + self.table):
            errors = 0
        openfile.close();


nollty = Nollty("", "test")
if nollty.returns == 1:
    print "Successfully connected to the database!"

query = nollty.select("aaa_auto")
if query.errors == 0:
    print "Successfully chosen the table!"

Вывод ошибки:

Traceback (most recent call last):
File "/home/spotrudloff/Python/Nollty/nollty.py", line 40, in <module>
if query.errors == 0:
AttributeError: 'NoneType' object has no attribute 'errors'

Проблема, вероятно, в том, что я программист PHP, и я выучил Python сегодня через несколько часов (такмое мышление все еще "PHPy").

Спасибо за все ответы.

Ответы [ 4 ]

4 голосов
/ 14 января 2012

Использование returns и errors в качестве переменных класса не кажется хорошей идеей. Существует только один экземпляр каждой из этих переменных, независимо от того, сколько экземпляров Nollty вы создаете. Вместо этого сделайте это:

def __init__(self, filename, database):
    self.returns = 0
    self.errors = 0
    # rest of __init__

Далее, использование returns для указания возвращаемого значения также не является хорошей идеей. В Python обычно вызывается исключение , чтобы указать на проблему в конструкторе. Таким образом, вызывающая сторона не может просто проигнорировать проблему, забыв проверить returns.

Аналогично, используйте исключение из select(), чтобы указать на проблему с параметром. Я бы рекомендовал устранить и returns и errors.

Вы также вообще не возвращаете никакого значения из select, поэтому query в итоге становится None (в Python None - это специальное значение). Вы либо хотите вернуть что-то полезное из select(), либо не присваиваете его результат чему-либо, если оно не возвращает полезного значения.

3 голосов
/ 14 января 2012

select() не возвращает явное значение, поэтому оно имеет NoneType возвращаемое значение.Измените код так, чтобы select() возвращал либо 1, либо 0, в зависимости от успеха или неудачи вашего кода.

1 голос
/ 14 января 2012

Похоже, что select () не возвращает значение, поэтому по умолчанию используется NoneType (null). В качестве альтернативы (что вы, вероятно, хотели сделать), измените запрос на nollty.

0 голосов
/ 14 января 2012

Переменная ошибок в вашем методе выбора является локальной переменной. Вам нужно для простоты установить переменную класса ошибок. Кроме того, как другие предположили, ваш метод выбора не имеет оператора возврата. Из вашего кода похоже, что вы пытаетесь получить доступ к переменной ошибок nollty, но вы проверяете это в переменной запроса, которая логически равна None.

У вас есть два варианта в зависимости от вашей цели. Верните ошибки из select или установите self.errors = errors до того, как ваш метод select вернется. Или сделайте оба, если хотите, как показано ниже. Обычно вы, вероятно, возвращали бы False, если выбор не удался, и True, если он удался, но это не обязательно.

class Nollty:
    ...
    def select(self,table):
        ...
        self.errors = errors
        return errors

errs = nollty.select("aaa_auto")
if nollty.errors == 0:
    print "Successfully chosen the table!"

##functionally equivalent
#if errs==0:
#    print "Successfully chosen the table!"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...