2010-11-10 53 views
-1

舉一個簡單的例子,我不關心實用性,只是實現。假設我用幾種方法創建了一些類。我想創建一個包含它們是否可以被調用的列表。所以,我可以拿這個例子: Finding what methods an object has如何使用帶有不可迭代且可迭代的參數集的pythons映射?

[method for method in dir(object) if callable(getattr(object, method))] 

這是偉大的它做什麼,但如果它的心裏很不舒服,我想用地圖和我有對象,這是一種非迭代的項目。 ..

map(callable,map(getattr,object,dir(object))) 

要着眼於現實的問題:

我有一個迭代列表,以及非可迭代的項目。什麼是最好的解決方案,讓我使用一些不可迭代的項目和一個可迭代的項目,以便我可以利用地圖?

+0

我不知道你你在問什麼,你想做什麼。 – Falmarri 2010-11-10 22:38:20

+0

@Falmarri:你並不孤單。這似乎更像是一個謎語,而不是一個問題。 – 2010-11-10 22:49:06

回答

2

我會承認不理解爲什麼,因爲LC工作,但:

map(lambda x: callable(getattr(object, x)), dir(object)) 
+0

太棒了。正是我想要的。感謝:) – pyInTheSky 2010-11-10 22:42:51

+0

不同的應用程序,我只是把它作爲一個例子。我想使用帶有幾個不可迭代項目的地圖。 – pyInTheSky 2010-11-10 22:48:47

+0

問題的主要原因是嘗試一些優化。有趣的是,當通過更長的序列時,LC實際上更快。 – pyInTheSky 2010-11-11 16:54:44

0

如果你沒有什麼上面的拉姆達不明確,等效你可以定義:

def myMap(fun1,obj,iterlist): 
     def fun2(x): 
      return fun1(obj,x) 
     return map(fun2,iterlist) 

然後調用

map(callable,myMap(getattr,object,dir(object))) 

例如:

map(callable,myMap(getattr,myMap,dir(myMap))) 

儘管使用lambda更爲pythonic。

+0

「儘管使用lambda更加pythonic。」 ...根據誰? – detly 2010-11-10 23:39:36

0

有時LC只是以正確的方式做到這一點

>>> from itertools import izip, repeat, starmap 
>>> map(callable, starmap(getattr, zip(repeat(object), dir(object)))) 

這也適用,但需要dir(object)兩次

>>> map(callable, map(getattr, repeat(object, len(dir(object))), dir(object))) 

最後

>>> from itertools import izip_longest 
>>> map(callable, starmap(getattr, izip_longest([], dir(object), fillvalue=object)))