2012-06-15 52 views
1

請你看看下面的代碼,id是一個python內建函數嗎?

def getCrewListAll(self): 
    """ 
    Set to crew list to all available crew 
    """ 
    crew = getIdNumbers() 
    return map(lambda cr: cr.id, crew) 

什麼是cr.id這裏的意思,是id一個內置Python函數或?

+7

有一個名爲「內置函數」在Python文檔的頁面:http://docs.python.org/library/functions .html#id – derekerdmann

+0

這是特定於你從這個代碼獲得的任何庫。 – jdi

+0

您是否檢查過 - 或者您能夠檢查 - 定義了getIdNumbers()的代碼? –

回答

6

在您的示例中,對cr.id的引用不是函數調用。它訪問變量cr成員屬性,該變量是任何crew對象的佔位符。

idis the name of a builtin function,是的。但是沒有辦法知道它是否在這些對象的引擎下使用,而沒有看到實際的類定義。

作爲一個例子...如果這是一個Django應用程序,模型實例具有id成員屬性,該屬性爲您提供該記錄的數據庫ID。它是該框架類的設計的一部分。

即使我假設它的一個屬性......對於我們所知道的所有情況,它也可能是一個computed property,它與類似於屬性的方法調用類似。在查看你的例子時,它可能會做更多的邏輯。

最後,由於cr.id可以是任何東西,甚至有可能是一個方法,該地圖便返回可調用的LIS:cr.id()

+0

@ samy.vilar:我提到了屬性的可能性。但是,就最終用戶如何應用它而言,它不是一個函數調用。它根據屬性的設計在引擎蓋下調用一個函數。 – jdi

+0

對於downvoter:爲什麼downvote? –

+0

@ ms4py:你看不到lambda包裝函數? –

1

有一個內置的id函數,但可能會或可能不會與此有關,具體取決於該對象的實現,無論哪種方式id這裏是該對象的成員/屬性。

如果你是好奇,看看有什麼成員樣/字段對象有,你可以做dir(crew[0])假設其重新調諧至少一個,如果它的正確記錄,你也可以做到這一點help(crew[0].id)

+0

關於這個問題,答案是非常不清楚的。在這種情況下顯示'help(id)'只是令人困惑。 – schlamar

+0

是的,我認爲你的權利。 –

+1

通常人們認爲a.id意味着只是獲得那個價值而沒有別的東西,對吧?但是如果它的屬性那麼它不僅僅是得到那個價值,它可能意味着打開一個文件,解析它,更新它並午餐核武器以及你的想法...;) –

4

cr.id不是內建函數(除非你已經指定它......),它是那裏的對象的普通成員。

id(cr)將是該內建的調用並且將返回cr的標識。

+0

但它不是cr.id()。在它之後它怎麼沒有派生物? – alwbtc

+0

@alwbtc:在你的例子中沒有括號?這將表明cr的**成員屬性**是'id'。不是功能 – jdi

+0

是不是一個「方法」的功能?他們之後不需要功能嗎? – alwbtc

2

我覺得這裏真正的問題是,你不瞭解你發佈的代碼。 在這種情況下,您需要了解maplambda

map是應用一個函數列表的每個元素,並返回此作爲一個列表的函數:

>>> def func(a): 
... return a * 2 
... 
>>> map(func, [1,2,3]) 
[2, 4, 6] 

lambda可以被看作是一個快捷方式來創建函數。上述可以與lambda寫成:

>>> func = lambda a: a * 2 
>>> map(func, [1,2,3]) 
[2, 4, 6] 

那麼你的代碼map(lambda cr: cr.id, crew)做:它返回從每個對象的列表crew id屬性的列表。

問題是這段代碼其實不太好。你可以寫一個list comprehension相同的功能,這是更爲直觀:

def getCrewListAll(self): 
    return [cr.id for cr in getIdNumbers()] 
+0

如果他不知道地圖你認爲他知道列表理解的? –

+1

不,但鏈接的教程非常好,特別是對於這個話題。如果OP在SO上提出問題,他應該有學習新內容的動力。 – schlamar

+0

+1,因爲他應該有學習新東西的動力。 –

相關問題