如何在Python中创建“可选”参数?

时间:2017-04-22 02:12:22

标签: python

我正在编写一个名为“Bag”的简单Python类:

class Bag:
def __init__(self, items=None):
    if self.items == None:
        self.items = defaultdict()
    else:
        temp_dict = defaultdict()
        for key in self.items:
            temp_dict[key] += 1
        self.items = temp_dict 

变量包含对象列表,例如:

['d','a','b','d','c','b','d']

从那里,“def __init __(self,items = None)”将:

  1. 如果没有将任何内容传递到
  2. ,则将初始化为空的 defaultdict
  3. 如果将对象列表传递到项目,则初始化传入的参数。
  4. 例如,这应该有效:

    b = Bag()
    

    缺少参数应该没问题,因为默认情况下设置为 _None

    但是,这总是引发异常(来自检查错误的脚本):

    *Error: b = Bag() raised exception AttributeError: 'Bag' object has no attribute 'items'
    

    我想初始化 Bag()而不在中传递参数。

    希望一切都清楚,告诉我是不是。

    任何想法或代码有什么问题?

2 个答案:

答案 0 :(得分:2)

from collections import defaultdict

class Bag(object):

def __init__(self, items=None):
    self.items = items or list()
    if not self.items:
        self.items = defaultdict()
    else:
        temp_dict = defaultdict()
        for key in self.items:
            temp_dict[key] += 1
        self.items = temp_dict

我做了一些更正:

1)创建self.items并使用items进行初始化 2)使用is None或仅not self.items与无比较,因为空列表评估为False

答案 1 :(得分:2)

'Bag' object has no attribute 'items'表示:在Bag方法的某个位置,您正在访问尚未定义的self.items

你的确如此。在构造函数中,您在之前编写:if self.items == None: ,然后创建第一个self.items,从而创建它。

我认为这是一个错字,你的意思是if items is None:,指的是参数。

但是,这段代码可以简化。我的看法:

import collections  # Batteries included.

...
def __init__(self, items=None):
    if not items:  # Covers both None and empty list.
        self.items = {}
    else:
        self.items = collections.Counter(items)

这可以进一步简化:

     ...
     self.items = collections.Counter(items or [])

如果您严格要使用defaultdict,则可以:

     self.items = collections.defauldict(int, collections.Counter(items or []))

(请注意,没有参数的defaultdict()没什么意义。)