【问题标题】:Python string interpolation using dictionary and strings使用字典和字符串的 Python 字符串插值
【发布时间】:2009-08-20 04:54:16
【问题描述】:

给定:

dict = {"path": "/var/blah"}
curr = "1.1"
prev = "1.0"

插入字符串以生成以下内容的最佳/最短方法是什么:

路径:/var/blah 当前:1.1 上一页:1.0

我知道这行得通:

str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % {"path": dict["path"],"curr": curr, "prev": prev}

但我希望有更短的方法,例如:

str = "path: %(path)s curr: %s prev: %s" % (dict, curr, prev)

如果这似乎是一个过于迂腐的问题,我深表歉意。

【问题讨论】:

    标签: python string string-interpolation


    【解决方案1】:

    你可以试试这个:

    data = {"path": "/var/blah",
            "curr": "1.1",
            "prev": "1.0"}
    
    s = "path: %(path)s curr: %(curr)s prev: %(prev)s" % data
    

    【讨论】:

      【解决方案2】:

      当然你可以使用更新的(从 2.6 开始).format 字符串方法:

      >>> mydict = {"path": "/var/blah"}
      >>> curr = "1.1"
      >>> prev = "1.0"
      >>>
      >>> s = "path: {0} curr: {1} prev: {2}".format(mydict['path'], curr, prev)
      >>> s
      'path: /var/blah curr: 1.1 prev: 1.0'   
      

      或者,如果所有元素都在字典中,您可以这样做:

      >>> mydict = {"path": "/var/blah", "curr": 1.1, "prev": 1.0}
      >>> "path: {path} curr: {curr} prev: {prev}".format(**mydict)
      'path: /var/blah curr: 1.1 prev: 1.0'
      >>>
      

      来自str.format() 文档:

      这种字符串格式化方法是 Python 3.0 中的新标准,以及 应该优先于 % 新代码中String Formatting Operations 中描述的格式。

      【讨论】:

      • 使用 str.format 他可以写"path: {mydict[path]} curr: {curr} prev: {prev}".format(mydict=mydict, curr=curr, prev=prev) 甚至locals() 作为格式参数,"path: {mydict[path]} curr: {curr} prev: {prev}".format(**locals())
      【解决方案3】:

      为什么不:

      mystr = "path: %s curr: %s prev: %s" % (mydict[path], curr, prev)
      

      顺便说一句,我已经更改了您使用的几个名称,这些名称是对内置名称的践踏 - 不要那样做,它从来不需要,并且偶尔会浪费您大量时间来追踪它导致的不当行为(假设它意味着内置的东西正在使用内置名称,但你已经用我们自己的变量的名称隐藏了它)。

      【讨论】:

        【解决方案4】:

        也许:

        path = dict['path']
        str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % locals()
        

        我的意思是它有效:

        >>> dict = {"path": "/var/blah"}
        >>> curr = "1.1"
        >>> prev = "1.0"
        >>> path = dict['path']
        >>> str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % locals()
        >>> str
        'path: /var/blah curr: 1.1 prev: 1.0'
        

        我只是不知道你是否认为它更短。

        【讨论】:

        • 避免使用 locals() & globals() :(
        • @dzen 为什么要避免 locals()?我已经尝试在其他地方搜索此建议,但找不到太多。
        • 使用locals() 表示不清楚你实际上是哪些变量。如果您想对代码进行 pylint,pylint 可能会报告某些变量未使用,即使您使用 locals() 隐式引用它们也是如此。 Pylint 必须检查所有字符串格式语句以进行此类隐式使用。所以这是一个捷径,你应该在使用之前了解它的含义。
        • 万一模板字符串是用户输入的,你不希望他们能够看到局部变量,万一有密码什么的。根据 pep20 的说法,“显式优于隐式”(不要盲目跟随 pep,但在这种情况下它可能有效)。
        【解决方案5】:

        您也可以(很快)在 Python 3.6 中使用 f-strings,这可能是格式化字符串的最短方式:

        print(f'path: {path} curr: {curr} prev: {prev}')
        

        甚至把你所有的数据都放在一个字典里:

        d = {"path": path, "curr": curr, "prev": prev}
        print(f'path: {d["path"]} curr: {d["curr"]} prev: {d["prev"]}')
        

        【讨论】:

        • 在python3中print是一个函数,需要括号。
        【解决方案6】:

        如果您将数据放在字典中,您可以执行以下操作:

        data = {"path": "/var/blah","curr": "1.1","prev": "1.0"}
        
        "{0}: {path}, {1}: {curr}, {2}: {prev}".format(*data, **data)
        

        【讨论】:

        • 这是最好的。
        【解决方案7】:

        2016 年更新:从 Python 3.6 开始,您可以按名称将变量替换为字符串:

        >>> origin = "London"
        >>> destination = "Paris"
        >>> f"from {origin} to {destination}"
        'from London to Paris'
        

        注意f" 前缀。如果您在 Python 3.5 或更早版本中尝试此操作,您将收到 SyntaxError

        https://docs.python.org/3.6/reference/lexical_analysis.html#f-strings

        【讨论】:

          【解决方案8】:

          如果您不想每次都将不变的变量添加到字典中,则可以使用格式引用变量和字典键:

          str = "path {path} curr: {curr} prev: {prev}".format(curr=curr, prev=prev, **dict)

          这在逻辑上可能是错误的形式,但它使事情更加模块化,期望 curr 和 prev 大部分是静态的并且字典要更新。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多