Python 字符串和字典在同一行的字符串插值

Python string interpolation for string and dictionary in the same line

我有一个字典和一个转换为字符串的日期时间对象。如何在同一行中打印日期时间字符串和字典中的多个项目?

例如:

dictionary = {"_source": {"host": "host", "type": "type"}}
datetime = '25-08-2017 10:26:11'

这是我要打印的内容:

print("%s %(host)s %(type)s" % (datetime,dictionary["_source"]))

日期时间字符串出错:

TypeError: format requires a mapping

谢谢!

你最好使用 format 方法:

>>> "{} {d[host]} {d[type]}".format(datetime, d=dictionary["_source"])
'25-08-2017 10:26:11 host type'

一种方法是为您的日期时间参数指定一个名称:

"{t} {host} {type}".format(t=datetime,**dictionary["_source"])

但实际上即使没有它也能正常工作

"{} {host} {type}".format(datetime,**dictionary["_source"])

尽管我认为在格式化字符串中使用命名值更好

你可以试试这个:

dictionary = {"_source": {"host": "host", "type": "type"}}
datetime = '25-08-2017 10:26:11'

print("host {} type {} datetime {}".format(dictionary["_source"]["host"], dictionary["_source"]["type"], datetime))

不能在单个格式字符串中混合使用普通格式说明符和映射格式说明符。您应该使用

"%s %s %s" % (param1, param2, param3)

"%(key1)s %(key2)s %(key3)s" % {"key1": val1, "key2": val2, "key3": val3}

在Python 3.6+你可以使用更方便和高效的f-strings插值,例如:

f'{val1} {val2} {val3}'

其中替换字段是 表达式 在 运行 时间求值。

就像其他人所说的那样,最好使用 str.format(). The closest option with method str.format() 你的问题是代码 Violet Red suggested in his :

"{} {host} {type}".format(datetime,**dictionary["_source"])

但如果您真的想要或需要使用旧的格式化方式(使用 %),那么您可以尝试以下一些选项:

  • 将字符串分成两个或多个字符串

    Eugene Yarmash explained in his 一样,您不能在同一个字符串中混合使用普通格式说明符和映射格式说明符,但您可以将它分成两个(或更多)字符串,如下所示:

    '%s' % datetime + ' %(type)s %(host)s' % dictionary["_source"]
    

    这会起作用,但是如果你想在中间打印 datetime(像这样 '%(type)s %s %(host)s'),或者如果你有更多的普通格式说明符和映射格式说明符交织在一起(像这样 '%s '%(type)s %s %(host)s' %s).您可以像这样将 '%(type)s %s %(host)s' 分成多个字符串:

    '%(type)s' % dictionary["_source"] + ' %s ' % datetime +  '%(host)s' % dictionary["_source"]
    

    但是首先字符串格式就没有意义了。

  • 比普通格式说明符更先应用映射

    此方法解决了我们使用交织在一起的普通格式说明符和映射格式说明符来格式化字符串的问题。我将在 OP 的示例中解释此方法。我们有要格式化的字符串 '%s %(type)s %(host)s'。就像我一开始说的,我们应用映射格式说明符:

    print('%s %(type)s %(host)s' % dictionary["_source"])
    

    如果我们这样做,它会打印出:

    '{'type': 'type', 'host': 'host'} type host'
    

    这行不通,但我们可以做的是在每个普通格式说明符中添加括号 () 并用 {'': '%s'}:

    更新我们的字典
    print('%()s %(type)s %(host)s' % {'type': 'type', 'host': 'host', '': '%s'})
    

    这将打印出:

    '%s type host'

    我们可以很容易地用% (datetime)格式化。

    问题是如何{'': '%s'}到你的字典。您有两个选择,使用函数或为字典对象定义 class。

    1.使用函数

    def ForFormat(x):
        d = x.copy()
        d.update({'': '%s'})
        return d
    

    然后你这样使用它:

    print('%()s %(type)s %(host)s' % ForFormat(dictionary["_source"]) % (datetime))
    

    结果正是我们想要的:

    '25-08-2017 10:26:11 type 45 host'
    

    2。创建 class

    class FormatDict(dict):
        def __missing__(self, key):
            return '%s'
    

    这里我们实际上并没有将{'': '%s'}添加到字典中,而是改变了它的方法__missing__(),当在字典中找不到键时调用它,它会重新运行'%s'对于不在字典中的每个映射格式说明符。它是这样使用的:

    print('%()s %(type)s %(host)s' % FormatDict(dictionary["_source"]) % (datetime))
    

    它也打印出想要的结果:

    '25-08-2017 10:26:11 type 45 host'