ROS交流群
ROS Group
产品服务
Product Service
开源代码库
Github
官网
Official website
技术交流
Technological exchanges
激光雷达
LIDAR
ROS教程
ROS Tourials
深度学习
Deep Learning
机器视觉
Computer Vision

ROS Python 代码风格说明


  • administrators

    此文翻译自ROS wiki

    本文定义了一个在开发ROS Python程序时应当遵循的代码风格指南。这个适用于所有的ROS代码,无论是核心还是非核心代码。

    1. 代码风格
      Python的代码应当遵循PEP8标准。PEP8并不是一个严格的代码风格标准。它对于代码可读性的要求要高于标准的一致性。所以在写代码的时候要灵活对待这个标准。下面是PEP8的一个简单总结
    • package_name
    • ClassName
    • method_name
    • field_name
    • _private_something
    • self.__really_private_field
    • _global
    • 4 space indentation
    1. load
      这里只是对于使用 rosbuild/rosmake的软件包有效。如果你使用c的是catkin则不能使用roslib,load_manifest
      (鉴于现在大家基本都在使用catkin,这一段略过)

    2. 软件包和模块的命名规则(__init__.py 文件)
      所有的Python代码必须被放置在一个模块命名空间(module namespace). ROS会把你的Python代码文件夹导出到你的依赖路径里面。所以一定要小心不能和其他人引用的软件包相冲突。我们非常建议你的软件包名称和你的ROS包名称一致。

    下面是两种推荐的代码文件布局风格

    没有消息或服务的小模块

    packagename
     |- src/
        |- packagename.py
     |- scripts/
        |- non-exported python files
    

    有消息和服务的模块

    packagename
     |- src/
        |- packagename/
          |- __init__.py
          |- yourfiles.py
     |- scripts/
        |- non-exported python files
    

    如果你不了解什么是__init__.py, 我们推荐你看看这篇文章

    由于 Python的 消息和服务生成程序需要在你的软件包里面生成文件,所以这个更复杂的文件布局是需要的。

    在一些罕见的情况下,你不能把你的代码放入 /src 文件夹内(比如 第三方代码),你需要通过修改你的Mainfest文件来覆盖Python的导出路径。

    1. 节点文件

    在ROS中,节点的类型和节点文件的名称一样。一般情况下,这意味着在你的文件代码的头部添加#!/usr/bin/env python, 同时文件名为节点的名字。

    如果你的节点很简单,一个文件可能就包含了所有的代码。否则很有可能要在代码中引入其他代码。

    注意: 我们努力把和ROS相关的代码与能够重用的和通用的代码分开。 把节点文件和放置在src/packagename文件夹内文件分开能够很好的实现这个目的。

    1. Python的功能和版本

    我们的目标环境是Python 2.5, 尽管我们希望代码能够在Python 2.6,Python2.7 以及Python3K等等环境使用。这意味着:

    • 使用新式风格的class
    • 不要使用reduce() sum(),在大多数情况下for的效率更高
    • 避免使用map() filter(),使用list作为替代
    • 不要用反引号代替repr
    • 不要用<>代替 “!=”
    • 如果你需要真的除法运算(默认是整除) 使用 from future import division
    • 使用subprocess , 不要使用popen2, os.popen
    • 不要使用 dict.has_key() 用 key in dict
    • 不要使用 zip(),range(), map(),filter()因为在以后的版本中会返回迭代器
    • 不要使用string.{atoi|atof|…}(),使用int(), float()
    • 不要使用 print >> f, “Message”. 使用f.write(“Message\n”)

    以各条的的原因

    • 不能兼容Python 2.5
    • 在Python 3000中被限制使用