为什么先将Python变量初始化为None,然后再提供真实值?

时间:2019-04-18 21:23:20

标签: python rospy

也就是说,下面的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)

3 个答案:

答案 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未定义,则该代码将失败。不幸的是,如果pubNone(只是以另一种方式),它也会失败。

现在,只要在pub获得实际值之前不调用该函数,就可能不成问题。但是在这段代码中,函数确实在重新分配rospy.Subscriber之前作为回调传递给pub,因此(理论上对rospy一无所知)在顶层的下一行运行之前立即被调用,为pub提供了一个真实值。

有几种方法可以使事情变得更好。首先,您可以在对pub进行任何操作之前定义callback_receive_number_data。考虑只交换最后两行的顺序,以便首先定义pub,然后定义sub(以函数作为其回调)。

第二,您可以将错误处理代码添加到回调函数中,以检测尚未定义pub的时间。如果pub中没有适当的值,这将使函数以受控方式运行。对于这种方法,pub = None分配会有所帮助,因为与完全丢失变量相比,在变量中检测到错误值更容易。但是这种方法也可能会抑制真正的错误,因此,只有在您确定有一种在每种情况下都可以处理错误的好方法(而不是崩溃并希望向程序员指出一个错误),我才会这样做。