Python中str.format()中的变量/任意数量的* args或** kwargs

时间:2015-03-15 21:52:34

标签: python python-3.x string-formatting args kwargs

我正在创建一个套接字客户端,需要定义一个向服务器发送以下类型消息的函数:sometext,[name_1],[name_2],...,[name_n]。实际上这个消息更复杂,但为了一个例子我简化了它。

其中:

  • ... - 表示name_2与姓氏之间的其余名称(以逗号分隔)
  • 每次都可以有任意数量的名字

我知道有*args**kwargs,但在这种情况下如何正确使用str.format()?我需要这样的东西:

def send_names(*args):
    print('sometext,{*args},'.format(*args)) # as an example we just print

我知道这段代码不起作用,因为{*args}在这里是非法的。 当我事先知道*args的数量时,代码会起作用,就像在这里:

def send_names(*args):
    print('sometext,{0},{1},{2}'.format(*args)) # as an example we just print

我错过了什么?

3 个答案:

答案 0 :(得分:3)

您不能使用*args**kwargs申请可变数量的广告位,不能。你必须根据长度自己创建插槽:

','.join(['{}'] * len(args)).format(*args)

然后,您可以根据需要将结果插入到另一个模板中。上述内容适用于通常由格式化插槽接受的任何类型的参数。

演示:

>>> args = ('foo', 'bar')
>>> ','.join(['{}'] * len(args)).format(*args)
'foo,bar'
>>> args = ('foo', 'bar', 'baz')
>>> ','.join(['{}'] * len(args)).format(*args)
'foo,bar,baz'
>>> args = (1, 2, 3)
>>> ','.join(['{}'] * len(args)).format(*args)
'1,2,3'

答案 1 :(得分:3)

您可以加入*args来完成您想要的工作:

def send_names(*args):
    print('sometext, {0}'.format(', '.join(args)))

send_names('message1', 'message2', 'message3')

结果:

sometext, message1, message2, message3

答案 2 :(得分:1)

我认为您应该根据需要避免使用.format', '.join args。您没有提到为什么需要.format问题中的字符串的任何具体原因。就像@Selcuk

的解决方案一样