Используйте переменную из одной функции в другой функции с 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()

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

2 ответа

Решение

Здесь есть несколько вариантов для вас. Я постараюсь выложить их как можно лучше.

Вариант 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()

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

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

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

Случайный возврат решает вашу проблему:

def url():
    ...
    return best 

def download():
    best = url()
    ...
Другие вопросы по тегам