2011-12-18 4 views
0

Почему эта рекурсивная функция возвращает несколько словарей вместо одного.Функция python возвращает несколько dicts вместо одного

def retFiles(dir): 
    data = {} 
    root = set() 
    os.chdir(dir) 
    cwd = os.getcwd() 
    for i in os.listdir(cwd): 
     if os.path.isfile(i): 
      data.setdefault(i, set()) 
      root.add(os.path.relpath(dir).replace("\\", "/")) 
      data[i] = root 
     else: 
      preisci(i) 
    print(data) 
+10

Uh ... эта функция не возвращается * НИЧЕГО * ... –

+0

Является ли последняя строка (печать (данные)), которая должна представлять, что ** будет ** обычно возвращаться из метода? –

ответ

1

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

if os.path.isfile(i): 
     data.setdefault(i, set()) 
     root.add(os.path.relpath(dir).replace("\\", "/")) 
     data[i] = root 
    else: 
     preisci(i) 

Линия

data[i] = root 

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

2

Есть две проблемы:

  1. Ваша функция не является рекурсивной (если preisci звонки retFiles, но вы не показали, что код).
  2. Он не возвращает ничего, не говоря уже о нескольких словарях, как вы утверждаете.

Я бы не использовал рекурсию здесь. Вместо этого рассмотрите возможность использования функции os.walk, которая может рекурсивно проходить по каталогу и всем его подкаталогам.

Чтобы исправить вторую точку, попробуйте изменить print на оператор возврата.

0

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

else: 
     retFiles(i) 

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

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