Python 中 str.format() 中的可变参数/任意数量的 *args 或 ** kwargs
variadic / arbitrary number of *args or ** kwargs in str.format() in Python
我正在制作一个套接字客户端,需要定义一个函数来向服务器发送以下类型的消息:sometext,[name_1],[name_2],...,[name_n]
。实际上这个消息更复杂,但是为了举例我简化了它。
其中:
...
- 表示 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
的解决方案一样
我正在制作一个套接字客户端,需要定义一个函数来向服务器发送以下类型的消息:sometext,[name_1],[name_2],...,[name_n]
。实际上这个消息更复杂,但是为了举例我简化了它。
其中:
...
- 表示 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