Python:字符串格式中缺少参数(lazy eval)

san*_*lto 3 python string formatting

我正在尝试对我的字符串上的参数进行一些"post"/"lazy"评估.假设我是这样的:

s = "SELECT * FROM {table_name} WHERE {condition}" 
Run Code Online (Sandbox Code Playgroud)

我想用{table_name}替换后的字符串返回字符串,但不是{condition},所以,这样的东西:

s1 = s.format(table_name = "users")
Run Code Online (Sandbox Code Playgroud)

所以,我可以在以后构建孔字符串,如:

final = s1.format(condition= "user.id = {id}".format(id=2))
Run Code Online (Sandbox Code Playgroud)

结果当然应该是:

"SELECT * FROM users WHERE user.id = 2" 
Run Code Online (Sandbox Code Playgroud)

我已经找到了之前的答案,这正是我需要的,但我想使用format字符串函数.

python,格式字符串 谢谢你的帮助!

Sim*_*ser 7

您可以用自己替换条件:

s.format(table_name='users', condition='{condition}')
Run Code Online (Sandbox Code Playgroud)

这给了我们:

SELECT * FROM users WHERE {condition}
Run Code Online (Sandbox Code Playgroud)

您可以稍后使用此字符串填写条件.


Kar*_*ath 6

您不能使用format函数,因为它会引发KeyError.

string.Template 支持安全替代:

from string import Template
s = Template('SELECT * FROM $table_name WHERE $condition')
s.safe_substitute(table_name='users')

'SELECT * FROM users WHERE $condition'
Run Code Online (Sandbox Code Playgroud)

如果您使用普通变量名称(没有格式说明符,没有索引等等),这也将起作用(感谢@Simeon Visser的想法):

def myformat(s, *args, **kwargs):
  while True:
    try:
      return s.format(*args, **kwargs)
    except KeyError as e:
      e=e.args[0]
      kwargs[e] = "{%s}" % e

s = "SELECT * FROM {table_name} WHERE {condition}" 
myformat(s, table_name="users")

'SELECT * FROM users WHERE {condition}'
Run Code Online (Sandbox Code Playgroud)