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

variadic / arbitrary number of *args or ** kwargs in str.format() in Python

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

其中:

我知道有 *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

我错过了什么?

您不能使用 *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'

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

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

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

结果:

sometext, message1, message2, message3

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

的解决方案一样