2015-12-16 4 views
1

Я написал рекурсивную функцию, чтобы делать запросы к базе Racktables и следить за соединениями между объектами и помещать их в список.Функция Python возвращает None для не emptylist

Все результаты добавляются и дополняются списком, который я даю в качестве аргумента. Функция работает до return заявления, но список дает None после того, как вернулся

Я добавил некоторые print заявления в функции для отладки, а список содержит нужные мне данные до этого момента:

def plink(Objid, PortId, mylist): 

    if len(mylist) < 2:       #If this is the first run put he initial data in the list 
     mylist.append(Objid) 
     mylist.append(PortId) 

    res = rt.GetLink(PortId)     #check if port is connected 

    if res == (False, False): 
     print 'exiting because not connected' #debug 
     return mylist       #If not connected return list 

    nextObj = rt.GetPortObjid(res[1]) 
    mylist.extend(res) 
    mylist.append(nextObj) 

    ispatch = rt.CheckObjType(nextObj, 50080) 
    if ispatch[0][0] == 0:      #If connected to a non-patch-unit, add data to list and exit 
     print "exiting because next object {0} is not a patchunit, mylist is {1}".format(nextObj, mylist) #debug 
     return mylist 

    patchPorts = rt.GetAllPorts(nextObj) 

    if len(patchPorts) != 2:     #check if the patchunit has the right number of ports 
     mylist.append("Error, patch-unit must have exactly two ports") 
     return mylist 

    if patchPorts[0][2] == res[1]:    #check which port is unseen and call the function again 
     print mylist 
     plink(nextObj, patchPorts[1][2], mylist) 
    else: 
     print mylist 
     plink(nextObj, patchPorts[0][2], mylist) 

results = ['Initial data'] 
allconn = plink(159, 947, results) 
print "The full connection is {0}".format(allconn) 

(я пропустил DB конструирует здесь)

Выполнение этого кода дает:

['Initial data', 159, 947, 'C150303-056', 4882, 1591L] 
['Initial data', 159, 947, 'C150303-056', 4882, 1591L, 'C140917-056', 4689, 727L] 
exiting because next object 1114 is not a patchunit, mylist is ['Initial data', 159, 947, 'C150303-056', 4882, 1591L, 'C140917-056', 4689, 727L, 'C140908-001', 3842, 1114L] 
The full connection is None 

Отладочные отпечатки показывают, что список заполняется точно так, как я предполагаю, но затем я получаю None при печати вне функции, также после назначения переменной заранее.

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

ответ

1
if patchPorts[0][2] == res[1]:    #check which port is unseen and call the function again 
    print mylist 
    plink(nextObj, patchPorts[1][2], mylist) 
else: 
    print mylist 
    plink(nextObj, patchPorts[0][2], mylist) 

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

if patchPorts[0][2] == res[1]:    #check which port is unseen and call the function again 
    print mylist 
    return plink(nextObj, patchPorts[1][2], mylist) 
else: 
    print mylist 
    return plink(nextObj, patchPorts[0][2], mylist) 
+0

Perfect. Большое спасибо, мне потребовалось бы много времени, чтобы найти эту информацию в документах. Я соглашусь ответить, как только мне позволено – Bruno9779

+1

Решение «Нет возвращается» в Python 101: (1) Рекурсивный? _yes_ → (2) Где отсутствует декларация возврата? _solved_ –

+0

Итак, данные хранились в mylist внутри функции между рекурсиями, но не были переданы последнему внутреннему экземпляру mylist? Это очень сложно отлаживать ... – Bruno9779

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