2012-01-14 32 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」)数時間で今日のPythonを学びました。

すべての回答ありがとうございます。

+2

select関数が何かを返すようにします... – JBernardo

+0

'openfile。エラーはほぼ確実にあなたが思うものではありません。これはエラーコードに設定されていません。エンコーディングに使用するエラーハンドラを指定する文字列です。あなたのサンプルコードでは、常に 'None'という値を持ちます。 ([docs](http://docs.python.org/library/stdtypes.html#file.errors)を参照してください)。これが役に立ちましたので、 – ekhumoro

+0

+1を-1にしてください。 – ryanjdillon

答えて

3

select()は明示的な値を返さないため、戻り値はNoneTypeです。 select()がコードの成功または失敗に応じて1または0を返すようにコードを変更します。

1

select()が値を返さないため、デフォルトでNoneType(null)に設定されているようです。あるいは(おそらく何をするつもりだったのか)、クエリを無制限に変更してください。

+0

名前は 'None'であり、' null'ではありません。 'null'はJava、C#、C++、Objective-Cの[nil']のような言語でリテラル" [nオブジェクト]値が存在しない "です。 Pythonでは、 'None'は' NoneType'型の唯一のオブジェクトです。 'None'が' null'と同じでないことを確認するには(まだオブジェクトです)、 'dir(None)'を考えてください。 –

+0

私はそれを理解しています。私は単に、NoneTypeが他の言語で利用可能なもの(例えば、nullを使用するphpなど)に関して何かを記述するための素早い方法としてそれを使用していました。 – AlexanderZ

4

クラス変数としてreturnserrorsを使用することはお勧めできません。 Nolltyのインスタンス数にかかわらず、これらの変数のそれぞれ1つだけインスタンスがあります。代わりに、この操作を行います。

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

次に、戻り値を示すためreturnsの使用は、どちらか良いアイデアのように見えるしていません。 Pythonでは、通常、コンストラクタの問題を示すために例外が発生します。そうすれば、呼び出し側はreturnsのチェックを忘れることによって問題を無視することはできません。

同様に、select()の例外を使用して、パラメータに問題があることを示します。私のお勧めは、に、を取り除くことです。returnserrorsです。

selectから値を返さないので、はNoneになります(PythonではNoneが特別な値です)。 select()から有用なものを返すか、有用な値を返さない場合は結果に何も割り当てないでください。

0

selectメソッドのerrors変数はローカル変数です。クラスエラー変数を明示的に設定する必要があります。また、他の人があなたのselectメソッドにreturn文がないことを示唆しています。あなたのコードから、あなたはnolltyのerrors変数にアクセスしようとしているように見えますが、論理的にはNoneの問い合わせ変数でそれをチェックしています。

目的に応じて2つのオプションがあります。 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__も例外で書き直しました。皆さん、ありがとうございました。 :) –