2017-03-12 57 views
1

恐怕这是一个基本的Python问题,但我找不到正确的答案。 我想在占位符前添加一个填充空间。用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)) 

上述工作正常,但我认为这有点不好,我想现在如果有一种内在的方式做到这一点,我错过了。

谢谢!

+3

避免这个问题:''Hi {u}!'。format(u = user)if user else'Hi!'' - 易读且灵活。 – Ryan

+1

'Hi {u}!'。格式(u =''+ user if user else'')? –

+0

你们两个都是对的,@Ryan的建议看起来很快,很清楚,但不幸的是,在我的情况下,我无法使用它(示例字符串是一个缩减和简化的案例,以显示我的问题)。 – Gruber

回答

1

这是我张贴在评论的解决方案:

'Hi{u}!'.format(u=' ' + user if user else '') 

您的问题发布的解决方案并没有完全的工作,但它可以通过改变你的填充长度计算被固定到

p=bool(user) + len(user) 

bool函数确定它的参数是True-ish还是False-ish,并分别返回TrueFalse。但是TrueFalse可以分别用于计算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-字符串的信息,请参阅Formatted string literals在官方Python文档。另请参阅PEP 498 -- Literal String InterpolationPEP 536 -- Final Grammar for Literal String Interpolation

+0

感谢您提供非常详细的解释,以及漂亮的'f-string'不知道!对于任何有兴趣的人来看[this](https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-pep498)和[this](https://cito.github.io/blog/f-strings /) – Gruber

+1

@Gruber f-strings很棒。我通常不会在我的答案中使用它们,因为不是每个人都安装了3.6(我去年五月安装了alpha版本)。但我想我应该添加一些链接到我的答案。 –