繁体   English   中英

拆包较长元组的最佳实践(Python 3.6)

[英]Best Practice to Unpack Longer Tuples (Python 3.6)

将更长的元组传递给函数,并希望将其分解为特定的变量。

高水平:

  • 我测试了一些指标(普罗米修斯),比如说5-6
  • 指标放入元组,并作为arg传递给函数
  • 解压缩该函数似乎会导致实际上一些新变量的类型为“元组”,而不是我期望的Prometheus度量对象

鉴于我要做什么,我的问题是:

  • 我是否正确使用/拆开元组?
  • 元组使用中是否可能存在明显影响这一点的限制?
  • 在如何管理这种情况下是否有更好的方法? 我选择了一个元组,因为我喜欢不变性,并且能够将变量明确分配给特定的度量对象。 但是,如果有更好的方法,我完全可以接受。

已尝试:

  • 确认vars数量与元组中的指标数量匹配

这是仪器和放入元组的位置:

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个实际上是类型: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输出救了我。 告诉我,只有一些指标是元组,而不是全部。 找出它们之间的差异,我找到了答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM