Почему двойное считается глобальным именем? - PullRequest
1 голос
/ 25 ноября 2011

Я создал код ниже, когда я импортирую модуль и пытаюсь запустить его, я получил следующую ошибку:

>>> import aiyoo
>>> aiyoo.bixidist(1,3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "aiyoo.py", line 50, in bixidist
    currentDist = dist(X,Y,c)
  File "aiyoo.py", line 39, in dist
    distance = math.sqrt(math.pow((X-getLat(i)),2)+math.pow((Y-getLong(i)),2))
  File "aiyoo.py", line 28, in getLat
    xmlLat = double(xmlLat)
NameError: global name 'double' is not defined

Функция double использовалась для того, чтобы преобразовать вывод Unicode из XML в double как ввод для следующих функций. Поэтому я не понимаю, почему, когда импортируется модуль aiyoo, оно считается именем.

Вот модуль, который получил название aiyoo.py:

.
import math
import urllib2
from xml.dom.minidom import parseString
file = urllib2.urlopen('http://profil.bixi.ca/data/bikeStations.xml')
data = file.read()
file.close()
dom = parseString(data)

#this is how you get the data
def getID(i):
    xmlID = dom.getElementsByTagName('id')[i].toxml()
    xmlID = xmlID.replace('<id>','').replace('</id>','')
    xmlID = int(xmlID)
    return xmlID

def getLat(i):
    xmlLat = dom.getElementsByTagName('lat')[i].toxml()
    xmlLat = xmlLat.replace('<lat>','').replace('</lat>','')
    xmlLat = double(xmlLat)
    return xmlLat

def getLong(i):
    xmlLong = dom.getElementsByTagName('long')[i].toxml()
    xmlLong = xmlLong.replace('<long>','').replace('</long>','')    
    xmlLong = double(xmlLong)
    return xmlLong

#this is how we find the distance for a given station
def dist(X,Y,i):
    distance = math.sqrt(math.pow((X-getLat(i)),2)+math.pow((Y-getLong(i)),2))
    return distance

#this is how we find the closest station
def bixidist(X,Y):
     #counter for the lowest
    lowDist = 100000
    lowIndex = 0
    c = 0
    end = len(dom.getElementsByTagName('name'))
    for c in range(0,end):
            currentDist = dist(X,Y,c)
            if currentDist < lowDist:
                lowIndex = c
                lowDist = currentDist
    return getID(lowIndex)

Ответы [ 4 ]

3 голосов
/ 25 ноября 2011

Как ответили другие, double не является встроенным типом в python.Вы должны использовать, float вместо.Плавающая точка реализована с использованием double в C [ ref ].

А что касается основной части вашего вопроса, то есть «почему double считается глобальным именем?», Когда вы используете variable-name скажем double, который не найден в локальном контексте, следующий поиск в глобальном контексте.Тогда, если он не найден даже в глобальном контексте, возникает исключение: 1009 *.

Happy Coding.

1 голос
/ 25 ноября 2011

В Python нет типа double.И если вы посмотрите на ошибку, он жалуется, что не может найти ничего с именем double.Тип с плавающей точкой в ​​Python называется float.

0 голосов
/ 25 ноября 2011

Как и в других 2 ответах, которые были до сих пор, Python не имеет типа переменной double, вместо этого он имеет float.

Теперь вопрос в вашем названии и, возможно, еще один источник путаницы для вас.Причина, по которой интерпретатор говорит «NameError: глобальное имя« double »не определено» », объясняется тем, как Python выполняет поиск имен функций, переменных, объектов и т. Д. Этот шаблон описывается правилами пространства имен и области действия Python.Поскольку вы пытались вызвать несуществующую функцию Double из функции без ее определения (т. Е. SomeObject.Double(x)), Python сначала ищет объект с таким именем в локальном пространстве имен (пространстве имен текущей функции, которая выполняется),затем локальное пространство имен включающих функций, затем глобальное пространство имен и, наконец, встроенное пространство имен.Причина, по которой переводчик дал вам это сообщение, заключается в порядке поиска Python определения Double().глобальное пространство имен было последним местом, которое он проверял, прежде чем искать его во встроенных модулях (которые являются кодировкой Python, а не вашей, поэтому я думаю, что интерпретатору не имеет смысла говорить «NameError: встроенное имя« double »не определено").По крайней мере, я думаю, что это происходит.Я все еще не очень опытный программист, поэтому я верю, что кто-то еще исправит меня, если я что-то не так.

0 голосов
/ 25 ноября 2011

должно быть xmlLat = float(xmlLat)

Python float совпадает с double других языков.(64 бита)

http://codepad.org/AayFYhEd

...