自从我开始工作(大约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()
有人能解释一下代码的最后一行在做什么吗?在
我希望这个问题不要太琐碎,因为我很难想出一个好的标题。在
这就是Python的三元运算符(aka conditional expression)在起作用!值得一提的是,Python对布尔值的求值是懒惰的,因此在本例中:
相当于:
^{pr2}$如果
default
的计算结果为任何非False值,则将使用其值,否则它将落入type()
。在在函数签名中可以看到
default=None
-这意味着如果没有传入第三个参数,default
将等于None
。在最后一行天真地检查
default
是否计算为true,以确定是否传入了默认值。如果default
为真,则self.default
将被设置为它。否则,self.default
被设置为传入的type
的实例。在我天真地说是因为},或者(更有可能)它可能是一个对象,但该对象的计算结果是False。我宁愿
default
可能是0
,也可能是{或者,为了避免我觉得世界上最清楚的条件表达
^{pr2}$a if b else c
是一个条件表达式,如果b
的计算结果为a
,否则为c
。在给定的上下文中,它检查default
是否是{a1},在这种情况下,它存储在self.default
中。否则,将创建type
的新实例并在self.default
中存储。在请注意,此实现有几个问题:
它使用
type
作为变量名,隐藏了内置的type()
。这被认为是不好的风格。它使用条件} 的任何默认值。
if default
,实际上应该使用if default is None
。该检查旨在测试参数default
是否实际传递给了构造函数。实际上,实现不会接受evaluates to ^{相关问题 更多 >
编程相关推荐