我正在使用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字符串,因为另一个文件会导入该字符串,然后对其进行格式化。
答案 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)))