2016-08-17 118 views

回答

3

default_factory参数defaultdict应该是不接受它创建并返回一个对象,这将成为获得任何引用不存在的项的值的任何参数的函数。

提供这种功能的一种方法是使用内联lambda expression创建一个匿名类。另一种方法是使用内置函数的名称创建并返回其中一种内置类型,如float,int,tuple等。当任何那些被调用时没有参数时,返回的对象会有一些默认值 - 通常是零或空的东西。

my_var = collections.defaultdict(
      lambda: collections.defaultdict(
       collections.defaultdict(float))) 

但是,(在这两种形式),这是不正确的,因为一些defaultdict电话没有:

首先,您可以通过格式化像这样让这样的代码,你有更多的可读可调用的函数参数。因为Python是一种解释型语言,所以直到您尝试使用my_var时才会知道这一点。对于像例如东西:

my_var['level1']['level2']['level3'] = 42. 

会导致:

my_var = collections.defaultdict(
      lambda: collections.defaultdict(
       lambda: collections.defaultdict(float))) # need lambda here, too 

事后前面的分配将不会被考虑:

TypeError: first argument must be callable or None 

这可以通过添加另一个lambda固定一个错误。

由于defaultdict是内置dict类的子类,你可以使用json模块漂亮地打印一个实例:

import collections 

my_var = collections.defaultdict(
      lambda: collections.defaultdict(
       lambda: collections.defaultdict(float))) 

import json # for pretty printing dictionaries 

# Auto-creates the 3 levels of dictionaries needed. 
my_var['level1']['level2']['level3A'] = 42. 

# Similar to above but additionally auto-creates a 
# my_var['level1']['level2']['level3B'] entry with default value of 0.0 
my_var['level1']['level2']['level3C'] = my_var['level1']['level2']['level3B'] + 1 

print(json.dumps(my_var, indent=4)) 

输出:

{ 
    "level1": { 
     "level2": { 
      "level3A": 42.0, 
      "level3B": 0.0, 
      "level3C": 1.0 
     } 
    } 
} 

我想你应该能够理解它现在的功能 - 但是如果没有,请告诉我。

+0

真棒回答。谢谢哥们 –

相关问题