“self.default = default if default else type()”是什么意思?

时间:2011-04-29 18:20:44

标签: python

自从我开始工作(约6年)以来,我一直是一个.NET人。最近,我正在使用Django开发一个项目,这需要我并行学习Python。很多时候我碰到了看似简单的Python代码,但我无法理解。这是其中之一。

class TypedProperty(object):
    def __init__(self, name, type, default=None):
        self.name = "_" + name
        self.type = type
        self.default = default if default else type()

有人可以向我解释一下代码的最后一行是做什么的吗?

我希望这个问题不是太微不足道,因为我无法想出一个好的头衔。

3 个答案:

答案 0 :(得分:6)

a if b else c是一个条件表达式,如果a评估为b,则评估为True,否则评估为c。在给定的上下文中,这会检查default是否为"trucy",在这种情况下,它会存储在self.default中。否则,会在type中创建并覆盖self.default的新实例。

请注意,此实现有几个问题:

  1. 它使用type作为变量名称,遮蔽内置type()。这被认为是不好的风格。

  2. 它使用条件if default,其中应使用实际if default is None。该检查旨在测试参数default是否实际传递给构造函数。实际上,实现不会接受evaluates to False

  3. 的任何默认值

答案 1 :(得分:4)

在函数签名中,您会看到default=None - 这意味着如果未传入第三个参数,default将等于None

最后一行天真地检查default是否评估为true以确定是否传入了默认值。如果default为真,则self.default将设置为它。否则self.default设置为传入type的实例。

我天真地说,因为default可能是0,或者它可能是False,或者(更有可能)它可能是一个对象,但该对象以某种方式评估为False。我更喜欢

self.default = default if default is not None else type()

或者,为了避免我在世界上找不到最清楚的条件表达式

if default is None:
    self.default = type()
else:
    self.default = default

答案 2 :(得分:1)

这就是Python的三元运算符(又名conditional expression)!值得一提的是,Python懒惰地评估布尔值,所以在这种情况下:

self.default = default if default else type()

等同于:

self.default = default or type()

如果default评估为任何非假值,则会使用其值,否则会降至type()