cancel
Showing results for 
Search instead for 
Did you mean: 
cancel
1052
Views
0
Helpful
5
Replies

Looping through list of device and associated speed dial

I fetched a list of devices and pass this into a subsequent getPhone request, with some logic to grab the phone name and speed dial info. My loop may be defective as i'm only getting the last item.
here's a snippet of the code:

 

'for device in dictOfNameDesc:
service = client.create_service(binding, location)
resp = service.getPhone(name=device)


phoneNameAnd_SD = [{'deviceName' : resp['return'].phone.name}, {'speeddials' : resp['return'].phone.speeddials.speeddial[0].dirn}]

 

justNameAndSpeed = []

for dict_item in phoneNameAnd_SD:
for key in dict_item:
justNameAndSpeed.append(dict_item[key])


print ('Name and SD is', justNameAndSpeed)


any assistance is appreciated.

 

 

1 Accepted Solution

Accepted Solutions

In which case you are trying to access an object variable which itself has a value of None. ie phone.speeddials = None.

 

Perhaps add a conditional to manage against this scenario:

if resp['return'].phone.speeddials is not None:
    phoneNameAnd_SD.append({'deviceName' : resp['return'].phone.name, 
                            'speeddials' : resp['return'].phone.speeddials.speeddial[0].dirn})
else:
    phoneNameAnd_SD.append({'deviceName' : resp['return'].phone.name, 
                            'speeddials' : "UNKNOWN"})

View solution in original post

5 Replies 5

Seb Rupik
VIP Alumni
VIP Alumni

Hi there,

It looks like phoneNameAnd_SD should be a list of dictionaries, however your first for loop keeps instantiating the variable with a new list (and single dictionary) on each itteration.

The first loop needs to look like:

phoneNameAnd_SD = []
for device in dictOfNameDesc: service = client.create_service(binding, location) resp = service.getPhone(name=device) phoneNameAnd_SD.append({'deviceName' : resp['return'].phone.name, 'speeddials' : resp['return'].phone.speeddials.speeddial[0].dirn})

cheers,

Seb.

Hi Seb, 
thanks for your response. I tried that but now get 'speeddials' : resp['return'].phone.speeddials.speeddial[0].dirn})
AttributeError: 'NoneType' object has no attribute 'speeddial'

In which case you are trying to access an object variable which itself has a value of None. ie phone.speeddials = None.

 

Perhaps add a conditional to manage against this scenario:

if resp['return'].phone.speeddials is not None:
    phoneNameAnd_SD.append({'deviceName' : resp['return'].phone.name, 
                            'speeddials' : resp['return'].phone.speeddials.speeddial[0].dirn})
else:
    phoneNameAnd_SD.append({'deviceName' : resp['return'].phone.name, 
                            'speeddials' : "UNKNOWN"})

hi -- i've made progress but one additional question:

in looping through a list of devices i may run into a scenario where a device may have been deleted. how do i account for this case. basically, i want to print or store the error but still proceed through the list.

 

thanks

say the current logic is 
try:
resp = service.getPhone(name=device)

except Fault as err:
print('Zeep error: xxxx: {err}'.format( err = err ) )
else:
print( 'getPhone response:' )

 

hmmm, the problem you will have is that a try block will exit once an error is encountered, so a for loop in a try block may never complete. Instead place the try block in a second method and have the for loop call that method and handle the returned values. Something like this:

def method1():
    for device in devices:
        resp = method2(device)
        
        if resp is not None:
           ...continue...

def method2(device):
    try:
       ...blah...
       return somethingGood
    except:
       ...foo...
       return None

cheers,

Seb.

Getting Started

Find answers to your questions by entering keywords or phrases in the Search bar above. New here? Use these resources to familiarize yourself with the community: