7
"{}, {}, {}".format(*(1,2,3,4,5))

版画:

'1, 2, 3'

{}inの数がformatタプルの長さを超えない限り、これは機能します。-任意の長さのタプルに対して機能させ、長さが不十分な場合は sでパディングしたいと考えています。また、 の数について推測することを避けるために{}、ジェネレーターを使用したいと考えました。これが私が念頭に置いていたことです:

def tup(*args):
    for s in itertools.chain(args, itertools.repeat('-')):
        yield s

print "{}, {}, {}".format(*tup(1,2))

期待される:

'1, 2, -'

しかし、それは決して戻りません。ジェネレーターで動作させることはできますか?より良いアプローチはありますか?

4

4 に答える 4

4

無限のジェネレーターを使用して、任意の *args引数呼び出しを埋めることはできません。

Python はジェネレーターを反復処理してすべての引数をロードし、callable に渡します。ジェネレーターが無限の場合、それは決して完了しません。

無限でないジェネレーターを問題なく使用できます。itertools.islice()ジェネレーターをキャップするために使用できます。

from itertools import islice

print "{}, {}, {}".format(*islice(tup(1,2), 3))

結局のところ、テンプレートのスロット数はすでにわかっています。

于 2013-08-27T17:58:47.530 に答える
1

単純なアプローチは、フォーマット関数に L/2 引数を提供することです。ここで、L はフォーマット文字列の長さです。置換トークンの長さは少なくとも 2 文字であるため、アンパックするのに十分な値が常にあることは確実です。

def tup(l, *args):
    for s in args + (('-',) * l):
        yield s   
s = "{}, {}, {}"
print s.format(*list(tup(len(s)//2, 1, 2)))

Silas Ray が示唆するように、 string.Formatter.parseを使用して、より洗練された上限を見つけることができます。

import string
def tup(l, *args):
    for s in args + (('-',) * l):
        yield s   
s = "{}, {}, {}"
l = len(list(string.Formatter().parse(s)))
print s.format(*list(tup(l, 1, 2)))
于 2013-08-27T18:28:29.057 に答える