自从我开始工作(约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()
有人可以向我解释一下代码的最后一行是做什么的吗?
我希望这个问题不是太微不足道,因为我无法想出一个好的头衔。
答案 0 :(得分:6)
a if b else c
是一个条件表达式,如果a
评估为b
,则评估为True
,否则评估为c
。在给定的上下文中,这会检查default
是否为"trucy",在这种情况下,它会存储在self.default
中。否则,会在type
中创建并覆盖self.default
的新实例。
请注意,此实现有几个问题:
它使用type
作为变量名称,遮蔽内置type()
。这被认为是不好的风格。
它使用条件if default
,其中应使用实际if default is None
。该检查旨在测试参数default
是否实际传递给构造函数。实际上,实现不会接受evaluates to False
。
答案 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()
。