我担心这是一个基本的Python问题,但我找不到合适的答案。 我想在占位符前面添加一个填充空间。
这是我的例子:
user = 'Jhon'
'Hi {u}!'.format(u=user if user else '')
# result
'Hi Jhon!'
现在一切正常,直到我的user
var为空或假,在这种情况下,这是上面的结果
'Hi !'
# ^ notice the empty space
相反,我想要'Hi!'
作为结果。
现在我尝试使用format()
填充选项,例如{:>1}
但是ofc无效,因为它会添加足够的填充以达到字符长度1。
我最终做了这样的事情:
'Hi{u:>{p}}!'.format(u=user if user else '', p=1+len(user))
以上工作正常,但我认为这有点像hackish,我现在想,如果有一种内置的方法可以做到这一点,我就错过了。
谢谢!
答案 0 :(得分:1)
以下是我在评论中发布的解决方案:
'Hi{u}!'.format(u=' ' + user if user else '')
您在问题中发布的解决方案不太有效,但可以通过将填充长度计算更改为
来解决p=bool(user) + len(user)
bool
函数确定它的参数是True-ish还是False-ish,并分别返回True
或False
。但True
和False
可用于算术运算,它们分别计算为1和0。
以下是一些演示各种解决方案的代码,包括一对使用文字字符串插值(即f-strings)的函数,这些函数在Python 3.6 +中可用。
for user in ('John', ''):
print('user is {!r}'.format(user))
# Gruber
print('Hi{u:>{p}}!'.format(u=user if user else '', p=1+len(user)))
# Gruber, fixed
print('Hi{u:>{p}}!'.format(u=user if user else '', p=bool(user) + len(user)))
# Ryan
print('Hi {u}!'.format(u=user) if user else 'Hi!')
# PM 2Ring
print('Hi{u}!'.format(u=' ' + user if user else ''))
print('Hi{p}{u}!'.format(u=user, p=' ' if user else ''))
# Python 3.6
print(f'Hi{user and " " or ""}{user}!')
print(f'Hi{" " if user else ""}{user}!')
# Old `%-style` interpolation
print('Hi%s%s!' % (user and " " or "", user))
print()
<强>输出强>
user is 'John'
Hi John!
Hi John!
Hi John!
Hi John!
Hi John!
Hi John!
Hi John!
Hi John!
user is ''
Hi !
Hi!
Hi!
Hi!
Hi!
Hi!
Hi!
Hi!
有关f字符串的信息,请参阅官方Python文档中的Formatted string literals。另请参阅PEP 498 -- Literal String Interpolation和PEP 536 -- Final Grammar for Literal String Interpolation。