也就是说,下面的pub = None
的值是什么?什么时候以及为什么这是一个好习惯?
counter = 0
pub = None
def callback_receive_number_data(msg):
global counter
counter += msg.data
new_msg = Int64()
new_msg.data = counter
pub.publish(new_msg)
sub = rospy.Subscriber('/number', Int64, callback_receive_number_data)
pub = rospy.Publisher('/number_count', Int64, queue_size=10)
答案 0 :(得分:2)
使用Google的一部分代码将我带到this page,该代码分解了每一行代码。
具体针对上述问题,该网站指出:
我们初始化一个全局计数器以及一个发布者。如果我们想 在程序的所有功能中使用它们,我们必须声明它们 在全球范围内,这远非最佳。稍后我们会看到 OOP代码将解决该问题。
因此,简而言之,这是一种声明变量而不分配任何内容的方法。如果它是字符串,则可以像some_string = ""
那样声明它,但是由于pub
是一个“发布者”,因此这是一种更容易声明它以便以后在代码中使用的方法。
答案 1 :(得分:1)
我主要是这样做的,以便我的IDE不会对我大吼大叫该变量可能未声明。在上面的示例中,如果您没有pub = None
行,则为了精明起见,一些编辑器将突出显示pub.publish(new_msg)
行,并说“可能未声明pub!”。或类似的东西。只要在运行时中存在pub
,然后调用该函数,就没有问题。编辑者不能仅仅通过查看您的代码(至少是不容易地)来解决这个问题,因此要避免警告,只需要确保在使用pub
在名称空间中就可以了。
答案 2 :(得分:0)
不需要pub = None
行。 可能很有用,但是在编写其余代码时却没有。
问题是您正在编写一个函数,该函数期望有一个全局变量pub
,它将调用某些方法。如果pub
未定义,则该代码将失败。不幸的是,如果pub
为None
(只是以另一种方式),它也会也失败。
现在,只要在pub
获得实际值之前不调用该函数,就可能不成问题。但是在这段代码中,函数确实在重新分配rospy.Subscriber
之前作为回调传递给pub
,因此(理论上对rospy
一无所知)在顶层的下一行运行之前立即被调用,为pub
提供了一个真实值。
有几种方法可以使事情变得更好。首先,您可以在对pub
进行任何操作之前定义callback_receive_number_data
。考虑只交换最后两行的顺序,以便首先定义pub
,然后定义sub
(以函数作为其回调)。
第二,您可以将错误处理代码添加到回调函数中,以检测尚未定义pub
的时间。如果pub
中没有适当的值,这将使函数以受控方式运行。对于这种方法,pub = None
分配会有所帮助,因为与完全丢失变量相比,在变量中检测到错误值更容易。但是这种方法也可能会抑制真正的错误,因此,只有在您确定有一种在每种情况下都可以处理错误的好方法(而不是崩溃并希望向程序员指出一个错误),我才会这样做。