Cla*_*ell 9 python parameters arguments defaultdict
collections.defaultdict当您将default_factory作为位置参数传递时,Python 2.7.5 似乎才有效 - 当您将其作为命名参数传递时,它会中断.
如果您运行以下代码,您将看到default_dict_success()运行正常,但default_dict_failure()抛出一个KeyError.
from collections import defaultdict
test_data = [
('clay', 'happy'),
('jason', 'happy'),
('aj', 'sad'),
('eric', 'happy'),
('sophie', 'sad')
]
def default_dict_success():
results = defaultdict(list)
for person, mood in test_data:
results[mood].append(person)
print results
def default_dict_failure():
results = defaultdict(default_factory=list)
for person, mood in test_data:
results[mood].append(person)
print results
default_dict_success()
default_dict_failure()
Run Code Online (Sandbox Code Playgroud)
输出是
# First function succeeds
defaultdict(<type 'list'>, {'sad': ['aj', 'sophie'], 'happy': ['clay', 'jason', 'eric']})
# Second function fails
Traceback (most recent call last):
File "test_default_dict.py", line 26, in <module>
default_dict_failure()
File "test_default_dict.py", line 21, in default_dict_failure
results[mood].append(person)
KeyError: 'happy'
Run Code Online (Sandbox Code Playgroud)
有谁知道发生了什么?
编辑:最初我以为我正在查看一些Python来源,它会建议我尝试做的事情是可能的,但评论者指出我错了,因为这个对象是用C实现的,所以没有Python源码为了它.因此,这不是很像我想象的那么神秘.
话虽如此,这是我第一次遇到Python中的位置参数,也不能通过名称传递.这类事情会发生在其他地方吗?有没有办法在纯Python(而不是C扩展)中实现一个强制执行此类行为的函数?
我认为文档试图说这就是将会发生的事情,尽管他们并不是特别清楚:
第一个参数提供属性的初始值
default_factory;它默认为“无”。所有剩余参数的处理方式与传递给 dict 构造函数的方式相同,包括关键字参数。
强调我的。“第一个参数”不会是关键字参数(它们没有顺序)。也就是说,提交文档错误并不是一个坏主意。
话虽如此,这是我第一次在 Python 中遇到不能通过名称传递的位置参数。这种事情在其他地方发生过吗?有没有办法在纯 Python(而不是 C 扩展)中实现强制执行此类行为的函数?
这实际上很常见,有一个完整的 PEP与之相关。考虑range一个简单的例子。
至于自己做这件事,
现代 Python 中实现的函数可以通过可变参数 *args 接受任意数量的仅位置参数。但是,没有 Python 语法来指定接受特定数量的仅位置参数。换句话说,有许多内置函数的签名根本无法用 Python 语法来表达。
可以做类似的事情
def foo(*args):
a, b, c = args
Run Code Online (Sandbox Code Playgroud)
PEP 中提到了这一点:
(*args, **kwargs)显然,人们可以通过手动接受和解析参数来用纯 Python 代码模拟其中的任何一个。但这会导致 Python 函数的签名与其实际接受的内容之间脱节,更不用说实现所述参数解析的工作了。
| 归档时间: |
|
| 查看次数: |
739 次 |
| 最近记录: |