如何在括号中逐字使用变量

How to use variable in parenthesis verbatim

我有一个奇怪的问题,希望能在这里找到解决办法。我正在使用 push_to_gateway 模块来让 Prometheus 转义一些数据。该过程有 2 个步骤:

1) 像这样声明一个变量:

g = Gauge(ctr, '', ['host', 'ip'], registry=registry)

host 和 ip 是 Prometheus DB 中使用的标签。注册表与我的问题无关。

2) 填充数据:

g.labels(hostname, ipaddr).set(val)

hostname 和 ipaddr 是包含值的变量

当您在 Prometheus 中查看数据时,您会看到如下内容:

ctr{hostname="node1",ip="1.1.1.1"} -1 

由于我有数千个计数器要导入 Prometheus,并且它们都有不同的标签集,所以我想创建一个包含标签及其值的 ordereddict,同时解析数据并使用它来生成 1) 和2).填充第 1) 部分很容易。我只是输入:

g = Gauge(ctr, '', list(labels.keys()), registry=registry)

该行需要一个列表,它得到了一个列表。

但是我如何填写第 2 部分),因为 g.labels 期望主机名和 ipaddr 由“,”分隔(即不是列表)。如果我执行 list(labels.values()),那么它会在括号内显示为一个列表,但这是行不通的。我需要 list(labels.values()) 扩展到括号​​内的 'node1','1.1.1.1' 才能正常工作,但我不知道该怎么做(如果可能的话) ) 这样 2) 看起来像:

g.labels('node1', '1.1.1.1').set(val)

感谢

这正是 * 派上用场的地方。它解压缩列表的值。

尝试:

list_of_labels = list(labels.values())
g.labels(*list_of_labels).set(val)

这是 * 在 python

中如何工作的示例
def f(a, b):
    print a, b

tup = ("Hello", "there")

f(*tup)
# prints "Hello there"

另一个解决方案是即时解压:

hostname, ipaddr = labels.values()
g.labels(hostname, ipaddr).set(val)