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

时间:2018-07-24 15:09:17

标签: python string-formatting python-3.6 f-string

我正在使用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'

但是,如果我尝试使用format来做到这一点:

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: "'|'"

我如何使用format来做到这一点?

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

2 个答案:

答案 0 :(得分:4)

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))

调用lambda,该values与传递的class TransactionManager { CentralEntities _ctx; Hashtable _repositories; public TransactionManager(CentralEntities ctx) { _ctx = ctx; } public RepositoryTest<T> CreateRepository<T>() where T : class { if (_repositories == null) _repositories = new Hashtable(); var type = typeof(T).Name; if (!_repositories.Contains(type)) { var repositoryType = typeof(RepositoryTest<>); var repositoryInstance = Activator.CreateInstance(repositoryType.MakeGenericType(typeof(T)), _ctx); _repositories.Add(type,repositoryInstance); } return (RepositoryTest<T>)_repositories[type]; } public int Save() { return _ctx.Save(); } } 一起执行格式化。我能想到的是最接近没有f弦的f弦。

答案 1 :(得分:1)

这是不可能的,因为第二个字符串{...}中仍然有a,并且您不想使用eval(...)

将代码放入format(...)吗?

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