Maya Python

コード内にメモを書く。コメントアウトのやり方と文字コードについて

python で日本語を扱う際の文字コードと、コード内にメモを残す方法についてお話しします。

文字コードについて

python2 の環境で日本語を扱う際、文字コードを指定する必要があります。

文字コードに関して簡単に解説されているサイトは次のところでしょうか。
データを開いただけなのに……文字化けってどうして起こるの? | モリサワ

まとめると、パソコンで表示されている文字には規格があり、その規格がずれてると文字化けが起こる、ということです。

例えば mac と windows 間でzip ファイルをやりとりする際によく文字化けが起こります。
mac は圧縮する際に「 utf-8 」で圧縮するのに対し、windows は「Shift_JIS」を使って解凍します。そのため両社の間の文字の規格にずれが発生し、ファイル名の文字化けが起こります。

また、バックスラッシュを入力しようとした際に円マークがでるのも文字コードが原因です。

円記号「¥」を打ちたいのに、斜線「\」が出るのはなぜ? | 志木駅前のパソコン教室・キュリオステーション志木店のブログ

このサイトでも閲覧されている環境によっては私の意図しない表示がされている場合があります。
\\\\\\\\\\\\\\ ← このフォントでは円マークになりますが、コード内で使用しているフォントだとバックスラッシュとして表示されていると思います。(こちらとしてはそのつもりです。)

maya の文字コード

python で日本語を扱うには Unicode の文字コードを使います。ただ、maya の python2 の環境では デフォルトの文字コードが「 ASCII (アスキー)」になっています。

文字コードについてはかなりややこしく、ここでは割愛します。

とりあえず、この文は日本語で書いてますよ、ということを maya に伝える ことと、文字コードをpython3 と同じ環境にする 必要があります。

そのコードが次の文です。

# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals

from __future__ ~ の文に unicode_literals を追記しました。

POINT
  • 文字には規格がある
  • python3 では文字の規格が Unicode に統一された
  • # -*- coding: utf-8 -*- が必要
  • unicode_literals で python3 同じ環境にできる

文字コードについてここでもう少し詳しく書く予定だったんですが、気が付けば膨大な量になっていたため別記事にて解説します。
とりあえず現状では上記のような非常にざっくりした理解で差し支えありません。

下記のページで文字コードについて詳しく解説しています。

コード内にメモを残す

コメントアウトの方法は「 # 」と「 ''' 」の2種類あります。それぞれ特徴が違いますので解説していきます。

# によるコメントアウト

「 # 」を入れると、その行のそこから先は実行されません。そのため何を書いていてもエラーが起きません。

# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals

# この部分は実行されない
val = 'test' # この部分も実行されない
print(val)

ただし、「 ’ 」や「 " 」で囲んだ文字列の # は実行されます。

# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals

print(' # この部分は実行される ')

「 # 」によるコメントアウトは # を打った後の 1行のみです。複数の行に対してコメントを打つにはそれぞれの行で # が必要です。

# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals

# この部分は実行されない
# 複数の行にコメントアウトするには
# 行ごとに冒頭に # が必要
# 面倒だと感じた場合は「 ''' 」でのコメントアウト
# がおすすめ

val = 'test'
print(val)

’’’ によるコメントアウト

複数の行をコメントアウトさせるには「 ''' 」で囲みます。

# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals

'''

ここは実行されない

'''
print('test')

このコメントアウトには注意点があり、前後の文のインデントを考慮する必要があります

# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals

test_list = [1,2,3]

'''
ここにはインデントがいらない
この方法であれば複数行まとめて
コメントアウトできる
'''

for test in test_list:
	
	print ( test )

	'''
	ここにはインデントが必要
    前後の文と同じ数のインデントが必要になる
	'''

# このコメントアウトはインデント関係なくどこでも使える
	
	print ( test )
	

'''
ここのインデントはどちらでもいい
'''	
print (test)

インデントを無視するとそこでエラーが発生しますので注意してください。

POINT
  • 「 # 」は一行ずつだがインデントを考えなくていい
  • 「 ''' 」は複数行まとめられるがインデントを考慮しなければならない

コメントアウトの使用例

コメントアウトの具体的な使用例としては、メモにつかう場合とエラー処理に使う場合が挙げられます。

文の内容やメモを残す

コメントの書き方や頻度は人それぞれです。特にデザイナーであれば気にする必要はないです。
ただ、某大手ゲーム会社では2行以内に必ずコメントを打つことがルール化されていたりもしますので、会社によっては決まりがあるようです。

For文の時に使用したコードを丁寧にコメント打つとしたら下記のような感じでしょうか。

# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals
import maya.cmds as cmds

# 設定したい値。リスト型で指定
value_list = [1, 0.5, 1]

# 設定したいアトリビュート名
attribute = 'color'

# どのノードに対して行うか
targetNode_list = cmds.ls(type='spotLight')

'''
選択したノードに対して行う場合
targetNode_list = cmds.ls(sl=True)

特定のノードに対して行うなら
targetNode_list = cmds.ls(type='タイプ名')
'''

#===============================================================

# 実行文

cmds.undoInfo(openChunk=True)

for targetNode in targetNode_list:
    
    # 設定したい値が str 型の場合は thype='string' を追記
    cmds.setAttr(targetNode + '.' + attribute, *value_list)

cmds.undoInfo(closeChunk=True)

かなり丁寧なコメントを書いてみました。普段はここまでやりませんが、慣れないうちはこれくらい書いておくと後で見た時にわかりやすいと思います。

エラー箇所の特定に利用する

エラーで結構困るのがシンタックスエラーと呼ばれる構文のエラーです。文字の打ち間違い等であればエラー文にエラーが発生している行数を表示してくれますが、構文のエラーは「 Error: invalid syntax 」と一言返ってくるだけです。

下記の文はエラーが発生します。

# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals
import maya.cmds as cmds

# 設定したい値。リスト型で指定
value_list = [1, 0.5, 1]

# 設定したいアトリビュート名
attribute = 'color'

# どのノードに対して行うか
targetNode_list = cmds.ls(type='spotLight')

'''
選択したノードに対して行う場合
targetNode_list = cmds.ls(sl=True)

特定のノードに対して行うなら
targetNode_list = cmds.ls(type='タイプ名')
'''

#===============================================================

# 実行文

cmds.undoInfo(openChunk=True)

for targetNode in targetNode_list
    
    # 設定したい値が str 型の場合は thype='string' を追記
    cmds.setAttr(targetNode + '.' + attribute, *value_list)

cmds.undoInfo(closeChunk=True)

どの行でエラーが発生しているのかがわかりにくい時は、一部をまとめてコメントアウトして実行してみます。

# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals
import maya.cmds as cmds

# 設定したい値。リスト型で指定
value_list = [1, 0.5, 1]

# 設定したいアトリビュート名
attribute = 'color'

# どのノードに対して行うか
targetNode_list = cmds.ls(type='spotLight')

'''
選択したノードに対して行う場合
targetNode_list = cmds.ls(sl=True)

特定のノードに対して行うなら
targetNode_list = cmds.ls(type='タイプ名')
'''

'''
#===============================================================

# 実行文

cmds.undoInfo(openChunk=True)

for targetNode in targetNode_list
    
    # 設定したい値が str 型の場合は thype='string' を追記
    cmds.setAttr(targetNode + '.' + attribute, *value_list)

cmds.undoInfo(closeChunk=True)

'''

実行文を全てコメントアウトしてコードを実行してみるとエラーが発生しないことがわかります。この場合、コメントアウトしたコード内でエラーが発生していた、ということになります。

これを繰り返していくことでエラーの原因を特定していくことができます。

面倒だと感じたら コードエディタの導入を考えましょう。長文を書いていく際には必須になるアプリケーションです。
ここでは PyCharm を紹介しておきます。(紹介記事の紹介になります。)

-Maya Python
-, ,