2013-04-01 4 views
0

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

Я могу получить все, чтобы работать в программе, проблема, с которой я сталкиваюсь, связана с определенными функциями.

Если вы посмотрите на run_price1(), вы заметите, что он идентичен идентификатору run_price(); однако run_price() находится внутри функции обновления.

Если я выхожу из функции обновления, функция обновления не работает. Если я не перечислил его где-то вне функции обновления, более поздний пользовательский ввод не работает.

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

Мой код:

import mechanize 

from bs4 import BeautifulSoup 


def run_price1(): 

    myBrowser = mechanize.Browser() 
    htmlPage=myBrowser.open(web_address) 
    htmlText=htmlPage.get_data() 
    mySoup = BeautifulSoup(htmlText) 

    myTags = mySoup.find_all("span", id=tag_id) 

    myPrice = myTags[0].string 

    print"The current price of, {} is: {}".format(ticker.upper(), myPrice) 



def update(): 

    my_stocks = ["aapl","goog","sne","msft","spy","trgt","petm","fslr","fb","f","t"] 

    counter = 0 

    while counter < len(my_stocks): 

     web_address = "http://finance.yahoo.com/q?s={}".format(my_stocks[counter]) 
     ticker = my_stocks[counter] 
     #'yfs_l84_yhoo' - that 1(one) is really a lowercase "L" 
     tag_id = "yfs_l84_{}".format(ticker.lower()) 
     def run_price(): 

      myBrowser = mechanize.Browser() 
      htmlPage=myBrowser.open(web_address) 
      htmlText=htmlPage.get_data() 
      mySoup = BeautifulSoup(htmlText) 

      myTags = mySoup.find_all("span", id=tag_id) 
      myPrice = myTags[0].string 
      print"The current price of, {} is: {}".format(ticker.upper(), myPrice) 

     run_price() 

     counter=counter+1 

update()   

ticker = "" 

while ticker != "end": 

    ticker = raw_input("Type 'update', to rerun portfolio, 'end' to stop program, or a lowercase ticker to see price: ") 
    web_address = "http://finance.yahoo.com/q?s={}".format(ticker.lower()) 
    tag_id = "yfs_l84_{}".format(ticker.lower()) 

    if ticker == "end": 
     print"Good Bye" 

    elif ticker == "update": 
     update() 

    else: 
     run_price1() 
+1

Почему не только называют 'run_price1' вместо' run_price' и удалить последний вообще? У вас нет * *, чтобы определить его внутри 'update'. –

+0

Я пробовал это, я бы предпочел сделать это, но это не сработает. Я получаю сообщение об ошибке - NameError: глобальное имя «web_address» не определено –

ответ

0

Вы можете просто позвонить run_price1() из функции update(), где вы сейчас называете run_price.

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

Любое значение, что ваша функция должна ли нужно передать в качестве аргумента:

def run_price1(web_address, tag_id): 
    # ... 

def update(): 
    my_stocks = ["aapl","goog","sne","msft","spy","trgt","petm","fslr","fb","f","t"] 

    counter = 0 

    while counter < len(my_stocks): 

     web_address = "http://finance.yahoo.com/q?s={}".format(my_stocks[counter]) 
     ticker = my_stocks[counter] 
     #'yfs_l84_yhoo' - that 1(one) is really a lowercase "L" 
     tag_id = "yfs_l84_{}".format(ticker.lower()) 

     run_price1(web_address, tag_id) 

     counter=counter+1 
+0

Вот как я написал его изначально, он дает мне - NameError: глобальное имя «web_address» не определено –

+0

Я вижу, что вы делали, я не заметил что вы добавили web_address в круглые скобки. Если я добавлю это, я получаю IndexError: индекс индекса вне диапазона –

+0

@LoWri: Ах, 'tag_id' - еще один параметр, который необходимо передать. –

Смежные вопросы