相対インポート、便利やで?

     Pythonでモジュールをインポートするにはimport文を使用します。

    # hoge.pyをインポートする。
    import hoge

     これはモジュールであってもパッケージであっても関係ありませんね。
     さて、今度はモジュールをパッケージ化して、複数ファイルを管理することにします。
     今回のサンプルとしてはこんな感じ。

    hoge
        |_  __init__.py
        |_  fuga.py
        |_  piyo.py
    
     このパッケージの中からfuga.pyをインポートしたい場合は以下のように書きます。
    from hoge import fuga
    
    #または
    import hoge.fuga as fuga
    

     どちらでも問題ないのですが、自分はGoogle先生のコーディングルールに則って上の方で書いていきます。
     ここまでも基本的な構文なので、普通にPythonをやっていけば問題ないでしょう。

     さて、今度はfuga.py内でpiyo.pyをインポートする場合を考えます。
     普通に考えれば上記の書き方で問題ないのですが、この場合モジュールのトップであるhogeの名前を変えると、各モジュール内でもimportで使用されているhogeと言う文字を変更しなくてはいけません。

    hoge
        |_  __init__.py
        |_  fuga.py
        |_  piyo.py
    
    # hoge/fuga.py
    
    from hoge import piyo
    


    ↓パッケージ名を変更しなくてはいけなくなった!!


    hogehoge
        |_  __init__.py
        |_  fuga.py
        |_  piyo.py
    
    # hogehoge/fuga.py
    
    from hogehoge import piyo
    # ↑トップのパッケージ名が変わったので、参照しているコード内でも変更しないといけない!!
    

     まだ2,3個くらいのモジュールで形成されているパッケージならいいのですが、これが10個、20個となってくると修正がかなり大変になりますね。
     そこで出て来るのが相対インポートです!!

    続きを読む

    スポンサーサイト

    クラスをカスタマイズしちゃうよ

     pythonのクラスネタです。ちょいちょい忘れるんで備忘録っす。
     Pythonでカスタムクラスを作った場合、そのカスタムクラスのさまざまな挙動をカスタマイズする事が出来ます。
     今回はサンプルとして、ついでにOpenMayaも取り入れつつ、やってみました。

     まずはこんな感じ。
    # -*- coding:utf-8 -*-
    from maya import OpenMaya
    
    class Node(object):
        def __init__(self, name):
            # 引数nameで与えられた名前をMObjectとして登録する。
            selectionlist = OpenMaya.MSelectionList()
            self.mobject = OpenMaya.MObject()
            selectionlist.add(name)
            selectionlist.getDependNode(0, self.mobject)
    
        def node(self):
            # 登録されたMObjectからMFnDependencyNodeを返す。
            return OpenMaya.MFnDependencyNode(self.mobject)
    
     上記のクラスは、呼び出し時にMayaのシーンに存在するノード名を指定すると、そのMobjectを保持するクラスです。
     さらにnodeメソッドによって上記MObjectをベースとしたMFnDependencyNodeを返すように、nameメソッドで現在のノード名を返すようにしています。
     maya.cmdsの時と違ってノードを名前ベースではなくMObjectで保持しているので、そのノードの名前を変更しても変更後の名前をちゃんと取ってこれます。
    from maya import cmds
    # Transformノードを作って、その名前をNodeクラスへ渡す。
    trs = Node(cmds.createNode('transform', n='test'))
    
    # 作成したノードをリネームする。
    cmds.rename(trs.name(), 'newTransform')
    
    print(trs.name())
    # Result : newTransform ← ちゃんと新しい名前になっている。
    
     こんな感じ。

     これはこれで便利なんですが、これだとノード名にアクセスする場合に毎回毎回nameメソッドを呼ばないといけませんよね。
     それじゃぁちょっと不便・・・って事で、これから挙動をカスタマイズして行きまっせ!!

    続きを読む

    id関数なんてのがあったんだね

     最近忙しくてブログを全然更新してませんでしたが、GWでちょっぴり心に余裕が出来たんで小ネタでもメモとして残します。(スタチューとかフィギュアは直ぐに記事にするのにね・・・)

     ホントは先月末に可動したガンダムトライエイジ 鉄血の4弾でウイングガンダムゼロ(EW)とガンダムエピオン(EW)やったよ〜〜〜〜〜〜って言うネタをやろうと思ったんだけど、完全に機会を逸してしまった。
     せめて写真だけでも載せとこw
    tryTk04_000.jpg
     いやぁ〜、ココらへんのガンダムが青春真っ只中だった身としては、イラスト担当させて頂いてテンションMAX!! ゼロとエピオンって事で新規2体はなかなか厳しかったけど、やれてホント良かったです❤(ӦvӦ。)


     と、プライベートな話はそろそろ終わりにして、本日のテーマは久しぶりにPythonネタです。
     ちゃんとマニュアルとかクックブックとか読んでる人からしたら常識でしょうが、今回はid関数について。

    続きを読む

    リスト内包表記と三項演算子

     2015年2月に、おかげ様で3度目となるリギングセミナーを行います!!

     と言うことで紹介ページまであるのに、いざブログに飛んでくるとプラモデルの製作日記ばかり・・・ではちょっとアレなんで、たまには技術的な話でも(ものすごい消極的理由)

     今回は今更ではありますがPythonの超絶便利機能「リスト内包表記」と、あんまり関係ないですけどやっぱり便利な三項演算子について



    ■リスト内包表記
     通常リストに何らかしらの処理したものを入れたい場合for文を使用します。
     たとえば0~10000000の数字のリストの各要素を二乗したものを新たなリストに入れたい場合
    # 二乗の結果をリストに入れる
    
    result = []
    for i in range(0, 10000000):
        result.append(i * i)
    
    となりますね。

     これをリスト内包表記で記述するとこうなります。
    # 二乗の結果をリストに入れる(リスト内包表記版)
    
    result = [x * x for x in list(0, 10000000)]
    
    for文で処理する中身を先に記述し、その後ろにfor文を書いて[]で囲むだけですね。慣れれば非常に簡単です。


    上記2つの動作時間を計測してみた結果、ウチの環境では
     通常記述方法 : 2.3秒
     リスト内包表記 : 1.8秒
    
     なんと1.27倍も早くなってます!! これはかなり違いますね!!!

    続きを読む

    Pythonでre! - 正規表現のグループまとめ

     今更ですがPythonの正規表現モジュール「re」の個人的まとめです。
     わざわざ自分で書かなくても他の方がまとめられてる内容なんですが、まぁ自分用メモって事で自分用にメモメモ。


    ■正規表現
     正規表現はひとつの文字列で色んな文字を取ってこれる凄いヤツですね。
     Pythonではreモジュールによって使用することができます。


    ■コンパイルしときましょ
     ぷよぷよの会社ではありません。
     re.searchメソッドによっていきなり正規表現を使用する事もできるのですが、コンパイルするとその後の処理が高速化するらしいので、とりあえずコンパイルしておきましょう。
    # -*- coding:utf-8 -*-
    
    import re
    reobj = re.compile('.*')  # Regex Objectが帰る
    


     コンパイルされたオブジェクトはsearchやmatchなどの正規表現実行メソッドをもっています。  ここから先の使用方法はre.searchやre.matchと同じですが、第一引数に正規表現はいらないのが違いです。
    # -*- coding:utf-8 -*-
    
    import re
    reobj = re.compile('[a-zA-Z]+')
    
    result = reobj.search('testfilename_map_v01.py')
    # 結果はtestfilenameが取れる
    
     何度も使用する場合、正規表現を何度も書かなくていいので非常に便利ですね。
     また、置換関数のsubやfindallなどほとんどの関数を使用する事ができます。


    ■グループ
      さて、ここからが本題。  Pythonのreモジュールはグループ処理もサポートしています。グループ処理をするためには()で囲えばOK。
    # -*- coding:utf-8 -*-
    
    import re
    reobj = re.compile('([a-zA-Z]+)_map_(v\d+).py')
    
    result = reobj.search('testfilename_map_v01.py')
    

    続きを読む

    プロフィール

    Eske

    Author:Eske
    萌えイラストレーターを目指す3DCGイラストレーター。
    現在ポケモンカードゲーム、ガンダムトライエイジ、ガンダムコンクエスト、妖怪ウォッチとりつきカードゲームなどで3DCGを使用したイラストレーターとして参加中。

    主にここでは日々気づいたメモなんかを残してます。
    イラストのお仕事も受け付けております。ココのメールアドレスからご連絡できますので、お気軽にご相談下さい。

    最新記事
    最新コメント
    カテゴリ
    最新トラックバック
    月別アーカイブ
    検索フォーム
    リンク
    QRコード
    QR