代码之家  ›  专栏  ›  技术社区  ›  Bad

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

  •  1
  • Bad  · 技术社区  · 10 年前

    我正在制作一个套接字客户端,需要定义一个向服务器发送以下消息的函数: 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} 在这里是非法的。 当我知道 *参数 事先,如这里所示:

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

    我错过了什么?

    3 回复  |  直到 10 年前
        1
  •  4
  •   Selcuk    10 年前

    您可以加入 *args 实现您想要的目标:

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

    结果:

    sometext, message1, message2, message3
    
        2
  •  3
  •   Martijn Pieters    10 年前

    您不能使用 *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'
    
        3
  •  1
  •   jamylak    10 年前

    我认为你应该避免使用 .format 而且只是 ', '.join 根据需要设置参数。你没有提到你需要 总体安排 问题中的字符串。就像@Selcuk的解决方案