在python中将参数设置为字典类型作为默认值的最佳实践是什么

时间:2019-06-13 14:44:28

标签: python-3.x mutable

我试图用可变对象作为默认值编写一个类。我知道对于单个功能,我们应该将参数设置为None,并检查该参数,以防该功能的副作用如以下代码所示。但是我想知道当我尝试初始化一个类时如何? 使用可变对象作为变量的默认值的副作用

def func(k, v, para = {}):
    para[k] = v
    return para
print(func('a', 1)) #expect {'a': 1}, actually return {'a': 1}
print(func('b', 2)) #expect {'a': 1}, actually return {'a': 1, 'b': 2}
print(func('c', 3)) #expect {'a': 1}, actually return {'a': 1, 'b': 2, 'c': 3}
#how about class?
class T
    def __init__(self, para = {})
    #or
    #def __init__(self, para = None)
        #para = para or dict()
        self.para = para

1 个答案:

答案 0 :(得分:1)

最佳实践如下。

来源:Why is the empty dictionary a dangerous default value in Python?

def func(k, v, para=None):
    if para is None:
        para = dict()
    para[k] = v
    return para
print(func('a', 1)) #returns {'a': 1}
print(func('b', 2)) #returns {'b': 2}
print(func('c', 3)) #returns {'c': 3}

是的,我敢肯定,这同样适用于类。

class T:
    def __init__(self, para=None):
        if para is None:
            para = dict()
        self.para = para



让我们测试一下类会发生什么:

class T:
    def __init__(self, k, v, para={}):
        self.para = para
        self.para[k] = v

print(T('a',1).para) #returns {'a': 1}
print(T('b',2).para) #returns {'a': 1, 'b': 2}
print(T('c',3).para) #returns {'a': 1, 'b': 2, 'c': 3}

是的,这同样适用于类构造函数。