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

Posted

技术标签:

【中文标题】解压更长元组的最佳实践 (Python 3.6)【英文标题】:Best Practice to Unpack Longer Tuples (Python 3.6) 【发布时间】:2019-09-12 16:26:11 【问题描述】:

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

高层:

我检测了一些指标 (Prometheus),比如说其中的 5-6 个 指标被放入元组中,并作为 arg 传递给函数 在所述函数中解包似乎导致某些新变量实际上是“元组”类型,而不是我期望的 Prometheus 度量对象

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

我是否正确使用/解包元组? 元组使用中是否存在明确影响这一点的限制? 是否有更好的方法来管理这种情况?我选择了一个元组,因为我喜欢不变性,以及将变量显式分配给特定度量对象的能力。但如果有更好的方法,我完全愿意接受。

已经尝试过:

确认 var 的数量与元组中的指标数量相匹配

以下是元组中的检测和放置:

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个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 认为我正在尝试在其他地方解包(我不希望有元组!)

【问题讨论】:

您能告诉我们您是如何尝试使用其中一个元组的以及您收到的错误消息吗? 如果没有CounterGauge,我们将无法复制此内容,因此请提供minimal reproducible example。 感谢@wjandrea 的关注!在用设定的痕迹深入挖掘后,我能够弄清楚。有 2 个错误: - 'tuple' 对象没有属性 'labels' 【参考方案1】:

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

只有在我同时实例化字典或元组的同时进行检测(我没有),这才有意义。

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

【讨论】:

以上是关于解压更长元组的最佳实践 (Python 3.6)的主要内容,如果未能解决你的问题,请参考以下文章

Python:扁平化包含来自函数的另一个元组的元组的最简单方法

Python第二天-元组的基本使用方法

python列表和元组的方法和属性

使用 for 循环比较来自两个列表/元组的元素(在递归中)

Python基础入门—元组tuple

测试变量是列表还是元组