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



>将较长的元组传递到函数中,并希望解压缩到特定变量中。

高级:

  • 我检测了一些指标(普罗米修斯(,假设其中的 5-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

使用 pdb 进行调试,发现 5 个指标中有 3 个实际上是类型:元组:

(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 输出救了我。 向我展示了只有一些指标是元组,而不是全部。 寻找它们之间的区别使我找到了答案。

最新更新