Строка pub = None
не нужна. может быть полезным, но с остальным кодом, как написано, это не так.
Проблема в том, что вы пишете функцию, которая ожидает глобальной переменной pub
, для которой будут вызываться определенные методы. Этот код потерпит неудачу, если pub
не определено. К сожалению, также потерпит неудачу, если pub
равно None
(просто по-другому).
Теперь это, вероятно, не проблема, если функция не вызывается до того, как pub
получит реальное значение. Но в этом коде функция действительно передается в качестве обратного вызова на rospy.Subscriber
до переназначения pub
, поэтому (не зная ничего о rospy
), она теоретически может быть вызвана немедленно, до следующего линия на верхнем уровне проходит, давая pub
реальное значение.
Есть несколько способов улучшить ситуацию. Во-первых, вы можете определить pub
, прежде чем делать что-нибудь с callback_receive_number_data
. Попробуйте просто поменять местами порядок последних двух строк, чтобы сначала определить pub
, а затем sub
(с функцией в качестве обратного вызова).
Во-вторых, вы можете добавить код обработки ошибок в функцию обратного вызова, чтобы определить, когда pub
еще не определено. Это позволило бы функции вести себя контролируемым образом, если в pub
нет подходящего значения. Для этого подхода было бы полезно присваивать pub = None
, так как в переменной легче обнаружить неверное значение, чем когда переменная полностью отсутствует. Но этот подход может также подавлять реальные ошибки, поэтому я бы пошел на это, только если вы уверены, что есть хороший способ обработки ошибок в любой ситуации (вместо сбоя с трассировкой, которая, мы надеемся, укажет программисту на ошибку) .