我有一些具有属性字典的对象obj.attrs.**kwargs为方便起见,这些对象的构造函数接受dict和/或.
看起来有点像这样:
class Thing:
def __init__(self, attrs={}, **kwargs):
for arg in kwargs:
attrs[arg] = kwargs[arg]
self.attrs = attrs
Run Code Online (Sandbox Code Playgroud)
这样Thing({'color':'red'})做也是如此Thing(color='red').
我的问题是构造函数以某种方式记住attrs传递给它的最后一个值.
例如:
>>> thing1 = Thing(color='red')
>>> thing2 = Thing()
>>> thing2.attrs
{'color': 'red'}
Run Code Online (Sandbox Code Playgroud)
......但thing2.attrs应该是一个空洞的词典!{}
这让我想知道这不是一个问题,使用两者 **kwargs 和一个像这样的论点attrs={}.
有任何想法吗?
我今天看着Django源代码,我注意到了这一点:
class DjangoTestSuiteRunner(object):
def __init__(self, verbosity=1, interactive=True, failfast=True, **kwargs):
self.verbosity = verbosity
self.interactive = interactive
self.failfast = failfast
Run Code Online (Sandbox Code Playgroud)
为什么他们会在构造函数中接受kwargs但是却不对它们做任何事情?
我希望success_url在表单提交并有效后将其重定向到相同的表单.在线我找到了解决方案的描述,但是这个解决方案和我的其他代码选项会生成相同的错误消息.
Exception Value: 'NoneType' object has no attribute 'find'
Run Code Online (Sandbox Code Playgroud)
url(r'^pictures/(?P<id>\d+)/$', PictureUpload.as_view(), name='picture_upload'),
...
Run Code Online (Sandbox Code Playgroud)
复制现有的链接路径
class PictureUpload(FormView):
form_class = PictureForm
template_name = 'picture_upload.html'
def get_success_url(self):
success_url = lambda self: self.request.path
Run Code Online (Sandbox Code Playgroud)
根据反向URL和id重新创建链接路径
class PictureUpload(FormView):
form_class = PictureForm
template_name = 'picture_upload.html'
def get_success_url(self):
success_url = reverse('picture_upload',
kwargs={'id': self.kwargs.get('id', None)})
Run Code Online (Sandbox Code Playgroud)
Request Method: POST
Request URL: http://127.0.0.1:8000/pictures/2/
Django Version: 1.5.1
Python Version: 2.7.1
Installed Applications:
('django.contrib.admin',
'django.contrib.admindocs',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.gis',
'django.contrib.humanize',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin', …Run Code Online (Sandbox Code Playgroud) 我正在重构一段代码,我遇到了以下问题.我有一个巨大的参数列表,现在我想传递给它kwargs.代码是这样的:
def f(a, b, c, ...):
print a
...
f(a, b, c, ...)
Run Code Online (Sandbox Code Playgroud)
我正在重构它:
data = dict(a='aaa', b='bbb', c='ccc', ...)
f(**data)
Run Code Online (Sandbox Code Playgroud)
这意味着我必须这样做:
def f(**kwargs):
print kwargs['a']
...
Run Code Online (Sandbox Code Playgroud)
但这是一个皮塔饼.我想保留:
def f(**kwargs):
# Do some magic here to make the kwargs directly accessible
print a
...
Run Code Online (Sandbox Code Playgroud)
是否有任何直接的方法kwargs dict可以直接访问参数,也许通过使用一些帮助类/库?
我有一个通过API更新记录的功能.API接受各种可选的关键字参数:
def update_by_email(self, email=None, **kwargs):
result = post(path='/do/update/email/{email}'.format(email=email), params=kwargs)
Run Code Online (Sandbox Code Playgroud)
我有另一个函数,它使用第一个函数来更新记录中的单个字段:
def update_field(email=None, field=None, field_value=None):
"""Encoded parameter should be formatted as <field>=<field_value>"""
request = update_by_email(email=email, field=field_value)
Run Code Online (Sandbox Code Playgroud)
这不起作用.我打电话的时候:
update_field(email='joe@me.com', field='name', field_value='joe')
该网址编码为:
https://www.example.com/api/do/update/email/joe@me.com?field=Joe
如何将其编码为:
https://www.example.com/api/do/update/email/joe@me.com?name=Joe
先感谢您.
我试图传递**kwargs给另一个函数,但只有它不是null.现在我有这个if else,我想知道是否有更高效的pythonic方式?
if other:
html.append(self.render_option(val, label, selected, **other))
else:
html.append(self.render_option(val, label, selected))
Run Code Online (Sandbox Code Playgroud)
如果是其他,NoneType那么我得到错误:
...argument after ** must be a mapping, not NoneType
Run Code Online (Sandbox Code Playgroud) 是否可以简化kwargs选项的布尔检查?
例如,foo我必须检查很多选项:
def foo(*args, **kwargs):
if 'foo' in kwargs and kwargs['foo'] is True:
do_something()
if 'bar' in kwargs and kwargs['bar'] is True:
do_something_else()
...
Run Code Online (Sandbox Code Playgroud)
一个可能的工作方法是通过增加更多复杂性来隐藏一些复杂性......
def parse_kwargs(kwords, **kwargs):
keywords = {}
for kw in kwords:
keywords[kw] = True if kw in kwargs and kwargs['kw'] is True else False
return keywords
Run Code Online (Sandbox Code Playgroud)
然后在我的主要功能:
def foo(*args, **kwargs):
kw = parse_kwargs(**kwargs)
if kw['foo']:
do_something()
if kw['bar']:
do_something_else()
...
Run Code Online (Sandbox Code Playgroud)
我想知道我是否可以使用更简单的方法更少的样板...
我无法弄清楚为什么这段代码不起作用
>>> my_list = [1,2,3,4,5]
>>> my_set = {*my_list}
File "<stdin>", line 1
my_set = {*my_list}
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
*args在python中用于解压缩列表.我的期望是上面的操作会产生一组,但事实并非如此.Python中的*args和**kwargs只能用于将参数作为函数传递吗?
我知道这个set()函数,但好奇为什么这个语法不起作用.
哦,亲爱的,我希望我的头衔正确.:)
如何将提供给包装函数 定义的**kwargs传递给它包装的另一个(封闭的)函数调用.例如:
def wrapped_func(**kwargs):
# Do some preparation stuff here.
func('/path/to/file.csv', comma_separated_key=value_injected_here)
# Do some other stuff.
Run Code Online (Sandbox Code Playgroud)
例如,这个电话:
wrapped_func(error_bad_lines=True, sep=':', skip_footer=0, ...)
Run Code Online (Sandbox Code Playgroud)
应该导致:
func('/path/to/file.csv', error_bad_lines=True, sep=':', skip_footer=0, ...)
Run Code Online (Sandbox Code Playgroud)
在过去的几个小时里,我已经采用了各种方法,但每种方法都暴露了类型保留漏洞(对于价值观).我之前没有使用过这种特殊的包装模式,并且想知道社区是否可以提供一些帮助.先感谢您.
是否有可能在Julia中键入函数kwargs?
以下适用于标准Varargs.
function int_args(args::Integer...)
args
end
int_args(1, 2, 3)
# (1, 2, 3)
int_args(1, 2, 3.0)
# ERROR: MethodError: `int_args` has no method matching int_args(::Int64, ::Int64, ::Float64)
Run Code Online (Sandbox Code Playgroud)
但是,当将相同的语法应用于kwargs时,所有函数调用似乎都是错误的.
function int_kwargs(; kwargs::Integer...)
kwargs
end
int_kwargs(x=1, y=2)
# ERROR: MethodError: `__int_kwargs#0__` has no method matching __int_kwargs#0__(::Array{Any,1})
Run Code Online (Sandbox Code Playgroud)