标签: kwargs

为什么**kwargs映射与不同排序的OrderedDict相等?

根据PEP 468:

从版本3.6开始,Python将保留传递给函数的关键字参数的顺序.为了实现这一点,收集的kwargs现在将是有序映射.请注意,这并不一定意味着OrderedDict.

在这种情况下,为什么这个有序映射无法与Python的规范有序映射类型进行相等比较,collections.OrderedDict:

>>> from collections import OrderedDict
>>> data = OrderedDict(zip('xy', 'xy'))
>>> def foo(**kwargs):
...     return kwargs == data
... 
>>> foo(x='x', y='y')  # expected result: True
True
>>> foo(y='y', x='x')  # expected result: False
True
Run Code Online (Sandbox Code Playgroud)

虽然现在保留了迭代顺序,但kwargs似乎表现得像比较的普通字典.从3.5开始,Python有一个C实现的有序字典,因此它可以直接使用(或者,如果性能仍然是一个问题,使用3.6紧凑字典的瘦子类更快的实现).

为什么函数接收的有序映射不会在相等比较中遵循排序?

python function ordereddictionary kwargs python-3.6

12
推荐指数
3
解决办法
992
查看次数

嵌套函数装饰器,用于操作python中的参数

我正在编写一个函数装饰器,它将转换应用于函数的第一个参数.如果我只修改一次我的函数,它工作正常,但如果我装饰它们两次我得到一个错误.下面是一些演示该问题的代码,它是我正在处理的代码的简化版本.我已经排除了进行转换的代码,以免分散注意力

from inspect import getargspec
from functools import wraps

def dec(id):
    def _dec(fn):
        @wraps(fn)
        def __dec(*args, **kwargs):
            if len(args):
                return fn(args[0], *args[1:], **kwargs)
            else:
                first_arg = getargspec(fn).args[0]
                new_kwargs = kwargs.copy()
                del new_kwargs[first_arg]
                return fn(kwargs[first_arg], **new_kwargs)
        return __dec
    return _dec

@dec(1)
def functionWithOneDecorator(a, b, c):
    print "functionWithOneDecorator(a = %s, b = %s, c = %s)" % (a, b, c)

@dec(1)
@dec(2)
def functionWithTwoDecorators(a, b, c):
    print "functionWithTwoDecorators(a = %s, b = %s, c = %s)" % (a, b, c)

functionWithOneDecorator(1, 2, …
Run Code Online (Sandbox Code Playgroud)

python decorator inspect kwargs

11
推荐指数
1
解决办法
3396
查看次数

为不同的功能分离**kwargs

给定一个更高阶函数,它将多个函数作为参数,该函数如何将关键字参数传递给函数参数?

def eat(food='eggs', how_much=1):
    print(food * how_much)


def parrot_is(state='dead'):
    print("This parrot is %s." % state)


def skit(*lines, **kwargs):
    for line in lines:
        line(**kwargs)

skit(eat, parrot_is)  # eggs \n This parrot is dead.
skit(eat, parrot_is, food='spam', how_much=50, state='an ex-parrot') # error
Run Code Online (Sandbox Code Playgroud)

state不是关键字arg,eat那么skit如何才能传递与其调用的函数相关的关键字args?

python function kwargs keyword-argument

11
推荐指数
2
解决办法
2230
查看次数

为什么使用packed*args/**kwargs而不是传递list/dict?

如果我不知道函数将传递多少个参数,我可以使用参数包装编写函数:

def add(factor, *nums):
    """Add numbers and multiply by factor."""
    return sum(nums) * factor
Run Code Online (Sandbox Code Playgroud)

或者,我可以通过传递一个数字列表作为参数来避免参数打包:

def add(factor, nums):
    """Add numbers and multiply by factor.

    :type factor: int
    :type nums: list of int
    """
    return sum(nums) * factor
Run Code Online (Sandbox Code Playgroud)

使用参数打包而*args不是传递数字列表是否有优势?或者是否存在更合适的情况?

python parameter-passing kwargs

11
推荐指数
1
解决办法
3259
查看次数

python - 如何docstring kwargs及其预期类型

在docstring中表达关键字参数的预期类型的​​传统方法是什么?

或者这是否是我不应该做的事情的原则?谷歌在这个问题上毫不怀疑.

(我感兴趣的是因为我发现跟踪所有变量的预期类型非常有用,因为我编码.我使用PyCharm,当参数有意外类型时,或者当自定义类属性可能未解决时,它会发出警告)

但是,我发现有时可能的keywrord参数列表列为

def foo(bar, parameter_1: int=1, paramter_2: str='', ...etc )
Run Code Online (Sandbox Code Playgroud)

会变得漫长而难以理解..

请考虑以下代码

class Person:
    def __init__(self, id: int, **kwargs):
        """
        :param id: social security number
        :type id: int
        :param **name: person's first name
        :type **name: str
        :param **age: person's age in years, rounded down
        :type **age: int
        """
        self.data = kwargs


bob = Person(123456568, name='Bob', age=48)
sally = Person(1245654568, name='Sally', age='22')
Run Code Online (Sandbox Code Playgroud)

我想使用docstring来声明预期的类型.而且我希望PyCharm警告我,莎莉的年龄是错误的.当然,我不知道PyCharm是否有能力"理解"文档字符串中的详细程度.不过我想知道传统方法是做什么的.

关于kwargs和docstrings的其他意见和建议也欢迎.

python types docstring type-hinting kwargs

11
推荐指数
1
解决办法
1495
查看次数

Python:如何增加/减少x和y刻度标签的字体大小?

我似乎在确定如何在使用时增加或减少fontsizex和y刻度标签时遇到问题matplotlib.

我知道有set_xticklabels(labels, fontdict=None, minor=False, **kwargs)功能,但我无法理解如何控制fontsize它.

我期待一些明确的东西,比如

title_string=('My Title')
plt.suptitle(title_string, y=1.0, fontsize=17)
Run Code Online (Sandbox Code Playgroud)

但到目前为止我还没有找到类似的东西.我错过了什么?

python text matplotlib kwargs axis-labels

10
推荐指数
2
解决办法
5万
查看次数

Python的`*`和`**`说明符有名字吗?

可能重复:
python*运算符的专有名称?

*拆包当清楚地使用的参数的任意数量

**在将关键字参数解压缩为字典时使用.

这是传统的使用*args**kwargs,我倾向于这些发音为"ARGS"和"quargs",忽略了*秒.

这个问题中,星号被称为指针.

BDFL如何引用这些符号?


关闭后.

感谢您找到相关问题,这就是我所寻求的.准确地搜索(甚至非常特定的)网络真的很棘手*!

对那些回答他们如何发音"*"的评论员来说,这不是我问的问题(如果我的问题误导了你,我会道歉).我想知道的是这些说明符是如何在Python中命名,这不是一个主观问题(因此引用了BDFL).

python naming args kwargs

9
推荐指数
0
解决办法
435
查看次数

django意见中的args和kwargs

好吧,我已经尝试了很长一段时间.我不能将args和kwargs传递到django app中的视图吗?我是否必须独立定义每个关键字参数?

例如,

#views.py
def someview(request, *args, **kwargs):
...
Run Code Online (Sandbox Code Playgroud)

在调用视图时,

response = someview(request,locals())
Run Code Online (Sandbox Code Playgroud)

我似乎无法做到这一点.相反,我必须这样做:

#views.py
def someview(request, somekey = None):
...
Run Code Online (Sandbox Code Playgroud)

有什么原因吗?

python django args django-views kwargs

9
推荐指数
3
解决办法
1万
查看次数

将哈希传递给接受关键字参数的函数

我有这样的哈希hash = {"band" => "for King & Country", "song_name" => "Matter"}和一个类:

class Song
  def initialize(*args, **kwargs)
    #accept either just args or just kwargs
    #initialize @band, @song_name
  end
end
Run Code Online (Sandbox Code Playgroud)

我想传递hashas关键字参数,如果Song.new band: "for King & Country", song_name: "Matter"它可能吗?

ruby hash kwargs

9
推荐指数
1
解决办法
4319
查看次数

你能不提供关键字参数而不提供默认值吗?

我习惯在Python中有这样的函数/方法定义:

def my_function(arg1=None , arg2='default'):
    ... do stuff here
Run Code Online (Sandbox Code Playgroud)

如果我不提供arg1(或arg2)则None分配默认值(或''default').

我可以像这样指定关键字参数,但没有默认值吗?如果没有提供参数,我希望它会引发错误.

python kwargs

9
推荐指数
2
解决办法
2310
查看次数