2012-01-14 3 views
3

많은 시간을 보냈지 만 제 경우에 대한 올바른 대답을 찾지 못했습니다.
첫 번째 : 나는 (적어도 현재는) 해시 등으로 실행되지 않는 쉬운 데이터베이스 시스템을 만들고있다. 지금 나는 붙어있어.Pythons의 AttributeError : 'NoneType'객체에 'errors'속성이 없습니다.

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 프로그래머 해요 것을 아마, 나는 (나의 생각은 여전히 ​​"PHPy") 몇 시간 오늘 파이썬을 배웠습니다.

모든 답변 주셔서 감사합니다.

+2

select 함수가 뭔가를 반환하게합니다 ... – JBernardo

+0

'openfile.오류'는 당신이 생각하는 것과 거의 틀림이 없습니다. 오류 코드로 설정되지 않습니다. 이는 인코딩에 사용되는 오류 처리기를 지정하는 문자열입니다. 예제 코드에서는 항상 'None' 값을 갖습니다. ([docs] (http://docs.python.org/library/stdtypes.html#file.errors)를 참조하십시오. – ekhumoro

+0

+1을 사용하면 도움이되는 것으로 나타났습니다. – ryanjdillon

답변

3

select()은 명시적인 값을 반환하지 않으므로 NoneType 반환 값을 갖습니다. select()이 코드의 성공 또는 실패 여부에 따라 1 또는 0을 반환하도록 코드를 변경하십시오.

1

select()가 값을 반환하지 않는 것처럼 보입니다. 따라서 기본값은 NoneType (null)입니다. 또는 (아마도 당신이하고자했던 것), 쿼리를 Nollty로 변경하십시오.

+0

이름은'null'이 아니라'None'입니다. 'null '은 Java, C#, C++, Objective-C의 [nil']과 같은 언어에서 리터럴 "[n object] 값 없음"입니다. 파이썬에서'None'은'NoneType' 타입의 유일한 객체입니다. 'None'이'null'과 같지 않다는 것을 알기 위해서는 (여전히 객체입니다.)'dir (None)'을 고려하십시오. –

+0

그 점을 이해합니다. 나는 단순히 NoneType이 다른 언어 (예 : null을 사용하는 PHP)에서 사용할 수있는 것을 설명하는 빠른 방법으로 사용했습니다. – AlexanderZ

4

클래스 변수로 returnserrors을 사용하는 것이 좋습니다. 각 변수의 인스턴스가 하나만 있어도 Nollty 인스턴스를 몇 개 만들었는지 상관하지 않습니다. 대신 다음을 수행하십시오

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

다음 중 좋은 생각이 아닌 것 같아 반환 값을 나타내는 returns의 사용을. 파이썬에서는 보통 생성자의 문제를 나타 내기 위해 예외 인을 발생시킵니다. 이렇게하면 호출자는 returns을 확인하는 것을 잊어서 문제를 무시할 수 없습니다.

마찬가지로 매개 변수에 문제가 있음을 나타내려면 select() 예외를 사용하십시오. 내 추천은 일 것이며은 모두 returnserrors입니다.

또한 select에서 어떤 값도 반환하지 않으므로 queryNone이됩니다 (파이썬에서는 None이 특별 값 임). select()에서 유용한 것을 반환하거나 유용한 값을 반환하지 않으면 결과에 아무 것도 지정하지 않습니다.

0

select 메소드의 errors 변수는 지역 변수입니다. 클래스 오류 변수를 명시 적으로 설정해야합니다. 또한 다른 사람들이 당신의 select 메소드에 return 문이 없다고 제안했기 때문에. 코드에서 nollty의 errors 변수에 액세스하려는 것처럼 보이지만 논리적으로는 None 인 쿼리 변수에서 확인합니다.

목표에 따라 두 가지 옵션이 있습니다. select에서 에러를 반환하거나 select 메소드가 반환되기 전에 self.errors = errors를 설정하십시오. 또는 아래와 같이 두 가지를 모두 수행하십시오. 일반적으로 선택이 실패하면 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!" 
+0

그래, 그냥 반환을 사용하여 문제를 해결했습니다. 또한 __returns__을 예외로 다시 작성했습니다. 다들 감사 해요. :) –

관련 문제