所以我有这个概念的困难*args
和**kwargs
.
到目前为止,我已经了解到:
*args
=参数列表 - 作为位置参数**kwargs
= dictionary - 其键成为单独的关键字参数,值成为这些参数的值.我不明白这会对哪些编程任务有所帮助.
也许:
我想输入列表和字典作为函数AND的参数同时作为通配符,所以我可以传递任何参数?
有一个简单的例子来说明如何*args
和**kwargs
使用?
我发现的教程也使用了"*"和变量名.
是*args
和**kwargs
刚才占位符或者你使用完全相同*args
,并**kwargs
在代码中?
**kwargs
在Python中有什么用途?
我知道你可以objects.filter
在桌子上做一个并传递一个**kwargs
参数.
我也可以这样做来指定时间增量timedelta(hours = time1)
吗?
它究竟是如何工作的?这类是"解包"吗?喜欢a,b=1,2
?
**kwargs
在默认值方面,在Python中使用的正确方法是什么?
kwargs
返回字典,但设置默认值的最佳方法是什么,还是有一个?我应该只是作为字典访问它吗?使用get函数?
class ExampleClass:
def __init__(self, **kwargs):
self.val = kwargs['val']
self.val2 = kwargs.get('val2')
Run Code Online (Sandbox Code Playgroud)
一个简单的问题,但我找不到好的资源.人们在我看过的代码中采用不同的方式,并且很难知道要使用什么.
我想使用类继承为sunburnt(solr接口)构建一个查询,从而将键 - 值对添加到一起.sunburnt接口采用关键字参数.如何将dict ({'type':'Event'})
转换为关键字参数(type='Event')
?
Python 3.2.3.这里列出了一些有关常规变量的想法,但似乎**kwargs按照不同的规则进行播放...所以为什么这不起作用?如何查看**kwargs中的密钥是否存在?
if kwargs['errormessage']:
print("It exists")
Run Code Online (Sandbox Code Playgroud)
我也认为这应该有效,但事实并非如此 -
if errormessage in kwargs:
print("yeah it's here")
Run Code Online (Sandbox Code Playgroud)
我猜是因为kwargs是可迭代的?我是否必须遍历它才能检查特定键是否存在?
我可以将kwargs列表传递给简洁方法吗?这就是我正在尝试做的事情:
def method(**kwargs):
#do something
keywords = (keyword1 = 'foo', keyword2 = 'bar')
method(keywords)
Run Code Online (Sandbox Code Playgroud) 我来自静态语言的背景.有人可以解释(理想情况下通过示例)使用**kwargs而不是命名参数的真实世界优势吗?
对我来说,它似乎只是使函数调用更加模糊.谢谢.
在python中,我可以定义一个函数如下:
def func(kw1=None,kw2=None,**kwargs):
...
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我可以调用func作为:
func(kw1=3,kw2=4,who_knows_if_this_will_be_used=7,more_kwargs=Ellipsis)
Run Code Online (Sandbox Code Playgroud)
我也可以定义一个函数:
def func(arg1,arg2,*args):
...
Run Code Online (Sandbox Code Playgroud)
可称为
func(3,4,additional,arguments,go,here,Ellipsis)
Run Code Online (Sandbox Code Playgroud)
最后,我可以将两种形式结合起来
def func(arg1,arg2,*args,**kwargs):
...
Run Code Online (Sandbox Code Playgroud)
但是,什么是行不通的是:
func(arg1,arg2,*args,kw1=None,kw2=None,**kwargs): #SYNTAX ERROR (in python 2 only, apparently this works in python 3)
...
Run Code Online (Sandbox Code Playgroud)
我最初的想法是,这可能是因为一个功能
def func(arg1,arg2,*args,kw1=None):
...
Run Code Online (Sandbox Code Playgroud)
可以称为
func(1,2,3) #kw1 will be assigned 3
Run Code Online (Sandbox Code Playgroud)
因此,这将引入一些含糊不清的关于3是否应该打包成args或kwargs.但是,使用python 3,可以指定仅关键字参数:
def func(a,b,*,kw=None): #can be called as func(1,2), func(1,2,kw=3), but NOT func(1,2,3)
...
Run Code Online (Sandbox Code Playgroud)
有了这个,似乎没有语法模糊:
def func(a,b,*args,*,kw1=None,**kwargs):
...
Run Code Online (Sandbox Code Playgroud)
但是,这仍然会导致语法错误(使用Python3.2测试).这是否有理由让我失踪?并且,有没有办法获得我上面描述的行为(使用默认参数*args) - 我知道我可以通过操作函数内部的kwargs字典来模拟该行为.
我想在创建Thread对象时将命名参数传递给目标函数.
以下是我写的代码:
import threading
def f(x=None, y=None):
print x,y
t = threading.Thread(target=f, args=(x=1,y=2,))
t.start()
Run Code Online (Sandbox Code Playgroud)
我在第6行得到了"x = 1"的语法错误.我想知道如何将关键字参数传递给目标函数.
python multithreading kwargs python-multithreading python-2.7
是否可以将OrderedDict实例传递给使用**kwargs
语法并保留排序的函数?
我想做的是:
def I_crave_order(**kwargs):
for k, v in kwargs.items():
print k, v
example = OrderedDict([('first', 1), ('second', 2), ('third', -1)])
I_crave_order(**example)
>> first 1
>> second 2
>> third -1
Run Code Online (Sandbox Code Playgroud)
但实际结果是:
>> second 2
>> third -1
>> first 1
Run Code Online (Sandbox Code Playgroud)
即,典型的随机字典排序.
我有其他用途明确设置顺序是好的,所以我想保留**kwargs
而不是仅仅将OrderedDict作为常规参数传递