解压较长元组的最佳实践 (Python 3.6)

Best Practice to Unpack Longer Tuples (Python 3.6)

将更长的元组传递给函数,并希望解包到特定变量中。

高级:

鉴于我正在尝试做的事情,我的问题是:

已经尝试过:

这是元组中的检测和位置:

multicast_sequence_problem_total = Counter(
    "multicast_sequence_problem_total",
    "Total of Sequence Errors (Multicast)",
    ['source_dc', 'destination_dc', 'vlan']
),
unicast_sequence_problem_total = Counter(
    "unicast_sequence_problem_total",
    "Total of Sequence Errors (Unicast)",
    ['source_dc', 'destination_dc', 'vlan']
),
multicast_duplicate_total = Counter(
    "multicast_duplicate_total",
    "Total of Duplicate Sequences (Multicast)",
    ['source_dc', 'destination_dc', 'vlan']
),
unicast_duplicate_total = Counter(
    "unicast_duplicate_total",
    "Total of Duplicate Sequences (Unicast)",
    ['source_dc', 'destination_dc', 'vlan']
)
latency_gauge = Gauge(
    "latency_average_gauge",
    "Latency Average",
    ['protocol', 'source_dc', 'destination_dc', 'vlan']
)
metrics = (
    multicast_sequence_problem_total,
    multicast_duplicate_total,
    unicast_sequence_problem_total,
    unicast_duplicate_total,
    latency_gauge
)

跳到我实际递增/设置指标值的其他函数——这里是解包:

mcast_seq, mcast_dup, uni_seq, uni_dup, avg_latency = metrics_tuple

为了debug进入了pdb,发现5个metrics中有3个其实是type: tuple:

(Pdb) type(metrics_tuple)
<class 'tuple'>
(Pdb) type(avg_latency)
<class 'prometheus_client.metrics.Gauge'>
(Pdb) type(mcast_seq)
<class 'tuple'>
(Pdb) type(mcast_dup)
<class 'tuple'>
(Pdb) type(uni_seq)
<class 'tuple'>
(Pdb) type(uni_dup)
<class 'prometheus_client.metrics.Counter'>
(Pdb)     

所以当我在我的代码中走得更远时,这会导致一些错误。 Python 认为我正在尝试在其他地方解包(我不希望有元组!)

在使用字典而不是元组后找到了答案。我的指标对象是元组,原因是我忘记删除检测它们的指标之间的一些逗号。

如果我在同时实例化字典或元组时进行检测(我没有这样做),那才有意义。

(facepalm) -- 花了一段时间才弄清楚,但 pdb 输出救了我。向我展示了只有 一些 指标是元组,而不是全部。寻找它们之间的区别使我找到了答案。