NameError: имя 'высота' не определено

1

У меня есть этот код gps, который получает данные gps и записывает в журнал:

#!/usr/bin/python

from systemd import journal
import gps
import time
import threading
import datetime

# Listen on port 2947 (gpsd) of localhost
session = gps.gps("localhost", "2947")
session.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE)

while True:
    try:
        report = session.next() # Wait for a 'TPV' report and display 
the current time

        # To see all report data, uncomment the line below
        #print report

        if report['class'] == 'TPV':
            if hasattr(report, 'time'):
                timestamp = (time.time()*1000)
                #print timestamp

            if hasattr(report, 'lat'):
                latitude = report.lat
                #print latitude

            if hasattr(report, 'lon'):
                longitude = report.lon
                #print longitude    

            if hasattr(report, 'alt'):
                altitude = report.alt
                #print altitude

        else:
            timestamp = (time.time()*1000)
            latitude = 0
            longitude = 0 
            altitude = 0

        journal.send(
        channel = 'gps',
        priority = journal.Priority.INFO,
        timestamp = "%f" % (timestamp),
        latitude = "%f" % (latitude),
        longitude = "%f" % (longitude), 
        altitude = "%f" % (altitude), 
        )

except KeyError:
    pass
except KeyboardInterrupt:
    quit()
except StopIteration:
    session = None
    print "GPSD has terminated"

И я получаю эту ошибку:

Traceback (most recent call last):
  File "gps-messi.py", line 57, in <module>
    altitude = "%f" % (altitude),
NameError: name 'altitude' is not defined

Смешная часть - это код, который отлично работает отлично, и иногда он дает мне эту ошибку. Я не могу понять, что я должен сделать, чтобы он работал правильно все время. Это имеет какое-то отношение к ней?

  • 1
    Вы должны всегда проверять, определена ли переменная, прежде чем пытаться отформатировать строку. У вас нет гарантии, что переменная будет определена, когда вы попытаетесь получить ее из библиотеки.
  • 2
    Возможно, это опечатка? if hasatr(report, 'alt'): должно быть hasattr ?
Показать ещё 7 комментариев
Теги:

5 ответов

3
Лучший ответ

Я предполагаю, что if hasattr(report, 'alt'): не разрешает True, тогда

if hasattr(report, 'alt'):
    altitude = report.alt

не будет присваивать что-либо altitude и там, когда вы доберетесь досюда

journal.send(
    channel = 'gps',
    priority = journal.Priority.INFO,
    timestamp = "%f" % (timestamp),
    latitude = "%f" % (latitude),
    longitude = "%f" % (longitude), 
    altitude = "%f" % (altitude), 
    )

вы по существу используете altitude прежде чем она будет назначена. Чтобы этого избежать, вы можете инициализировать altitude до некоторой величины, прежде чем перейти к этой точке с помощью

altitude=0

Это позволит убедиться, что оно назначено до его использования, и вы не должны получать эту ошибку.

  • 0
    Большое спасибо Мэтт. Так что лучше? Инициализация переменных перед оператором if или глобальная инициализация переменных?
  • 0
    Я думаю, что достаточно инициализировать перед оператором if. Может быть, сразу после назначения report .
Показать ещё 3 комментария
3

Кажется, что отчет из сеанса не имеет атрибута с именем "высота" в зависимости от случаев. Если атрибут "alt" существует, он создает переменную высоту, позволяющую коду работать. Если атрибут "alt" не существует, код не будет работать. Инициируйте переменные перед операторами if, и он будет работать нормально.

2

Я согласен с @wesgur вы инициируя alititude в if statemtent, но бывают ситуации, когда, что if выражение условия не будут выполнены, и программа не имеет определение altitude

1

Переместить блок

    timestamp = (time.time()*1000)
    latitude = 0
    longitude = 0 
    altitude = 0

before if report['class'] == 'TPV': branch. Таким образом, вы всегда будете инициализированы четырьмя переменными.

  • 0
    Так что лучше? Инициализация переменных перед оператором if или глобальная инициализация переменных?
  • 0
    Что делать, if report['class'] == 'TPV' равен true, но нет атрибута "alt" ? altitude остается неинициализированной в вашем текущем коде, как вы уже видели.
Показать ещё 3 комментария
0

Большое спасибо всем. Вот как выглядит мой код сейчас. Я тестировал его, и это кажется прекрасным. Но в случае, если я все еще что-то сползаю, может кто-то просто проверить отступы строки journal.send? Если то, что я сделал правильно (я изменил имена некоторых переменных и добавил скорость):

#!/usr/bin/python

from systemd import journal
import gps
import time
import threading
import datetime

# Listen on port 2947 (gpsd) of localhost
session = gps.gps("localhost", "2947")
session.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE)

while True:
    try:
        report = session.next() # Wait for a 'TPV' report and display the current time  
        # To see all report data, uncomment the line below
        #print report

        timestamp = 0        
        latitude = 0
        longitude = 0 
        altitude = 0
        speed = 0

        if report['class'] == 'TPV':

            if hasattr(report, 'time'):
                timestamp = (time.time()*1000)
                #print timestamp

            if hasattr(report, 'lat'):
                latitude = report.lat
                #print latitude

            if hasattr(report, 'lon'):
                longitude = report.lon
                #print longitude  

            if hasattr(report, 'alt'):
                altitude = report.alt
                #print altitude

            if hasattr(report, 'speed'):
                speed = report.speed
                #print speed

        journal.send(
        channel = 'gps',
        priority = journal.Priority.INFO,
        timestamp = "%f" % (timestamp),
        lat_deg = "%f" % (latitude),
        lon_deg = "%f" % (longitude), 
        alt_m = "%f" % (altitude), 
        speed_mps = "%f" % (speed),
        )


    except KeyError:
        pass
    except KeyboardInterrupt:
        quit()
    except StopIteration:
        session = None
        print "GPSD has terminated"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню