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

How do I create an “optional” argument in Python?

我正在编写一个名为"bag"的简单python类:

1
2
3
4
5
6
7
8
9
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

变量项接受对象列表,例如:

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

从这里,"def uu init_uuu(self,items=none)"将:

  • 如果没有向项传递任何内容,则将项初始化为空的defaultdict,或者
  • 如果对象列表被传递到项中,则初始化传入参数。
  • 例如,这应该有效:

    1
    b = Bag()

    缺少参数应该很好,因为默认情况下,项被设置为"无"。

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

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

    我希望初始化bag(),而不将传递参数放入项中。

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

    有什么想法或者代码有什么问题吗?


    'Bag' object has no attribute 'items'的意思是:在Bag的方法中,您访问的self.items尚未定义。

    事实上,你是这样做的。在构造器中,在对self.items进行第一次赋值之前,先编写:if self.items == None:,从而创建它。

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

    不过,这段代码可以简化。我的看法:

    1
    2
    3
    4
    5
    6
    7
    8
    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)

    这甚至可以简化:

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

    如果您严格希望a使用defaultdict,则可以:

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

    (注意,没有争论的defaultdict()是没有意义的。)


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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进行评估。