Metasequoia BBS

| New message | Normal | Tree |
Status
Tag
Keyword
[8494] PythonでdeleteObjectでNoneが残り続ける / まじかる☆しげぽん
[Bug report,v4.7.1] Response
別スレでも質問したのですが、分けておきます。
PythonスクリプトでremoveObjectでオブジェクトをリムーブした場合はNoneになるというのは正しいと思うのですが
deleteObjectをしてもシーンにNoneが残り続けます。
また、オブジェクトリストの削除でも同様にNoneが残り続けます。
これは、deleteObjectを行うとdoc.objectから完全に削除されNoneも消されるのが本来正常な動作だと思うのですが
deleteObjectでNoneが残り続けるのは仕様なのでしょうか?
Noneは起動中の一時的なデータで、再起動したら消えるのは確認しました。
ただ、現状起動中はNoneが残り続けNoneを完全に削除する手段が無いように感じます。
そのため、処理としてオブジェクトリストで削除を行った場合とdeleteObjectを行った場合Noneを生成せずに削除する処理にしてほしいです。
また、シーン中のNoneを一気にクリアするドキュメントメソッドが欲しいです。

削除処理を複数回ループしていってメタセコが落ちるのはこれが原因ではないかと思います。
2019-12-14 00:53
[8495] Re: PythonでdeleteObjectでNoneが残り続ける / まじかる☆しげぽん
32bit版、64bit版でも同様の現象を確認しております。
2019-12-14 00:54
[8496] Re: PythonでdeleteObjectでNoneが残り続ける / まじかる☆しげぽん
多分、仕様として把握していると思いますが
Noneが消える瞬間は、保存する際に消えるようです。
>compact  
>ドキュメント中の配列に存在するNullを切り詰めます。
 compactメソッドが、Noneを消してくれそうな気配を感じたのですが思っていたのと違ったようで消えませんでした。

Pythonでsaveを実行すると保存処理となりNoneが消えるようですが、逆に保存時にNoneが消えてしまうとremoveObjectで一時対比させておいたオブジェクトが保存処理を行ってしまうと消えてしまうため保存処理で消えるのも問題に感じます…。

deleteObjectでNoneが消えないのは、removeObjectで対比した本当に一時的に残っておきたいNoneと区別が付かないので、上記要望のようにdeleteObjectを実行した時点でNoneを残さず消えるのが望ましいと思います。
2019-12-14 01:07
[8497] Re: PythonでdeleteObjectでNoneが残り続ける / まじかる☆しげぽん
ちなみに、Noneオブジェクトを以下のようにオブジェクトリストに再挿入しようとしたところ以下の様にエラーがでました。

for obj in doc.object:
    if obj is None:
        doc.addObject(obj)


Failed to execute a script in line 7.
Inappropriate argument type.
argument 1 must be MQObject, not None

一度Noneになったオブジェクトはオブジェクトとして扱われないので、完全にアクセスできないようです。

insertを使った場合このようになりました。やはり兄弟オブジェクトというオブジェクトの指定がイマイチ分からないです。カレントオブジェクトを指定しても
doc = MQSystem.getDocument()
Target= doc.object[doc.currentObjectIndex]
for obj in doc.object:
    if obj is None:
        doc.insertObject(obj,Target)


Show more...
2019-12-14 01:39
[8498] Re: PythonでdeleteObjectでNoneが残り続ける / まじかる☆しげぽん
removeObjectでリムーブしたオブジェクトはNoneになり、そのNoneオブジェクトをinsertObjectでオブジェクトリストに戻すことが出来ると思ったのですが、その考え自体が間違っているのでしょうか?

正しい使い方がちょっと分からないため、removeObjectとinsertObjectの正しい使い方のコードの作例を教えていただけるでしょうか。
2019-12-14 01:49
[8499] Re: PythonでdeleteObjectでNoneが残り続ける / Administrator
そもそもNoneについて間違った理解をしているように思いますが、その説明はPythonのドキュメントや書籍などに譲ります。
insertObjectのサンプルのみ記載しますので、2つ以上のオブジェクトを用意した状態で実行してください。

doc=MQSystem.getDocument()
obj1=doc.object[0]
obj2=doc.object[1]
doc.removeObject(obj1)
doc.insertObject(obj1,obj2)
for i,o in enumerate(doc.object):
    if o is None:
        print(str(i)+' is None')
    else:
        print(str(i)+' is '+o.name)
2019-12-14 12:08
[8500] Re: PythonでdeleteObjectでNoneが残り続ける / まじかる☆しげぽん
さんぷるありごとうございます。とても助かります。
Noneについては、オブジェクトがNoneになるのでメタセコ独自の存在なのかと思っておりました。
Pythonの概念でNoneというのが共通で存在するものなのですね。
それは、NoneについてはPythonの解説を参考にしたいとおもいます。

可能ならば、Python リファレンスにNoneになるとかかれてますがNoneとはなにかなもセットでリファレンスには解説していただけると、メタセコ固有の存在なのか、PythonとしてNoneというのが存在してそれになりますという風に書かれていると親切かなとおもいます。
2019-12-14 14:20
[8501] Re: PythonでdeleteObjectでNoneが残り続ける / まじかる☆しげぽん
Noneとは、何かというよりそれがメタセコ独自の要素のオブジェクトのなのかとうのこが分かればという感じです。
まだ、調べてないですがC#でいうnull的な存在なんですかね。
2019-12-14 14:36