1. halhorn

    Posted

    halhorn
Changes in title
+python でよくわからないオブジェクトの中身を表示する
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,86 @@
+Tensorflow 等を使っていると、このオブジェクトは一体なんのクラスのインスタンスで、どんな情報(プロパティ)を持っているのだろう、とわからなくなるときがしばしばあります。
+しかも、まともなドキュメントが無いこともしばしばあります。
+(例えば BeamSearchDecoderOutput など)
+
+このような時に便利な関数 explain を作りました。
+
+# 例
+tf.constant の戻り値を調べてみましょう。
+
+```py
+In [7]: tensor = tf.constant([[1, 2], [3, 4]])
+
+In [8]: explain(tensor)
+EXPLAIN ------------------
+Tensor("Const_2:0", shape=(2, 2), dtype=int32)
+<class 'tensorflow.python.framework.ops.Tensor'>
+ATTRIBUTES:
+OVERLOADABLE_OPERATORS: {'__truediv__', '__mul__', '__rpow__', '__rdiv__', '__neg__', '__pow__', '__rmul__', '__or__', '__rxor__', '__div__', '__ge__', '__rfloordiv__', '__lt__', '__gt__', '__getitem__', '__rand__', '__add__', '__abs__', '__invert__', '__rmatmul__', '__rsub__', '__floordiv__', '__xor__', '__ror__', '__rtruediv__', '__and__', '__sub__', '__radd__', '__matmul__', '__le__', '__rmod__', '__mod__'}
+device:
+dtype: <dtype: 'int32'>
+graph: <tensorflow.python.framework.ops.Graph object at 0x119f61d30>
+name: Const_2:0
+op: name: "Const_2"
+op: "Const"
+attr {
+ key: "dtype"
+ value {
+ type: DT_INT32
+ }
+}
+attr {
+ key: "value"
+ value {
+ tensor {
+ dtype: DT_INT32
+ tensor_shape {
+ dim {
+ size: 2
+ }
+ dim {
+ size: 2
+ }
+ }
+ tensor_content: "\001\000\000\000\002\000\000\000\003\000\000\000\004\000\000\000"
+ }
+ }
+}
+
+shape: (2, 2)
+value_index: 0
+```
+型は Tensor で、名前をとるのは name でとれて・・といったことがわかります。
+皆様の闇デバッグ作業に役立てれば幸いです。
+(存在するプロパティを勝手に叩いてしまうので、プロパティ読み出しの中で危ない処理をやる不法者なオブジェクトにはご注意下さい)
+
+
+# 実装
+```py
+import types
+
+
+def explain(item, shows_private=False, shows_method=False):
+ '''
+ 与えた python オブジェクトの詳細を表示します。
+ '''
+ print('EXPLAIN ------------------')
+ print(item)
+ print(type(item))
+ print('ATTRIBUTES:')
+ for d in dir(item):
+ if d == 'type':
+ continue
+ if not shows_private and d.startswith('_'):
+ continue
+ attr = getattr(item, d)
+ if not shows_method and (
+ isinstance(attr, types.MethodType) or
+ isinstance(attr, types.BuiltinMethodType) or
+ isinstance(attr, types.CoroutineType) or
+ isinstance(attr, types.FunctionType) or
+ isinstance(attr, types.BuiltinFunctionType) or
+ isinstance(attr, types.GeneratorType)
+ ):
+ continue
+ print('{}:\t{}'.format(d, attr))
+```