ROS Python スタイルガイド
Contents
このページは2013-07-21 06:19:05 版をもとにしています。 最新の情報は原文をご確認ください。
このページではROSのためにPythonコードを書く場合に従うべきスタイルガイドを定めています。このガイドはROSコアとそれ以外の両方について適応されます。
C++についてはC++ Style Guide(原文)を参照してください。
コーディングスタイル
PythonのコードはPEP 8に従うべきです。PEP 8は厳格なスタイルガイドではなく、可読性の一貫性を尊重します。スマートに行きましょう。PEP 8を簡単に以下にまとめます。
パッケージ名: package_name
クラス名: ClassName
メソッド名: method_name
フィールド名: field_name
プライベートなもの: _private_something
本当にプライベートなフィールド: self.__really_private_field
グローバルなもの: _global
- 4個のスペースによるインデント
ローダー
この段落はrosbuild/rosmakeを使用するパッケージにのみ必要となります。もしパッケージがcatkinを使用するならば、roslib.load_manifestを使用してはなりません。
roslibは、あなた個人のローカルファイルよりもROS Pythonパッケージを自動的にインポートできるものと想定されています。あなたのPythonパッケージが依存性を持つなら、下記のヘッダーを先頭に追加してください。
import roslib roslib.load_manifest('your_package_name')
roslib.load_manifest はあなたのManifest(原文)とPythonのパスに基づく依存性を見ます。複数のload_manifest呼び出しを使用しないでください。もし複数の呼び出しが必要ならば、おそらくあなたはmanifestにおける正しい依存性を構築できていないことが原因だと考えられます。
パッケージ/モジュール名 (__init__.py files)
すべてのPythonコードはモジュール名前空間に配置しなければなりません。ROSはあなたのPythonソースディレクトリをあなたの依存するの全てのパスへ移動します。これは誰か他のインポートに影響を与えないようにするために重要です。私達はこのモジュール名をあなたのROSパッケージ名と同一にすることを強く勧めます。
以下の2つは推奨されるコードレイアウトです:
msg/srvsを使用しない小さなモジュール:
packagename |- src/ |- packagename.py |- scripts/ |- non-exported python files
msgs/srvsを使用するモジュール
packagename |- src/ |- packagename/ |- __init__.py |- yourfiles.py |- scripts/ |- non-exported python files
もしあなたが__init__.pyについて知らないのであれば、What is init py used for?を読むことを勧めます。
より複雑なmsg/srvファイルのレイアウトは、Pythonのmsg/srvジェネレータがファイルをあなたのパッケージの名前空間に生成するときに必要になります。
あなたがソースコードをsrc/ディレクトリに置けない珍しいケース(たとえばサードパーティのコード)では、editing your manifestに基づいてPythonのあなたのパッケージのexportパスを上書きすることができます。
ノードファイルの説明のために次の節を見てください。
ノードファイル
ROSでは、ノードタイプの名前は実行可能な名前と同じです。典型的には、PythonファイルではMainスクリプトの先頭に#!/use/bin/env pythonを書くことを意味し、Mainスクリプトの名前はノードの名前と同じにします。
もしあなたのノードがシンプルなものであれば、スクリプトがノード全体のコードを含んでも構いません。そうでなければ、ノードファイルはimport packagenameでコードを呼び出すのが適当でしょう。
注意: 私達はROS固有のコードを再利用される一般的なコードから分離するように努めています。このノードファイルの分離とあなたのファイルがsrc/packagenameに配置されることはこの分離を促進するものです。
Python の特徴/バージョン
私達のターゲットはPython 2.5です。もちろん私達はコードをPython 2.6、2.7、Python3k などに簡単に移植できるように作ることを願っていますが。(詳しくはPEP 3100をご覧ください。) これは下記を意味します。
- 新たなスタイルのクラスを使用すること
reduce()を使用しないこと。sum()は多くの場合で有用であり、forループは同等かより速い
map()やfilter()など、Guido's hit listにある関数の使用を避ける。list comprehensionsを使用する
raise Exception("msg")をraise Exception, msgの代わりに使用する
バッククォートをreprへのショートカットに使用しない
"<>"を使わずに"!="を使用する。(注意:これは"<"、">"が削除されるのではなく、"<>"が削除されることを意味する)
正しい除算を使うためにfrom __future__ import divisionを使用する。切り捨て除算を使用しない。PEP 238
popen2、os.popenの代わりにsubprocessを使用する
dict.has_key()を避け、key in dictを使用する
zip()、range()、map()の戻り値をリストとして使用することを避ける。これらは将来イテレータを返すようになるため
string.{atoi|atof|...}()を使用せずにint()、float()などを使う
print >> f, "Message"を避け、f.write("Message\n") を使用する (例:sys.stderr.write("My error msg\n"))
上記のリストにあるすべては以下のどちらかによるものである:
- Python 2.5 と互換性がない
- Python 3000 で削除される
もしあなたのお気に入りがこの削除リストの中にあれば、Guidoへ連絡を取ってください。
注意: ROS Python コードはまだこのスタイルへ移行している途中なので、スタイルの一貫性のなさについては謝罪します。