猫型エンジニアのブログ

プログラム/ネットワーク系の技術関連をまとめたページです 

オブジェクトの名前と値

 inspect.getmenbersに関して調べたところ、

inspect.getmembers(object[, predicate])(原文)
オブジェクトの全メンバーを、 (名前, 値) の組み合わせのリストで返します。リストはメンバー名でソートされています。 predicate が指定されている場合、 predicate の戻り値が真となる値のみを返します。

となっていました。オブジェクトの名前は分かるのですが、値が何をさすのかよくわかりませんでした。試しに適当なクラスで試してみました。dir()でクラスの名前のリストを、inspect.getmembersで名前と値の組み合わせのリストを確認しています。

>>> import inspect
>>> import ryu.controller.network
>>> cls = network.Network

>>> dir(cls)
['OFP_VERSIONS', '_CONTEXTS', '_EVENTS', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_check_nw_id_unknown', '_event_loop', '_get_old_mac', '_send_event', '_update_port', 'add_datapath', 'close', 'context_iteritems', 'create_mac', 'create_network', 'create_port', 'filter_ports', 'get_dpids', 'get_handlers', 'get_mac', 'get_network', 'get_networks', 'get_observers', 'get_port', 'get_ports', 'get_ports_with_mac', 'has_network', 'list_mac', 'list_networks', 'list_ports', 'list_ports_noraise', 'port_added', 'port_deleted', 'register_handler', 'register_observer', 'remove_network', 'remove_port', 'reply_to_request', 'same_network', 'send_event', 'send_event_to_observers', 'send_request', 'start', 'stop', 'unregister_observer', 'unregister_observer_all_event', 'update_mac', 'update_network', 'update_port']

>>> inspect.getmembers(cls, inspect.ismethod)
[('__init__', <unbound method Network.__init__>), ('_check_nw_id_unknown', <unbound method Network._check_nw_id_unknown>), ('_event_loop', <unbound method Network._event_loop>), ('_get_old_mac', <unbound method Network._get_old_mac>), ('_send_event', <unbound method Network._send_event>), ('_update_port', <unbound method Network._update_port>), ('add_datapath', <unbound method Network.add_datapath>), ('close', <unbound method Network.close>), ('context_iteritems', <bound method type.context_iteritems of <class 'ryu.controller.network.Network'>>), ('create_mac', <unbound method Network.create_mac>), ('create_network', <unbound method Network.create_network>), ('create_port', <unbound method Network.create_port>), ('filter_ports', <unbound method Network.filter_ports>), ('get_dpids', <unbound method Network.get_dpids>), ('get_handlers', <unbound method Network.get_handlers>), ('get_mac', <unbound method Network.get_mac>), ('get_network', <unbound method Network.get_network>), ('get_networks', <unbound method Network.get_networks>), ('get_observers', <unbound method Network.get_observers>), ('get_port', <unbound method Network.get_port>), ('get_ports', <unbound method Network.get_ports>), ('get_ports_with_mac', <unbound method Network.get_ports_with_mac>), ('has_network', <unbound method Network.has_network>), ('list_mac', <unbound method Network.list_mac>), ('list_networks', <unbound method Network.list_networks>), ('list_ports', <unbound method Network.list_ports>), ('list_ports_noraise', <unbound method Network.list_ports_noraise>), ('port_added', <unbound method Network.port_added>), ('port_deleted', <unbound method Network.port_deleted>), ('register_handler', <unbound method Network.register_handler>), ('register_observer', <unbound method Network.register_observer>), ('remove_network', <unbound method Network.remove_network>), ('remove_port', <unbound method Network.remove_port>), ('reply_to_request', <unbound method Network.reply_to_request>), ('same_network', <unbound method Network.same_network>), ('send_event', <unbound method Network.send_event>), ('send_event_to_observers', <unbound method Network.send_event_to_observers>), ('send_request', <unbound method Network.send_request>), ('start', <unbound method Network.start>), ('stop', <unbound method Network.stop>), ('unregister_observer', <unbound method Network.unregister_observer>), ('unregister_observer_all_event', <unbound method Network.unregister_observer_all_event>), ('update_mac', <unbound method Network.update_mac>), ('update_network', <unbound method Network.update_network>), ('update_port', <unbound method Network.update_port>)]

次に名前を直接評価させてみました。

>>> cls.update_mac
<unbound method Network.update_mac>

たしかに、inspect.getmembersの通りの値が帰ってきます。

調べてみたら

オブジェクトはアイデンティティ値 (identity) 、型 (type) 、そして値 (value) を持ちます。

となっていました。
「変数を評価したら値を返す」というのは分かっていましたが、それ以外の関数なども同じく評価したら値を返すとはしりませんでした。この辺りはlispによく似ています。