AKAGI Rails

鉄道模型シミュレーターで遊んでいたはずが、気づいたらPythonなども。

vrmapi.LOG()に文句タラタラ

VRMNXでログ出力に使うvrmapi.LOG()ですが,いや,実はコレが文句タラタラでして・・・。

  • 型がstr, int, floatしか受け付けてくれない
  • したがってうっかりdictやlistを入れるとTypeErrorが出てくる
  • listやdictを使うシーンでのデバッグではstr()を噛まさないといけないけど面倒くさいし,忘れる
  • pythonオブジェクトのstr属性のことを何だと思っているんだ!

こういうものは,仕方がないので自分で何とかする。

def LOG(*objects, sep=' ', end=''):
    """すこし賢いログ出力。
    
    Python標準のprint()とほぼ同じ形式でVRMNXのスクリプトLOGに出力します。
    objectsのすべてにstr()を引っかけて,sepで区切りながらつなげて出力します。
    スクリプトLOGではString型と表示されますがobjectsの実体とは無関係です。
    sep, endを設定する場合キーワード引数で設定してください。
    
    Args:
        objects: LOGに出したいオブジェクト。str()した上で出力します。
        sep: objectどうしの区切り。
        end: 行末。
    """
    output = sep.join(map(str, objects)) + end
    vrmapi.LOG(output)

文句タラタラだけど,旧世代のVRMスクリプトよりは5000兆倍素晴らしいのでがんばってやっています。

でも実は,地味にすごい(?)機能もログウィンドウには付いています。

f:id:AKAGI-vrmstation:20200503141550p:plain
エラーを出したコードが書いてあるオブジェクトがどれだか分かる

エラーロガーとしては当たり前の機能なような気もしますが,VRMNXのPythonエンジンはどのオブジェクトに書いたコードも区別なく実行する…ように見えていたのに,VRMNX側(vrmapiの実体)には区別できるらしいです。