2017-03-12 91 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版本)。但我想我應該添加一些鏈接到我的答案。 –