Ошибка распаковки значения Python - PullRequest
0 голосов
/ 17 июля 2009

Я создаю приложение просмотра / загрузки файлов для каждого пользователя, используя Django, и когда я запускаю эту функцию


def walkdeep(request, path):
    path, dirs, files = walktoo('/home/damon/walktemp/%s' % path)
    return render_to_response('walk.html', {
        'path' : path[0],
        'dirs' : path[1],
        'files' : path[2],
    }, context_instance=RequestContext(request))

def walktoo(dir):
    for path, dirs, files in os.walk(dir):
        yield path, dirs, files
    print path, dirs, files

Я получаю эту ошибку:

need more than 1 value to unpack

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

редактирование:

это было на самом деле очень глупо с моей стороны, я полностью забыл об os.listdir (dir), который является гораздо более разумной функцией для моих целей. Если вы используете выбранный ответ, он устраняет проблему, с которой я столкнулся, но не с желаемыми результатами.

Ответы [ 2 ]

7 голосов
/ 17 июля 2009
path, dirs, files = walktoo('/home/damon/walktemp/%s' % path)

В этой строке вы ожидаете, что walktoo вернет кортеж из трех значений, которые затем будут распакованы в path, dirs и files. Однако ваша функция walktoo является объектом генератора: вызов walktoo() возвращает одно значение - генератор. Вы должны вызвать next() в генераторе (или вызвать его неявно, выполнив какую-то итерацию для него), чтобы получить то, что вам действительно нужно, а именно 3-кортеж, который он выдает.

Я не совсем понимаю, что вы хотите сделать - ваша функция walkdeep() написана так, как будто она хочет использовать только первое значение, возвращаемое walktoo(). Вы хотели сделать что-то подобное?

for path, dirs, files in walktoo(...):
    # do something
1 голос
/ 17 июля 2009

Исходя из вашего комментария к Адаму Розенфилду , это еще один подход для получения одного слоя os.walk (dir).

path, dirs, files = [_ for _ in os.walk('/home/damon/walktemp/%s' % path)][0]

Это альтернатива вашей функции walktoo (dir).

Также убедитесь, что ваш второй параметр render_to_response использует созданные вами переменные:

{'path' : path,
 'dirs' : dirs,
 'files' : files,}

path - это строка, поэтому, говоря path[0] ... path[1] ... path[2], вы на самом деле говорите использовать первый, второй и третий символ строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...