自从我开始工作(大约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()有人能给我解释一下代码的最后一行是做什么的吗?
我希望这个问题不是太琐碎,因为我很难为它想出一个好的标题。
发布于 2011-04-30 02:24:14
a if b else c是一个条件表达式,如果b的计算结果为True,则该表达式的计算结果为a,否则为c。在给定的上下文中,这将检查default是否为"trucy",在这种情况下,它存储在self.default中。否则,将在self.default中创建并存储一个新的type实例。
请注意,此实现有几个问题:
type作为变量名,隐藏了内置的type()。这被认为是不好的风格。if default,而实际上应该使用if default is None。该检查旨在测试参数default是否实际传递给了构造函数。实际上,该实现不会接受任何evaluates to False.发布于 2011-04-30 02:28:44
在函数签名中可以看到default=None -这意味着如果没有传入第三个参数,default将等于None。
最后一行很简单地检查default的计算结果是否为真,以确定是否传入了默认值。如果default为true,则self.default将被设置为true。否则,将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发布于 2011-04-30 02:34:04
这就是Python的三元运算符(也就是conditional expression)的作用!值得一提的是,Python懒惰地计算布尔值,因此在本例中:
self.default = default if default else type()等同于:
self.default = default or type()如果default的计算结果为任何非False值,则将使用其值,否则将返回type()。
https://stackoverflow.com/questions/5835784
复制相似问题