-1

に属性を割り当てて、'Nonetype' object呼び出された場合の動作を Python に指示することはできますか?

これが私の問題です:

のインスタンスを格納するライブラリとして機能するクラスがありますmyOtherObject。インスタンスを追加する前に、まずそのキーが既に存在するかどうかを確認し、次にそのキーに割り当てられたインスタンスにデータを上書きするのではなく追加します。

class MyClass:

    def __init__(self):
        self.myLibrary = {}

    def __setitem__(self, key, item):
        if key not in self.myLibrary:
            self.myLibrary[key] = myOtherObject(name=item[0], attr1=[item[1]], attr2=[item[2]])
        else:
            self.myLibrary[key].attr1.append(item[1])
            self.myLibrary[key].attr2.append(item[2])

    def __getitem__(self, key):
        if key in self.myLibrary:
            return self.myLibrary[key]
        else:
            return None #???

ライブラリからデータを取得するときは、キーも存在するかどうかを確認し、キーが存在する場合にのみ割り当てられたオブジェクトを返す必要があります。これは正常に動作するか、オブジェクトのみを呼び出しますが、そのオブジェクトの属性を呼び出す場合はそうではありません:

>>> o = MyClass()
>>> o['key1'] = ['name1','b','c']
>>> o['key1']
<__main__.myOtherObject instance at 0x05509B48>
>>> o['key1'].attr1
'b'
>>> o['key2']
>>> o['key2'].attr1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'attr1'

何らかの方法で Python に何もせずに、属性が呼び出されたときに戻るように指示できNoneますか?attr1attr2'NoneType' object

4

3 に答える 3

0

使用getattr:

>>> o = None
>>> print getattr(o, "attr1", None)
None
于 2013-09-21T17:52:32.733 に答える
0

「Nonetype」オブジェクトに属性を割り当てることは可能ですか?

いいえ。

>>> o = None
>>> o.foo = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'foo'
>>> setattr(o,'foo',1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'foo'
>>> getattr(o,'foo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'foo'

インスタンスを追加する前に、まずそのキーが既に存在するかどうかを確認し、次にそのキーに割り当てられたインスタンスにデータを上書きするのではなく追加します。

これは、defaultdict の典型的な使用例です。

import collections
d = collections.defaultdict(list)
d['foo'].append(1)
print d #=> defaultdict(<type 'list'>, {'foo': [1]})

ライブラリからデータを取得するときは、キーも存在するかどうかを確認し、キーが存在する場合にのみ割り当てられたオブジェクトを返す必要があります。これは正常に動作するか、オブジェクトのみを呼び出しますが、そのオブジェクトの属性を呼び出す場合はそうではありません:

わかった。キーが存在しない場合、どうしたいですか?

'NoneType' オブジェクトから属性 attr1 と attr2 が呼び出されたときに、何もせずに None を返すように Python に伝えることはできますか?

これは何を意味するのでしょうか?存在しない属性にアクセスしようとすると、上記のように例外が発生します。None解決策は、例外を処理して;を返すことです。しかし、は有効な入力ではないため、例外を伝播させた方がはるかに良いでしょう。None


要約すると、必要なものはすべて defaultdict で実現できます。おそらく独自のクラスを作成しないでください。

于 2013-09-21T18:00:59.743 に答える