2011-04-29 151 views
1

自从我开始工作(〜6年)以来,我一直都是.NET家伙。最近,我正在使用Django开发一个项目,这需要我并行学习Python。很多时候我碰到Python代码看起来很简单,但我无法理解。这是其中之一。什么是“self.default =默认,如果默认其他类型()”是什么意思?

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

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

我希望这个问题不是微不足道的,因为我很难为它提供一个好的标题。

+0

我认为最后一行应该缩进为\ _ \ _ init \ _ \ _方法的一部分 – Noah 2011-04-29 18:33:22

+0

看起来像一个缩进错误..我想最后一行应该与它的前一行对齐(即缩进8个空格)。 – 2011-04-29 18:34:12

+0

对缩进不太确定。 我直接从本书“Python Essential Reference” – tamakisquare 2011-04-29 18:40:00

回答

6

a if b else c是条件表达式,其值如果ab的计算结果为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其他“falsy”值包括零,空字符串和空集合。所以通常最好使用'如果arg不是None:x = default',除非你确切地知道你想排除这些。 – delnan 2011-04-29 18:29:00

4

在你看到default=None函数签名 - 这意味着,如果第三个参数未通过,default将等于None

最后一行天真地检查以确定default的计算结果是否为真,以确定是否传入了默认值。如果default为true,则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 
+0

+1即使括号是多余的,我个人也会把它写成'self.default = default if(默认不是None)else type()',但它比4行版本的冗余性要少,但比1没有parens的线。 – Davy8 2011-04-29 18:34:14

1

也就是说在行动Python的三元运算符(又名conditional expression)!东西没什么看头就是,Python懒洋洋地评估布尔值,所以在这种情况下:

self.default = default if default else type() 

等效于此:

self.default = default or type() 

如果default计算为任何非假值,将使用它的值,否则会跌落至type()

相关问题