代码之家  ›  专栏  ›  技术社区  ›  moshevi

F字符串的行为与嵌套格式的格式方法不同

  •  3
  • moshevi  · 技术社区  · 8 年前

    我正在使用 format 而且它不能像预期的那样工作。 但是,如果我尝试用F弦来做,它会很好地工作。

    例子:

    这样做:

    values = 'first', 'second', 'third'
    a = f"""cardinality and values: {'|'.join(f'val:{val}, card:{i}'for i, val in enumerate(values))} """
    

    给我这个(需要的结果):

    'cardinality and values: val:first, card:0|val:scond, card:1|val:third, card:2'
    

    但是如果我尝试用 格式 :

    a = """cardinality  and values: {'|'.join('val:{val}, card:{i}'.format(val=val, i=i) for i, val in enumerate(values))} """.format(values=values)
    

    我得到以下例外:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: "'|'"
    

    我该怎么做呢 格式 ?

    我需要使用 格式 而不是F字符串,因为另一个文件导入该字符串,然后对其进行格式化。

    2 回复  |  直到 8 年前
        1
  •  4
  •   Jean-François Fabre    8 年前

    format 只是不如F字符串强大,所以您必须简化格式字符串。

    只需从格式字符串外部获得理解:

    a = "cardinality  and values: {} ".format('|'.join('val:{val}, card:{i}'.format(val=val, i=i) for i, val in enumerate(values)))
    

    结果:

    cardinality  and values: val:first, card:0|val:second, card:1|val:third, card:2 
    

    如果您想制作一行“模板”,可以使用 lambda :

    a = lambda v : "cardinality  and values: {} ".format('|'.join('val:{val}, card:{i}'.format(val=val, i=i) for i, val in enumerate(v)))
    

    现在打电话

    print(a(values))
    

    调用 兰姆达 它用传递的 values 。这是最接近的F弦,没有我能想到的F弦。

        2
  •  1
  •   qräbnö    8 年前

    这是不可能的,因为你还有 {...} 在第二个字符串中 a 你不想用 eval(...) .

    把代码输入 format(...) ?

    a = """cardinality  and values: {}""".format('|'.join('val:{val}, card:{i}'.format(val=val, i=i) for i, val in enumerate(values)))