for loop over function that returns a tuple?
Steven D'Aprano
steve at pearwood.info
Wed Sep 2 12:09:05 EDT 2015
On Wed, 2 Sep 2015 09:49 pm, Victor Hooi wrote:
> I have a function which is meant to return a tuple:
>
> def get_metrics(server_status_json, metrics_to_extract, line_number):
> <SOME_CODE>
> return ((timestamp, "serverstatus", values, tags))
>
> I also have:
>
> def create_point(timestamp, metric_name, values, tags):
> return {
> "measurement": _MEASUREMENT_PREFIX + metric_name,
> "tags": tags,
> "time": timestamp,
> "fields": values
> }
>
> I am calling get_metric in a for loop like so:
>
> for metric_data in get_metrics(server_status_json, mmapv1_metrics,
> line_number):
> json_points.append(create_point(*metric_data))
Ah, now I see what's happening!
Sorry for being so dim, I thought that get_metrics returned a list or
sequence of tuples:
[(timestamp, "serverstatus", values, tags),
(timestamp, "serverstatus", values, tags),
...
(timestamp, "serverstatus", values, tags)]
and you were iterating over the list, so that each time you would get a
tuple of four values:
metric_data = (timestamp, "serverstatus", values, tags)
which you can then pass to create_point:
create_point(*metric_data)
So you confused me by saying that metric_data held only the timestamp. But
now I see that I was mistaken, and you are doing this:
for metric_data in get_metrics( ... ): # returns a single tuple
# first time through the loop, metric_data = timestamp;
# second time through the loop, metric_data = "serverstatus"
# third time through the loop, metric_data = values
# final time through the loop, metric_data = tags
Get rid of the loop, and write this:
metric_data = get_metrics(server_status_json, mmapv1_metrics, line_number)
json_points.append(create_point(*metric_data))
--
Steven
More information about the Python-list
mailing list