2016-09-30 6 views
0

私はobject()のインスタンスである可能性のあるオブジェクトのタイプをチェックする適切な方法を探しています:オブジェクトがオブジェクト(インスタンス)である可能性があるときに型をチェックする適切な方法

def _default_json_encoder(obj): 
    """ Default encoder, encountered must have to_dict 
    method to be serialized. """ 
    if hasattr(obj, "to_dict"): 
     return obj.to_dict() 
    else: 
     # object() is used in the base code to be evaluated as True 
     if type(obj) == type(object()): 
      return {} 
     raise TypeError(
      'Object of type %s with value of ' 
      '%s is not JSON serializable' 
      % (type(obj), repr(obj)) 
     ) 

しかし

if type(obj) == type(object()): 
    return {} 

が推奨されていないすべてのオブジェクトはevaluaになりますので、残念ながら

if isinstance(obj, object): 
    return {} 

は動作しません。真としてted。

だからtype(obj) == type(object())は唯一の方法ですか?あなたが本当にあなたのデータ構造にobject()のインスタンスを持っている場合

+2

あなたは 'object'インスタンスをテストする必要があると思うのはなぜ? ** Python 3のすべての**は、 'object'の(サブクラス)のインスタンスです。あなたのデータに実際の 'object()'インスタンスがありますか?そうした場合、なぜですか? –

+1

そして、クラスをテストする通常の方法は 'isinstance(obj、class)'を使うことですが、もう一度 'object'クラスのためにすべてです。 'type(obj)is object'を使ってサブクラスを禁止することができます。私はなぜあなたがこれを必要とするのか困惑しています。代わりに 'True'や専用クラスを使うのではないでしょうか? –

+0

@MartijnPieters、なぜなら、私はobject()に影響を与えてしまったので、これをdictとしてrepr(インスタンス属性)する必要があるからです。 –

答えて

1

、あなたが使用したい:

type(obj) is object 

は直接インスタンス(クラスは通常シングルトンある)をテストします。

しかし、私はデータ構造を再考し、別のプリミティブ値(Trueなど)、専用シングルトン、または専用クラスを使用します。

専用シングルトンは次のようになります。

sentinel = object() 

そのセンチネルのためのテスト:

if obj is sentinel: 
    return {} 
+0

いつも素敵な返答として、ありがとう! –

関連する問題