标签: kwargs

Python函数"记住"早期的参数(**kwargs)

我有一些具有属性字典的对象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={}.

有任何想法吗?

python kwargs

4
推荐指数
1
解决办法
1766
查看次数

为什么接受kwargs但不使用它们?

我今天看着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但是却不对它们做任何事情?

python django kwargs

4
推荐指数
1
解决办法
200
查看次数

Django:动态success_url导致"'NoneType'对象没有属性'find'"

我希望success_url在表单提交并有效后将其重定向到相同的表单.在线我找到了解决方案的描述,但是这个解决方案和我的其他代码选项会生成相同的错误消息.

Exception Value: 'NoneType' object has no attribute 'find'
Run Code Online (Sandbox Code Playgroud)

urls.py

url(r'^pictures/(?P<id>\d+)/$', PictureUpload.as_view(), name='picture_upload'),
...
Run Code Online (Sandbox Code Playgroud)

1st views.py选项

复制现有的链接路径

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)

第二个views.py选项

根据反向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)

django redirect kwargs django-class-based-views

4
推荐指数
1
解决办法
5039
查看次数

让kwargs直接访问

我正在重构一段代码,我遇到了以下问题.我有一个巨大的参数列表,现在我想传递给它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可以直接访问参数,也许通过使用一些帮助类/库?

python arguments kwargs

4
推荐指数
2
解决办法
288
查看次数

使用变量作为关键字传递给Python中的**kwargs

我有一个通过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

先感谢您.

python arguments keyword kwargs

4
推荐指数
1
解决办法
2469
查看次数

通过**kwargs,如果不是没有

我试图传递**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)

python kwargs

4
推荐指数
1
解决办法
6665
查看次数

简化`if'foo'在kwargs和kwargs ['foo']是真的:`

是否可以简化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)

我想知道我是否可以使用更简单的方法更少的样板...

python kwargs

4
推荐指数
1
解决办法
148
查看次数

Python集:为什么my_set = {*my_list}无效?

我无法弄清楚为什么这段代码不起作用

>>> 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()函数,但好奇为什么这个语法不起作用.

python set kwargs

4
推荐指数
1
解决办法
172
查看次数

将包装函数定义中收到的**kwargs传递给封闭(即包装)函数调用的参数

哦,亲爱的,我希望我的头衔正确.:)

如何将提供给包装函数 定义的**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)

在过去的几个小时里,我已经采用了各种方法,但每种方法都暴露了类型保留漏洞(对于价值观).我之前没有使用过这种特殊的包装模式,并且想知道社区是否可以提供一些帮助.先感谢您.

python function kwargs

4
推荐指数
1
解决办法
1681
查看次数

在Julia中输入的kwargs

是否有可能在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)

types variadic-functions kwargs julia

4
推荐指数
1
解决办法
425
查看次数