使用 Python3.x 中的格式在一个字符串中打印列表、字符串和字典

Printing list, strings and dict within one string using format in Python3.x

我希望将查询数据库所需的字符串格式化如下:

SELECT "field1", "field2" FROM "measurement" where "status"=0 AND "node"='name1' LIMIT 10

以下内容来自字典:

字典如下:

conf = {
  'fields': ['field1', 'field2'],
  'measurement': 'measurement',
  'limit': 10,
  'tags': {'node': 'name1'}
}

我能够将字符串的一部分格式化为字符串(没有 tags),如下所示:

    QUERY = 'SELECT "{}" FROM {} WHERE "status"=0 LIMIT {}'.format(
             '","'.join(conf['fields'],
             conf['measurement'],
             conf['limit'])

这为我提供了:

SELECT "field1", "field2" FROM measurement WHERE "status"=0 LIMIT 10

问题

tags 中的键值对在许多情况下是 动态的 即没有以前已知的 key(在本例中 node)

对于字符串:

QUERY = 'SELECT {} FROM {} WHERE "status"=0 AND "{}"=\'{}\' LIMIT {}

我希望动态填充字符串格式 AND "{}"=\'{}\' (事先不知道 tags

中的键值对

如何实现?

我不确定是否:

QUERY = 'SELECT "{}" FROM {} WHERE "status"=0 AND "{}"=\'{}\' LIMIT {}'.format(
                '","'.join(conf['fields']),
                conf['measurement'],
                **conf['tags'],
                conf['limit']
            )

工作,因为它抛出以下 SyntaxError:

SyntaxError: positional argument follows keyword argument unpacking

我事先使用字典 conf['tags'] 创建了格式化字符串,以便更容易应用于 QUERY

conf = {
  'fields': ['field1', 'field2'],
  'measurement': 'measurement',
  'limit': 10,
  'tags': {'node': 'name1'}
}

#Create the string using dictionary
dict_str = ''.join('"{}"=\'{}\''.format(key,value) for key, value in conf['tags'].items())

#Create the final format string
QUERY = 'SELECT "{}" FROM "{}" WHERE "status"=0 AND {} LIMIT {}'.format(
                '","'.join(conf['fields']),
                conf['measurement'],
                dict_str,
                conf['limit']
            )
print(QUERY)

输出将是

SELECT "field1","field2" FROM "measurement" WHERE "status"=0 AND "node"='name1' LIMIT 10

如果您使用的是 python 3.6 及更高版本,则可以使用 here (python docs) 指定的 f-strings 进行字符串格式化的新方法。我不确定我是否理解您的要求,但我认为您的意思是这样的:

key = list(conf['tags'].keys())[0]

QUERY = f"""SELECT {conf['fields'][0]}, {conf['fields'][1]} FROM "{conf['measurement']}" WHERE "status"=0 AND "{key}"='{conf['tags'][key]}' LIMIT {conf['limit']}"""

结果是这个字符串:

SELECT "field1", "field2" FROM "measurement" WHERE "status"=0 AND "node"='name1' LIMIT 10