2016-08-18 7 views
0

У меня есть программа, которая загружает видеофайлы. Здесь она полностью, не беспокойтесь о ее короткой программе.Использовать переменную из одной функции в другой функции с помощью Python

import pafy 

def download(): 
    url = raw_input('Please enter the path to the video\n') 
    video = pafy.new(url) 
    vid_title = video.title 
    best = video.getbest() 
    streams = video.streams 
    print(vid_title) 
    for stream in streams: 
     print(stream) 
    print'Resolution: ',best.resolution,'\nExtension : ', best.extension 
    user_choice = raw_input("Do you want to download this video\ny or n\n") 
    if user_choice == 'y': 
     print'Your video will downloaded soon' 
     filename = best.download(filepath = '/home/mark/new_projects') 
     another_download() 
    elif user_choice =='n': 
     print'You have chosen not to download a video' 
     another_download() 


def another_download(): 
    another_choice = raw_input('Would you like to download another video\ny or n\n') 
    if another_choice == 'y': 
     download() 
    else: 
     print'Thank for using my program' 

download() 

Я хотел бы разбить его на более мелкие функции. Я попытался сделать это:

def url(): 
    url = raw_input('Please enter the path to the video\n') 
    video = pafy.new(url) 
    vid_title = video.title 
    best = video.getbest() 
    streams = video.streams 
    print(vid_title) 
    for stream in streams: 
     print(stream) 
    print'Resolution: ',best.resolution,'\nExtension : ', best.extension 

def download(): 
    user_choice = raw_input("Do you want to download this video\ny or n\n") 
    if user_choice == 'y': 
     print'Your video will downloaded soon' 
     filename = best.download(filepath = '/home/mark/new_projects') 
     another_download() 
    elif user_choice =='n': 
     print'You have chosen not to download a video' 
     another_download() 

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

+0

Можете ли вы показать свой порядок разрешения метода? Я имею в виду, откуда вызывается 'download()' и когда, то же самое о 'url()'. Просто укажите полную программу во втором примере. – light2yellow

+1

И да, есть способ использовать одну переменную из одной функции внутри другой функции. Используйте параметр * *. – light2yellow

+0

@ light2yellow Спасибо, я попытался использовать параметр, но я не делал это правильно, поэтому я пришел сюда. Я назвал оба url() и загрузил в конце файла –

ответ

0

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

Вариант 1: Предположим, что вы звоните download() первым, вы можете иметь url() вернуть то, что вам нужно, и хранить, что в переменной в download() метода:

def url(): 
    url = raw_input('Please enter the path to the video\n') 
    video = pafy.new(url) 
    vid_title = video.title 
    best = video.getbest() 
    streams = video.streams 
    print(vid_title) 
    for stream in streams: 
     print(stream) 
    print'Resolution: ',best.resolution,'\nExtension : ', best.extension 
    return best 

def download(): 
    user_choice = raw_input("Do you want to download this video\ny or n\n") 
    if user_choice == 'y': 
     best = url() 
     print'Your video will downloaded soon' 
     filename = best.download(filepath = '/home/mark/new_projects') 
     another_download() 
    elif user_choice =='n': 
     print'You have chosen not to download a video' 
     another_download() 

Вариант 2: Вы можете использовать глобальные переменные, хотя Я не знаю последствия использования их в этом случае:

best = None 
def url(): 
    global best 
    url = raw_input('Please enter the path to the video\n') 
    video = pafy.new(url) 
    vid_title = video.title 
    best = video.getbest() 
    streams = video.streams 
    print(vid_title) 
    for stream in streams: 
     print(stream) 
    print'Resolution: ',best.resolution,'\nExtension : ', best.extension 

def download(): 
    global best 
    user_choice = raw_input("Do you want to download this video\ny or n\n") 
    if user_choice == 'y': 
     print'Your video will downloaded soon' 
     filename = best.download(filepath = '/home/mark/new_projects') 
     another_download() 
    elif user_choice =='n': 
     print'You have chosen not to download a video' 
     another_download() 

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

0

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

Прямо сейчас скачать() -> another_download() -> скачать() -> another_download() -> скачать() -> ..., так что если пользователь хочет скачать n vids, у вас будет n * 2 - 1 функции, висящие до последнего.

Кстати возвращение решает вашу проблему:

def url(): 
    ... 
    return best 

def download(): 
    best = url() 
    ...