Re: スクリプトを起動するスクリプト

投稿ツリー


このトピックの投稿一覧へ

通常 Re: スクリプトを起動するスクリプト

msg# 1.1.1.1.1.1.1
depth:
6
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2007/4/23 18:16
jkani4  一人前   投稿数: 98
BpyRegistry.pyの中身を見てみました。
たしかに、ドキュメントや、コード中のコメントとは違う実装になっている部がありました。

def _sanitize(o):
  省略。。
    if t == dict:
        keys = o.keys()
        len_keys = len(keys)
        _ITEMS_NUM += len_keys
        if _ITEMS_NUM > MAX_ITEMS_NUM:
            return None
        for k in keys:
            o[k] = _sanitize(o[k])
    elif t in , tuple]:
        len_seq = len(o)
        _ITEMS_NUM += len_seq
        if _ITEMS_NUM > MAX_ITEMS_NUM:
            return None
        result = []
        for i in o: result.append(_sanitize(i))
            return result
 省略。。
ドキュメント、ソースのコメントには「配列(辞書、リスト、タプル)の要素数の最大値は60個」と書かれているのですが、
上記のソースコードでは、再起呼び出しされるたびにグローバル変数_ITEMS_NUMがどんどん累積されていってしまうので、「配列数のトータルが60個まで」ということに。グローバル変数_ITEMS_NUMは、Blenderを終了させるまで、メモリ上に残っているので、1度でも60よりも大きくなったらそれ以降は設定が保存できなくなります。
(今まで確認した挙動とソースの実装が一致していたので、気になっていた部分がスッキリしました)

CVSにコミットされた最新のソースは確認していないのですが、
おそらく、以下のコードでいいのではないかなと予測してます。
(スクリプト起動スクリプトの動作確認のために、次のリリースを待たずに修正しようかどうかはまだ迷ってます)

def _sanitize(o):
  省略。。
    if t == dict:
        keys = o.keys()
        if len(keys) > MAX_ITEMS_NUM:
            return None
        for k in keys:
            o[k] = _sanitize(o[k])
    elif t in , tuple]:
        if len(o) > MAX_ITEMS_NUM:
            return None
        result = []
        for i in o: result.append(_sanitize(i))
            return result

 省略。。

上のコードでうまく動いたかどうかは、後ほど。

PS.
ほかのかたが書かれたソースコードを読むのは、非常に参考になりますね。「こう書けば、すっきり記述できる」とか。

投票数:5 平均点:4.00

  条件検索へ


ログイン

ユーザ名:

パスワード:



パスワード紛失

クイックリンク

2021/07/01版
●Blender.org
BlenderFoundation
- Blenderのダウンロード
- 公式チュート等
- 公式マニュアル(和訳)

●ニュース(英文)
BlenderNation

●Blenderコミュニティ
blenderartists.org

●Blender Q&A
- Blender Stack Exchange

●テストビルド
Buildbot(自動生成)


●開発関連
公式開発サイト
Blender開発blog
Blender Wiki