【问题标题】:python string replacement with % character/**kwargs weirdness用 % character/**kwargs 怪异替换 python 字符串
【发布时间】:2009-10-28 22:19:15
【问题描述】:

以下代码:

def __init__(self, url, **kwargs):
    for key in kwargs.keys():
        url = url.replace('%%s%' % key, str(kwargs[key]))

抛出以下异常:

File "/home/wells/py-mlb/lib/fetcher.py", line 25, in __init__
url = url.replace('%%s%' % key, str(kwargs[key]))
ValueError: incomplete format

字符串的格式如下:

http://www.blah.com?id=%PLAYER_ID%

我做错了什么?

【问题讨论】:

    标签: python string-formatting


    【解决方案1】:

    您可能需要格式字符串 %%%s%% 而不是 %%s%

    两个连续的% 符号被解释为文字%,因此在您的版本中,您有一个文字%、一个文字s,然后是一个单独的%,它需要一种格式后面的说明符。您需要将每个文字 % 加倍以不被解释为格式字符串,因此您需要 %%%s%%:文字 %%s 用于字符串,文字 %

    【讨论】:

    • 啊,是的!关闭,但 %%%s%% 是我想要的:所以它是一个百分比,然后是 kwargs 中的实际键,然后是一个百分比。但是现在我在我的代码中查看 %%%s%% ,它看起来真的很烦人,我想知道是否有一种很好的方法来做我想做的事情。
    • 更好的办法是:url.replace('%'+key+'%', str(kwargs[key]))
    【解决方案2】:

    您需要将百分号翻倍才能转义:

    >>> '%%%s%%' % 'PLAYER_ID'
    '%PLAYER_ID%'
    

    在遍历字典时,您可以像这样在 for 语句中解压值:

    def __init__(self, url, **kwargs):
        for key, value in kwargs.items():
            url = url.replace('%%%s%%' % key, str(value))
    

    【讨论】:

    • 一般来说,Python 2.x 代码应该默认使用iteritems 而不是items;后者在内存中生成一个列表,而前者返回一个迭代地图的生成器。在这里真的不会有什么不同,但是有正确的习惯是件好事。除此之外,看起来不错。
    • 嗯?你在哪里看到 py2k 代码的迹象?它是 py3k,不存在 iteritems
    【解决方案3】:

    亚当几乎说对了。将您的代码更改为:

    def __init__(self, url, **kwargs):
        for key in kwargs.keys():
            url = url.replace('%%%s%%' % key, str(kwargs[key]))
    

    当 key 是 FOO 时,'%%%s%%' % key 结果为 '%FOO%',你的 url.replace 会做你想做的事。在格式字符串中,两个百分比会在输出中产生一个百分比。

    【讨论】:

      猜你喜欢
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 2018-04-19
      相关资源
      最近更新 更多