在 python 中转义单个 '{'

Escape single '{' in python

我正在使用 python 生成 C 代码,我想要一个打印以下内容的函数:

{
.data1="egg",
.data2="dog",
},

我试过这个功能:

def funky(data1,data2):
    return """\
    {
    .data1="egg",
    .data2="dog",
    },""".format(data1,data2)

调用“funky("egg","dog")”导致 KeyError。关于不成对的大括号。

如何打印这些大括号?

您需要:

  1. 使用两个 { 和两个 }
  2. 转义字符串中的双引号。
  3. 使用 {0}{1} 代替 {egg}{dog}

def funky(data1,data2):
    return """\
    {{
    .data1=\"{0}\",
    .data2=\"{1}\",
    }},""".format(data1,data2)

您的字符串文字中没有变量,您没有转义 {},并且您破坏了缩进。试试这个:

def stripMargin(txt):
  return '\n'.join([r.split('|', 1)[1] for r in txt.split('\n')])

def funky(data1,data2):
  return stripMargin("""|{{
  |.data1="{0}",
  |.data2="{1}",
  |}},""".format(data1,data2))

print(funky("egg", "dog"))

| 部分与 stripMargin 相结合确保生成代码(目标语言)的缩进不会干扰 python(元语言)的缩进。

我实际上会以不同方式缩进生成的代码:

def funky(data1,data2):
  return stripMargin("""|{{
  |  .data1="{0}",
  |  .data2="{1}",
  |}},""".format(data1,data2))

由于您不需要在最终输出中使用任何常见的缩进,您还可以使用 dedent:

from textwrap import dedent

def funky2(data1,data2):
    return dedent("""\
    {{
    .data1="{0}",
    .data2="{1}",
    }},""").format(data1,data2)

(感谢@user2357112 指出)