Невозможно напечатать alt и az, используя pyephem в функции

Я работаю над созданием простой программы на Python для класса, который будет работать на Raspberry Pi и Arduino для управления телескопом. Некоторое время назад я начал изучать Python, и у меня возникли проблемы с правильной работой моих функций. Прямо сейчас у меня есть это:

import ephem

def const(p, d): # find the constellation #
    def loc():
        sbend = ephem.Observer()
        sbend.lat = '41.67'
        sbend.lon = '86.26'
        p = getattr(ephem, p)
        p.compute(sbend)
        print p.alt, p.az

    o = getattr(ephem, p)
    print ephem.constellation(o(d))
    return loc()

const(raw_input('Planet: '), raw_input('yyyy/mm/dd: '))

Насколько я помню, функция внутри другой может вызывать переменную из родителя. Может ли это работать и наоборот, как у меня в конце? Я хотел бы иметь возможность распечатать созвездие (которое работает), а также высоту и азимут планеты на основе жестко заданного местоположения. По какой-то причине он не вычисляет высоту и азимут. Мысли?

ИЗМЕНИТЬ

Я добавил return loc() в строке 14.

Я больше читал, и в некоторых других потоках говорилось, что для доступа к внутренней функции ее нужно вернуть в конце родителя. Но это все еще не работает для меня.


person Brian    schedule 09.10.2013    source источник
comment
Я вижу, что вы определили функцию с именем loc(), но я не вижу, чтобы вы использовали ее где-либо. Итак, прежде чем я пойду дальше: есть ли какой-либо код, который вы случайно пропустили, когда вставляли этот код?   -  person Brandon Rhodes    schedule 09.10.2013
comment
Извините, я только что добавил это в строку 14.   -  person Brian    schedule 09.10.2013
comment
Если вы хотите вернуть функцию, вы просто говорите return loc — вместо этого, говоря return loc(), вы сначала сами вызываете loc(), чтобы получить возвращаемое значение (которое будет None, поскольку loc() не содержит оператора return), затем вы возвращаете это значение None в качестве возвращаемого значения const().   -  person Brandon Rhodes    schedule 09.10.2013


Ответы (2)


Я не понимаю, почему у вас есть одна функция внутри другой, поэтому я могу упустить часть проблемы, которую вы пытаетесь решить; но если бы я хотел определить, в каком созвездии находится планета, где имя планеты и дата представлены в качестве входных данных, то я бы просто выполнил эти шаги все подряд, без каких-либо сложных функций-внутри-функций:

import ephem

def const(planet_name, date_string):
    planet_class = getattr(ephem, planet_name)
    planet = planet_class()
    south_bend = ephem.Observer()
    south_bend.lat = '41.67'
    south_bend.lon = '-86.26'  # west is negative
    south_bend.date = date_string
    planet.compute(south_bend)
    return ephem.constellation((planet.ra, planet.dec))

print const(raw_input('Planet: '), raw_input('yyyy/mm/dd: '))
person Brandon Rhodes    schedule 09.10.2013
comment
У меня два вопроса: почему двойные скобки в return ephem.constellation((planet.ra, planet.dec))? Во-вторых, он по-прежнему не хочет возвращать какие-либо данные о местоположении после выбора планеты и установки даты. - person Brian; 09.10.2013
comment
Вы можете игнорировать последний вопрос. - person Brian; 09.10.2013
comment
Внутренний набор скобок создает кортеж. Я мог бы также написать это в два этапа: tup = (planet.ra, planet.dec), а затем сказать ephem.constellation(tup) - person Brandon Rhodes; 09.10.2013

Взяв пример @Brandon, вот мой окончательный код:

import ephem

def const(planet_name, date_string): 
    planet_class = getattr(ephem, planet_name) 
    planet = planet_class() 
    south_bend = ephem.Observer()
    south_bend.lat = '41.67'
    south_bend.lon = '-86.26'
    south_bend.date = date_string              
    planet.compute(south_bend)                  
    print ephem.constellation((planet.ra, planet.dec))
    return planet.alt, planet.az

print const(raw_input('Planet: '), raw_input('yyyy/mm/dd: '))

Посмотрев на него, я понял, что он использовал planet.ra и planet.dec, чтобы найти фоновое созвездие, а не печатать его координаты на небе. Все, что я сделал, это добавил обратный вызов в конце для печати данных высоты и азимута.

person Brian    schedule 09.10.2013