2015-08-27 4 views
0

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

data_checkpoint_size = cclient.samples.list(meter_name ='checkpoint.size') 
data_checkpoint_length = cclient.samples.list(meter_name ='checkpoint.length') 
data_checkpoint_pause = cclient.samples.list(meter_name ='checkpoint.pause') 


def counterVolume(data_checkpoint_size, data_checkpoint_length, data_checkpoint_pause): 
    for each in data_checkpoint_size: 
    d = each.counter_volume 
    for each in data_checkpoint_length: 
    e = each.counter_volume 
    for each in data_checkpoint_pause: 
    f = each.counter_volume 
    pubnub.publish(channel='channel', message= {'checkpoint_size': d, 'checkpoint_length': e, 'checkpoint_pause': f}) 

counterVolume(data_checkpoint_size, data_checkpoint_length, data_checkpoint_pause) 

И вместо этого я получаю следующий результат вместо данных. checkpoint_size, checkpoint_length и checkpoint_pause три различных метров, эти три различных потоков данных

{ 
    checkpoint_length: 75, 
    checkpoint_size: 5000, 
    checkpoint_pause: 50 
} 
+1

Ну, во-первых, нам нужно увидеть, как вы это называете. –

+0

Вы говорите, что 'pubnub.publish' вызывается только один раз? Он * будет * вызываться один раз, потому что это * вне * цикла. –

+1

Ваши d, e и f повторно назначаются через цикл for. – ismailsunni

ответ

2

Как и @ismailsunni, ваши переменные переназначаются. Это делает предположение о том, что все данные той же длины, но она должна работать:

def counterVolume(data_checkpoint_size, data_checkpoint_length, data_checkpoint_pause): 
    for i, size in enumerate(data_checkpoint_size): 
     length = data_checkpoint_length[i] 
     pause = data_checkpoint_pause[i] 
     message = { 
      'checkpoint_size': size .counter_volume, 
      'checkpoint_length': length.counter_volume, 
      'checkpoint_pause': pause.counter_volume, 
     } 
     pubnub.publish(channel='channel', message=message) 

Я бы проверить, чтобы убедиться, что они все же длину первого и поднять конкретное исключение (так проще отладка):

size_len = len(data_checkpoint_size) 
length_len = len(data_checkpoint_length) 
pause_len = len(data_checkpoint_pause) 

if size_len != length_len or length_len != pause_len: 
    raise Exception('Custom exception message.') 
2

Вы переопределение D, E и F каждый раз, когда вызывается each.counter_volume. Если вы хотите, чтобы в конечном итоге с большим количеством коллекций, возвращенных данных, вам нужно что-то вроде этого:

for i in range(data_checkpoint_size): 
    d = data_checkpoint_size[i].counter_volume 
    e = data_checkpoint_length[i].counter_volume 
    f = data_checkpoint_pause[i].counter_volume 
    pubnub.publish(channel='channel', message= {'checkpoint_size': d, 'checkpoint_length': e, 'checkpoint_pause': f}) 

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

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