【问题标题】:String Interpolation in PythonPython中的字符串插值
【发布时间】:2011-11-15 13:15:50
【问题描述】:

我正在尝试正确插入此字符串:

/test/test?Monetization%20Source=%d&Channel%20Id=%d' % (mid, cid)

我希望 %20 按原样呈现,而 %d 用作变量 mid 和 cid 的占位符。我该怎么做?

【问题讨论】:

    标签: python string python-2.7 string-interpolation


    【解决方案1】:

    我认为这是一个常量字符串文字?如果是这样,这很容易 - 只需将您想要保留的百分号加倍即可。

    '/test/test?Monetization%%20Source=%d&Channel%%20Id=%d' % (mid, cid)
    

    【讨论】:

    • 这是问题的正确答案,但不是问题的正确解决方案。
    • @Karl,除非您可以指出导致此失败的案例,否则它的“正确性”不亚于任何其他答案。我不反对可能有更好的方法,而且我已经 +1 了。
    • 解决方案的正确性也关乎可维护性、清晰性和表现力。
    【解决方案2】:

    从 Python 2.6 开始,您可以使用 Format Specification Mini-Language,它比旧的(但仍受支持)% 运算符更强大。

    >>> mid=4
    >>> cid=6
    >>> "/test/test?Monetization%20Source={0:d}&Channel%20Id={1:d}".format(mid, cid) 
    '/test/test?Monetization%20Source=4&Channel%20Id=6'
    

    忽略整数的 :d 默认为 str()

    从 Python 2.7 和 3.2 开始,可以省略参数索引:

    >>> "...ce={:d}&Channel%20Id={:d}"...
    

    但是看手册,format() 方法和内置函数非常灵活和有用。

    【讨论】:

    • 希望字符串中没有任何{,否则我会看到另一个问题...
    【解决方案3】:

    一般来说,你想要urllib.urlencode:

    import urllib
    url = '/test/test?' + urllib.urlencode({
      'Monetization Source': mid,
      'Channel Id': cid,
    })
    

    【讨论】:

      【解决方案4】:

      使用'f-string'(Python 3.6 引入),更容易实现插值。

      f-string 或 formatted-string 提供了一种使用最小语法格式化字符串的方法。“f”或“F”用作前缀,大括号 {} 用作占位符。

      mid=1.1
      cid=1.2
      
      print(f"Default:\n /test/test?Monetization%20Source={mid}&Channel%20Id={cid}")
      

      你的输出将是,

      Default:
       /test/test?Monetization%20Source=1.1&Channel%20Id=1.2
      

      如果字符串文字有大括号 { } 作为字符串本身的一部分,那么您必须将大括号加倍以让解释器知道大括号是字符串文字的一部分而不是占位符。

      print(f"With curly braces:\n /test/test?{{Monetization}}%20Source={mid}&Channel%20Id={cid}")
      

      这里,{Monetization} 是字符串文字本身的一部分,因此额外的花括号用作 {{Monetization}}

      输出是,

      With curly braces:
       /test/test?{Monetization}%20Source=1.1&Channel%20Id=1.2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 2018-07-20
        相关资源
        最近更新 更多