解压较长元组的最佳实践 (Python 3.6)
Best Practice to Unpack Longer Tuples (Python 3.6)
将更长的元组传递给函数,并希望解包到特定变量中。
高级:
- 我检测了一些指标 (Prometheus),比方说其中的 5-6 个
- 指标被放入元组中,并作为参数传递到函数中
- 在上述函数中解包似乎导致一些新变量实际上是 'tuple' 类型,而不是我期望的 Prometheus 度量对象
鉴于我正在尝试做的事情,我的问题是:
- 我是否正确使用/解包元组?
- 元组的使用是否可能存在明确影响这一点的限制?
- 是否有更好的方法来管理这种情况?我选择元组是因为我喜欢不变性,以及将变量显式分配给特定度量对象的能力。但如果有更好的方法,我完全愿意接受。
已经尝试过:
- 确认变量的数量与元组中的指标数量匹配
这是元组中的检测和位置:
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 输出救了我。向我展示了只有 一些 指标是元组,而不是全部。寻找它们之间的区别使我找到了答案。
将更长的元组传递给函数,并希望解包到特定变量中。
高级:
- 我检测了一些指标 (Prometheus),比方说其中的 5-6 个
- 指标被放入元组中,并作为参数传递到函数中
- 在上述函数中解包似乎导致一些新变量实际上是 'tuple' 类型,而不是我期望的 Prometheus 度量对象
鉴于我正在尝试做的事情,我的问题是:
- 我是否正确使用/解包元组?
- 元组的使用是否可能存在明确影响这一点的限制?
- 是否有更好的方法来管理这种情况?我选择元组是因为我喜欢不变性,以及将变量显式分配给特定度量对象的能力。但如果有更好的方法,我完全愿意接受。
已经尝试过:
- 确认变量的数量与元组中的指标数量匹配
这是元组中的检测和位置:
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 输出救了我。向我展示了只有 一些 指标是元组,而不是全部。寻找它们之间的区别使我找到了答案。