在听到回复后(谢谢大家!)我现在确信如果不定义新函数(或 lambda 函数)就无法在 Python 中实现我想要的,因为这是引入新范围的唯一方法。
为了清楚起见,我决定需要将其实现为可重用函数(而不是 lambda),因此为了他人的利益,我想我会分享我最终想出的函数——它足够灵活,可以处理多个额外的格式字符串参数(除了用于决定是否进行格式化的主要参数);它还附带 pythondoc 以显示正确性并说明用法(如果您不确定 **kwargs 的工作原理,请忽略它,它只是一个实现细节,并且是我可以看到实现可选 defaultValue= kwarg 以下的唯一方法格式字符串参数的变量列表)。
def condFormat(formatIfTrue, expr, *otherFormatArgs, **kwargs):
""" Helper for creating returning the result of string.format() on a
specified expression if the expressions's bool(expr) is True
(i.e. it's not None, an empty list or an empty string or the number zero),
or return a default string (typically '') if not.
For more complicated cases where the operation on expr is more complicated
than a format string, or where a different condition is required, use:
(lambda e=myexpr: '' if not e else '%s ' % e)
formatIfTrue -- a format string suitable for use with string.format(), e.g.
"{}, {}" or "{1}, {0:d}".
expr -- the expression to evaluate. May be of any type.
defaultValue -- set this keyword arg to override
>>> 'x' + condFormat(', {}.', 'foobar')
'x, foobar.'
>>> 'x' + condFormat(', {}.', [])
'x'
>>> condFormat('{}; {}', 123, 456, defaultValue=None)
'123; 456'
>>> condFormat('{0:,d}; {2:d}; {1:d}', 12345, 678, 9, defaultValue=None)
'12,345; 9; 678'
>>> condFormat('{}; {}; {}', 0, 678, 9, defaultValue=None) == None
True
"""
defaultValue = kwargs.pop('defaultValue','')
assert not kwargs, 'unexpected kwargs: %s'%kwargs
if not bool(expr): return defaultValue
if otherFormatArgs:
return formatIfTrue.format( *((expr,)+otherFormatArgs) )
else:
return formatIfTrue.format(expr)