2016-06-21 6 views
0

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

NameError: глобальное имя «savemovieurl» не определен

, как я могу получить доступ к «savemovieurl» из функции «tmdb_posters» внутри «dynamic_data_entry», чтобы сохранить его в базу данных?

Я попытался добавить глобальное имя переменной и не имел успеха.

import requests 
import urllib 

import sqlite3 
import time 
import datetime 
import random 



movie = raw_input('Enter your movie: ') 
print('You searched for: ', movie) 

def imdb_id_from_title(title): 
    """ return IMDb movie id for search string 

     Args:: 
      title (str): the movie title search string 
     Returns: 
      str. IMDB id, e.g., 'tt0095016' 
      None. If no match was found 
    """ 
    pattern = 'http://www.imdb.com/xml/find?json=1&nr=1&tt=on&q={movie_title}' 
    url = pattern.format(movie_title=urllib.quote(title)) 
    r = requests.get(url) 
    res = r.json() 
    # sections in descending order or preference 
    for section in ['popular','exact','substring']: 
     key = 'title_' + section 
     if key in res: 
      return res[key][0]['id'] 

if __name__=="__main__": 
    title = movie 
    imdb_info_returned = ("{1}".format(title, imdb_id_from_title(title))) 
    print imdb_info_returned 


import os 
import requests 

CONFIG_PATTERN = 'http://api.themoviedb.org/3/configuration?api_key={key}' 
IMG_PATTERN = 'http://api.themoviedb.org/3/movie/{imdbid}/images?api_key={key}' 
KEY = '47db65094c31430c5a2b65112088d70e' 

imdb_id_input = imdb_info_returned 
print('You searched for: ', imdb_id_input) 



def _get_json(url): 
    r = requests.get(url) 
    return r.json() 

def _download_images(urls, path='.'): 
    """download all images in list 'urls' to 'path' """ 

    for nr, url in enumerate(urls): 
     r = requests.get(url) 
     filetype = r.headers['content-type'].split('/')[-1] 
     filename = 'poster_{0}.{1}'.format(nr+1,filetype) 
     filepath = os.path.join(path, filename) 
     with open(filepath,'wb') as w: 
      w.write(r.content) 

def get_poster_urls(imdbid): 
    """ return image urls of posters for IMDB id 
     returns all poster images from 'themoviedb.org'. Uses the 
     maximum available size. 
     Args: 
      imdbid (str): IMDB id of the movie 
     Returns: 
      list: list of urls to the images 
    """ 
    config = _get_json(CONFIG_PATTERN.format(key=KEY)) 
    base_url = config['images']['base_url'] 
    sizes = config['images']['poster_sizes'] 

    """ 
     'sizes' should be sorted in ascending order, so 
      max_size = sizes[-1] 
     should get the largest size as well.   
    """ 
    def size_str_to_int(x): 
     return float("inf") if x == 'original' else int(x[1:]) 
    max_size = max(sizes, key=size_str_to_int) 

    posters = _get_json(IMG_PATTERN.format(key=KEY,imdbid=imdbid))['posters'] 
    poster_urls = [] 


    rel_path = posters[0]['file_path'] 
    url = "{0}{1}{2}".format(base_url, max_size, rel_path) 
    poster_urls.append(url) 

    return poster_urls 

def tmdb_posters(imdbid, count=None, outpath='.'):  
    urls = get_poster_urls(imdbid) 
    if count is not None: 
     urls = urls[:count] 
    _download_images(urls, outpath) 




    savemovieurl = urls 
    print savemovieurl 





conn = sqlite3.connect('tutorial.db') 
c = conn.cursor() 



def create_table(): 
    c.execute("CREATE TABLE IF NOT EXISTS movies(unix REAL, datestamp TEXT, keyword TEXT, value REAL, moviename TEXT, movieimage TEXT, movieurl TEXT)") 

def data_entry(): 
    c.execute("INSERT INTO movies VALUES(1452549219,'2016-01-11 13:53:39','Python',6,'movienamehere1', 'savemovieurl', 'movieurlhere1')") 
    conn.commit() 
    c.close() 
    conn.close() 



def dynamic_data_entry(argument) : 
    unix = time.time() 
    date = str(datetime.datetime.fromtimestamp(unix).strftime('%Y-%m-%d %H: %M: %S')) 
    keyword = 'keyword_string' 
    movieurl = 'bing.com' 
    value = random.randrange(0,10) 
    savemovieurl2 = 'testimageurl.com' 
    print argument 
    c.execute("INSERT INTO movies (unix, datestamp, keyword, value, moviename, movieimage, movieurl) VALUES (?, ?, ?, ?, ?, ?, ?)", (unix, date, keyword, value, movie, savemovieurl2, movieurl)) 
    conn.commit() 

create_table() 
#data_entry() 

for i in range(10) : 
    dynamic_data_entry(savemovieurl) 
    time.sleep(1) 
c.close() 
conn.close() 



if __name__=="__main__": 
    tmdb_posters(imdb_id_input) 
+3

Ты знаешь ключевое слово "return"? Не * печатайте * значения с вашими функциями - * возвращайте * их, чтобы вызывающий код мог использовать их или передавать их. –

+0

поэтому, если я заменю отпечатки с возвратом, он должен работать? – Hunter

+0

@JohnColeman и Sofia оба правильны, что ответ на ваш вопрос заключается в использовании оператора 'return'. ** Однако **, глядя на ваш код, я не верю, что ответ действительно поможет. Вы взяли два файла, которые были настроены для самостоятельной работы и связали их вместе: это может работать иногда, но в конечном итоге это приведет к непредсказуемой ситуации в долгосрочной перспективе. Я не хочу звучать снисходительно, но то, что вам действительно нужно, - это учебник по основам Python: как работает скрипт python, что такое функция, почему «if __name__ ==» __main __ »:' there, etc –

ответ

0

Я думаю, что это уже есть ответ здесь: How do I use a variable so that it is inside and outside of a function

Я знаю, но я должен прокомментировать это по какой-то причине я не могу, так что я просто думал, что я пишу его в качестве ответа вместо. Надеюсь, это поможет.

+0

Я все еще не понимаю, что делать? – Hunter

+0

для функции (dynamic_data_entry), я передаю возвращаемое значение из tmdb_posters в качестве аргумента функции. Однако я могу напечатать аргумент с функцией печати без ошибок, но когда я попытаюсь сохранить аргумент переменной, которую нужно использовать для сохранения в базе данных, я получаю сообщение об ошибке. Почему я могу напечатать аргумент, но не сохранить его в переменной? – Hunter

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