2011-04-29 148 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()

相關問題