如何在* args之后使用单个命名参数

时间:2016-02-10 13:36:08

标签: python

如何在我的程序中使用单个** kwargs?我需要它在应用程序使用套接字设置端口号。我必须使用** kwargs,因为我也使用* args所以我不能添加" port = xxxx"在我的函数参数中。

def myFunction(*args, **kwargs):
   ... 
   socket.connect(("xx.xx.xx.xx", kwargs.values()))
   ... 

myFunction("something", "other", port = xxxx)

临时我使用" kwargs.values()"设置端口号,但我认为这不是一个好主意。

4 个答案:

答案 0 :(得分:2)

  

我不想要kwargs,我认为我不能在我的函数中添加port=xxxx声明参数{I} {/ 1}

Python 3

在Python 3中,可以在*args之后定义参数:

*args

但是这会在Python 2中生成语法错误。

要使其适应您的代码,您可以使用:

>>> def func(*args, port):
...     print(port)
...     print(args)
... 
>>> func('something', 'args', port='8000')
8000
('something', 'args')

更自然的解决方案:使用** kwargs本身(Python 2和3)

#python3 only
def func(*args, port):
    socket.connect(('xx.xx.xx.xx', port))

如您所见,您可以在>>> def func(*args, **kwargs): ... print(args) ... print(kwargs) ... >>> func('something', 'other', port='8000') ('something', 'other') {'port': '8000'} 字典

中提取port参数(如果已提供)
kwargs

使用以下方式调用:

def func(*args, **kwargs):
   socket.connect(('xx.xx.xx.xx', kwargs['port']))

答案 1 :(得分:1)

当您使用**时,您会收到字典。因此,您可以使用参数名称作为键来访问值。

def myFunction(*args, **kwargs):
   ... 
   socket.connect(("xx.xx.xx.xx", kwargs["port"]))
   ... 

myFunction("something", "other", port = xxxx)

答案 2 :(得分:-1)

  

我必须使用** kwargs,因为我也使用* args所以我不能只添加" port = xxxx"在我的函数参数中。

你确定可以。

def myFunction(*args, port=None):
   ... 
   socket.connect(("xx.xx.xx.xx", port))
   ... 

myFunction("something", "other", port = xxxx)

编辑:正如评论中所提到的,python2需要在显式参数之后定义的splat参数。因此,您将无法保留所需参数的顺序。另一种方法是定义函数,并假设使用者将传入名为port的参数。在给出选择的情况下,我总是会选择明确命名的函数。

def myFunction(*args, **kwargs):
   ... 
   socket.connect(("xx.xx.xx.xx", port))
   ... 

myFunction("something", "other", port = xxxx)

答案 3 :(得分:-3)

在你拿到它们时传递它:D

def myFunction(*args, **kwargs):
   ... 
   socket.connect("xx.xx.xx.xx", **kwargs)
   ... 

myFunction("something", "other", port = xxxx)