[Python] inspectモジュール

先日のUIのエントリーに関して、いろいろと考えてて、
せっかくなのでpymelのソースでも読もうとおもって読んでみました。

いやぁ、ハイレベル。
おれ全然わからんwww
@の使い方とか、metanodeの意味とか、全然謎。
まぁ、使い方が想像出来ないものは必要ないものらしいので、とりあえずこの辺は後日勉強。


で、UIなんですが、WindowとかFormLayoutぐらいしか宣言してなくて、
なんでこれが動くのか不思議におもいました。

おそらく自動で変換してんだろうなぁと思って、importされてるモジュールをちょこっと覗いて見ました。

すると、どうやら.binファイルからpickleで関数リストを読み込んでいるっぽいことがわかりました。
.binファイルを覗いてみると、バイナリデーターーーーーー。どーーーーん。

次にpickleされているオブジェクトを探してみました。
中身まで詳しくは見てないのですが、こんなものが見つかりました。

tmpCmdlist = inspect.getmembers(cmds, callable)

inspect?なんだこれ?
と思って、Mayaを開いて実行してみました。

おおおおおおお
maya.cmdsモジュールのコマンドがタプルのリストで出てきました。

inspectモジュールって、前にhohehohe2さんがPython Code Readingで話したやつ、、ですよね?
こういうことが出来るんですねー。なるほど。
これはちょっと調べてみたい。

以下はmaya.cmdsのコマンドをずらっとprintするスクリプト。

import inspect
import maya.cmds as cmds
_cmds = inspect.getmembers(cmds, callable)
for cmd in _cmds:
  _cmd = cmd[0]
  print(_cmd[:1].lower()+_cmd[1:])

キーワード登録なんかには役立ちそう・・・か・・・?

同僚Iさんは、eclipseのpyDevのコード補完で使えそう、と言ってました。
偽maya.cmdsを用意してやれば、読める!!と。
おっ、と思った方は是非やってみてください。

UIのこと調べてたはずなのに、こっちばっかり調べるのもアレだし、
ある程度見れたので、とりあえずOK。

inspectモジュールは、僕的には今すぐに使うことはなさそうですが、一応メモっときます。

pymelもうちょっと読めるようになりたいなぁ、、。

「[Python] inspectモジュール」への5件のフィードバック

  1. import maya.cmds as cmds
    _cmds = [x for x in cmds.__dict__.keys() if not x[0] == ‘_’]
    #_cmds.sort()
    for cmd in _cmds:
        print(cmd[:1].lower()+cmd[1:])

    とやっても同じ結果が得られるじゃん、と思ったら
    こっちはすごく遅かったです・・・

    自分はinspect.isclassってのだけ使ったことあります。
    オブジェクトがクラスかどうか判断するだけですが。
    issubclassと一緒に使って、
    いくつかのモジュールをインポートして、それぞれの
    モジュールの中から特定のクラスのサブクラスになっている
    ものを抽出するみたいなのを書いたとき1回だけ使いました。

    ひとのコードを読むとすごく勉強になりますね。

  2. inspectモジュールはいいですよ〜。
    ユーザーやプログラムがプログラム自身に対する情報を仕入れたい時よく使われます。py2exeやpypyなどでも多用されています。またdisモジュールと一緒にPython内部を奥深く探っていく時にも重宝されています。inspectモジュールの4大便利機能と太古から言われてるgetsource, getabsfile, getcomments, classify_class_attrsの使い方を載せときました(一部誇張あり&宣伝w)。http://koichitamura.blogspot.com/2008/10/useful-inspect-module.html
    一つだけ注意点があって、getsouce()などソースコードを扱う関数はinspectモジュール内部でソースをキャッシュしているので一度それらの関数を用いた後、ソースを書き換えてreload()しても古いソースコードが使われてしまいます。

    なおinspectのgetmembers()は__dict__でなくdir()を使っているのでクラスやインスタンスを与えた場合getmembers()ではベースクラスなどのメンバも表示されます。

  3. >inagakiさん
    > cmds.__dict__.keys()
    ・・・!!
    そういえばそうですね。確かに、、
    ま、まぁでも遅かったということなので結果オーライ的な感じで!!ww

    > inspect.isclass
    ほーーー、なるほど。
    全然そこまで高度なことはできないので、そんなことが出来るのか、というぐらいの理解しか出来ないのですが、いろいろと使える場面はありそうですね。

    > ひとのコードを読むとすごく勉強になりますね。
    ホントそう思います。
    ということでpymelの解読も時間見つつ進めたいんですが、根本的なところでいろいろ引っかかったりします、、
    前述のメタクラスであるとか、その辺、、
    気長にやってみます(`・ω・´)シャキーン

    >hohehohe2さん
    > ユーザーやプログラムがプログラム自身に対する情報を仕入れたい時よく使われます。
    > py2exeやpypyなどでも多用されています。
    なるほど、確かにそういう場面では活躍しそうです。

    > またdisモジュールと一緒にPython内部を奥深く探っていく時にも重宝されています。
    disモジュールですか。なるほど、初耳です・・・!!

    > http://koichitamura.blogspot.com/2008/10/useful-inspect-module.html
    一部読みました!が、英語がわからなくてまだあんまりちゃんと理解できてないですww
    時間見つけてしっかりと、、、

    今後も是非いろいろご教授くださいませm(__)m

  4. >hohehohe2さん
    getmembers()と__dict__にはそういう違いがあったんですね。getmembers()これから結構使えそうです。
    ひとつ質問なのですが、getsourceはbyte codeになっているモジュールからのオブジェクトでもソースコードがわかるってことですよね?自分にはByte codeになっているものをどんなソースか調べる以外の使い道が思いつかないんですが、こういう時に使うと便利!みたいな例ってありますか?

  5. >hohehohe2さん
    ↑よろしくおねがいします 笑

コメントを残す

メールアドレスが公開されることはありません。