52

myobjectを返す可能性のあるオブジェクトがありますNone。を返す場合None、属性は返されませんid

a = myobject.id

したがって、myobjectがNone、の場合、上記のstamentは次のようになりAttributeErrorます。

AttributeError: 'NoneType' object has no attribute 'id'

がNoneの場合、私はに等しくmyobjectなりたいです。次のような1行のステートメントでこの例外を回避するにはどうすればよいですか。aNone

a = default(myobject.id, None)
4

7 に答える 7

120

getattrの値を直接取得するのではなく、ラッパーを使用する必要がありidます。

a = getattr(myobject, 'id', None)

idこれは、「オブジェクトから属性を取得したいのですが、オブジェクト内にmyobject属性がない場合は、代わりに戻る」と言っているようなものです。しかし、それは効率的に行われます。idmyobjectNone

getattr一部のオブジェクトは、次の形式のアクセスもサポートしています。

a = myobject.getattr('id', None)

OPリクエストに従って、'deep getattr'

def deepgetattr(obj, attr):
    """Recurses through an attribute chain to get the ultimate value."""
    return reduce(getattr, attr.split('.'), obj)
# usage: 
print deepgetattr(universe, 'galaxy.solarsystem.planet.name')

簡単な説明:

Reduceは、インプレース再帰関数のようなものです。この場合、obj(ユニバース)から開始し、を使用してアクセスしようとする属性ごとに再帰的に深くなるためgetattr、質問では次のようになります。

a = getattr(getattr(myobject, 'id', None), 'number', None)

于 2013-02-17T16:52:59.650 に答える
11

最も簡単な方法は、三項演算子を使用することです。

a = myobject.id if myobject is not None else None

三項演算子は、中央の値がtrueの場合は最初の式を返し、それ以外の場合は後者の式を返します。

例外を使用して、別の方法でこれを行うこともできることに注意してください。

try:
    a = myobject.id
except AttributeError:
    a = None

これは、許可よりも許しを求める方が簡単であるというPythonicの理想に適合しています。何が最善かは、状況によって異なります。

于 2013-02-17T16:49:44.263 に答える
6

私のオブジェクトクラスでは、オーバーライドを入れることができます

class Foo(object):
   def __getattribute__(self, name):
      if not name in self;
        return None;
      else:
        # Default behaviour
        return object.__getattribute__(self, name)
于 2013-02-17T16:57:12.743 に答える
3

モジュール builtins の組み込み関数 getattr に関するヘルプ:

getattr(...)
    getattr(object, name[, default]) -> value

オブジェクトから名前付き属性を取得します。getattr(x, 'y') は xy と同等です。デフォルトの引数が与えられると、属性が存在しない場合に返されます。それがないと、例外が発生します。

以下が機能するはずです:

a = getattr(myobject, 'id', None)
于 2013-02-17T16:55:21.820 に答える
0
try:
    a = myobject.id
except AttributeError:
    a = None

IMOも機能し、より明確になります

于 2013-02-17T16:51:17.943 に答える
0
a=myobect.id if myobject else None
于 2013-02-17T16:53:54.403 に答える