如何将 .format(**dict) 与循环更新的字典一起使用?

How to use .format(**dict) with a dictionary that gets updated in a loop?

我正在尝试进行一些地图抓取,我用参数字典 'on the fly' 填充 URL 字符串,如下所示:

par = {'zoom': 13, 'latmin': 2835, 'latmax': 2844, 'lonmin': 4464, 'lonmax': 4475, 'ext': 'png'}
url = 'https://some.url.com/{zoom}/{lat}/{lon}.{ext}'

for lat in range(par['latmin'], par['latmax']):
    par['lat'] = lat
    for lon in range(par['lonmin'], par['lonmax']):
        par['lon'] = lon
        url = url.format(**par)

字典已更新,但由于某种原因,URL 字符串在第一次迭代时卡住了。为什么?

您用 格式化 字符串(其中占位符已替换为它们保留位置的数据)覆盖了格式字符串(其中包含新值的占位符)。从第二次迭代开始,字符串中没有 {lat}{lon} 占位符。如果您在第一个内循环 运行 之后立即打印 url,您会看到现在的内容是:

url = 'https://some.url.com/{zoom}/2835/4464.{ext}'

仍然有 {zoom}{ext} 的占位符,但其他占位符的值是固定的,所以在未来的循环中没有什么要更新的。

如果您不希望发生这种情况,请不要在 format 之后分配回 url,为部分格式化的字符串使用不同的名称(或使用 list 这种部分格式化的字符串,如果你想要 latlon) 的每个组合。