做什么“自我违约=default else type()“平均值?

2024-09-19 23:35:59 发布

您现在位置: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()

有人能解释一下代码的最后一行在做什么吗?在

我希望这个问题不要太琐碎,因为我很难想出一个好的标题。在


Tags: 项目django代码nameselfnonedefaultnet
3条回答

这就是Python的三元运算符(aka conditional expression)在起作用!值得一提的是,Python对布尔值的求值是懒惰的,因此在本例中:

self.default = default if default else type()

相当于:

^{pr2}$

如果default的计算结果为任何非False值,则将使用其值,否则它将落入type()。在

在函数签名中可以看到default=None-这意味着如果没有传入第三个参数,default将等于None。在

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

我天真地说是因为default可能是0,也可能是{},或者(更有可能)它可能是一个对象,但该对象的计算结果是False。我宁愿

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

或者,为了避免我觉得世界上最清楚的条件表达

^{pr2}$

a if b else c是一个条件表达式,如果b的计算结果为a,否则为c。在给定的上下文中,它检查default是否是{a1},在这种情况下,它存储在self.default中。否则,将创建type的新实例并在self.default中存储。在

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

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

  2. 它使用条件if default,实际上应该使用if default is None。该检查旨在测试参数default是否实际传递给了构造函数。实际上,实现不会接受evaluates to ^{}的任何默认值。

相关问题 更多 >