根据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紧凑字典的瘦子类更快的实现).
为什么函数接收的有序映射不会在相等比较中遵循排序?
我正在编写一个函数装饰器,它将转换应用于函数的第一个参数.如果我只修改一次我的函数,它工作正常,但如果我装饰它们两次我得到一个错误.下面是一些演示该问题的代码,它是我正在处理的代码的简化版本.我已经排除了进行转换的代码,以免分散注意力
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) 给定一个更高阶函数,它将多个函数作为参数,该函数如何将关键字参数传递给函数参数?
例
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?
如果我不知道函数将传递多少个参数,我可以使用参数包装来编写函数:
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不是传递数字列表是否有优势?或者是否存在更合适的情况?
在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的其他意见和建议也欢迎.
我似乎在确定如何在使用时增加或减少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*运算符的专有名称?
*拆包当清楚地使用的参数的任意数量和
这是传统的使用*args和**kwargs,我倾向于这些发音为"ARGS"和"quargs",忽略了*秒.
在这个问题中,星号被称为指针.
BDFL如何引用这些符号?
感谢您找到相关问题,这就是我所寻求的.准确地搜索(甚至非常特定的)网络真的很棘手*!
对那些回答他们如何发音"*"的评论员来说,这不是我问的问题(如果我的问题误导了你,我会道歉).我想知道的是这些说明符是如何在Python中命名的,这不是一个主观问题(因此引用了BDFL).
好吧,我已经尝试了很长一段时间.我不能将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)
有什么原因吗?
我有这样的哈希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"它可能吗?
我习惯在Python中有这样的函数/方法定义:
def my_function(arg1=None , arg2='default'):
... do stuff here
Run Code Online (Sandbox Code Playgroud)
如果我不提供arg1(或arg2)则None分配默认值(或''default').
我可以像这样指定关键字参数,但没有默认值吗?如果没有提供参数,我希望它会引发错误.
kwargs ×10
python ×9
args ×2
function ×2
axis-labels ×1
decorator ×1
django ×1
django-views ×1
docstring ×1
hash ×1
inspect ×1
matplotlib ×1
naming ×1
python-3.6 ×1
ruby ×1
text ×1
type-hinting ×1
types ×1