2014-01-11 55 views
0

我試圖創建一個包含已由不同函數處理的數據的列表。下面的代碼無法正常工作,因爲這兩個函數a和b是不是地圖功能在地圖中使用本地函數時的Python值錯誤

def outer_func(): 
    def a(): 
     return "Something" 
    def b(): 
     return "Something else" 
    map(lambda x: eval(x)(), ['a', 'b']) 

我想在一個類中封裝功能的範圍內,和下面的代碼工作得很好。

class fcontainer(): 
    def a(self): 
     return "Something" 

    def b(self): 
     return "Something else" 

def test(): 
    f = fcontainer() 
    return map(lambda x: getattr(f, x)(), ['a', 'b']) 

現在,我的問題是:

  1. 爲什麼A和B的地圖功能中不存在?
  2. 有沒有一種「正確」的方式來做我想做的事情?
  3. 我是否應該最終坐下來圍繞裝飾者來包裹頭部? :)

謝謝!

UPDATE:第一個例子可製成通過首先獲取的功能而outer_func的範圍之內,並且然後使用地圖的工作:

functions = [eval(i) for i in ['a', 'b']] 
return map(lambda x: x(), functions) 

這工作,但它的兩條線,而不是一個>: |

回答

4

是否需要列出字符串(['a', 'b'])?也許你最好把函數對象直接放到列表中:[a, b]

return map(lambda x: x(), [a, b]) 

對我來說似乎很容易。

如果你想這樣做的裝飾,它不會是容易得多:

def outer_func(): 
    funcs = [] 
    def funcapp(func): # so that a and b are still in place... 
     funcs.append(func) 
     return func 
    @funcapp 
    def a(): 
     return "Something" 
    @funcapp 
    def b(): 
     return "Something else" 
    return funcs 
+0

爲什麼要打擾你自己的班級? '@ myList.append' – Eric

+0

@Eric有時我們傾向於監督最簡單的事情。謝謝。 – glglgl

+0

話雖如此,使用'@ myList.append'導致'a'爲'None',但在這種情況下並不重要 – Eric

1

你需要確保eval執行正確的背景下,通過給它裏面outer_func()globalslocals

def outer_func(): 
    def a(): 
     return "Something" 
    def b(): 
     return "Something else" 
    map(lambda x, g=globals(), l=locals(): eval(x, g, l)(), ['a', 'b']) 

話雖如此,eval可能不是解決您的問題

+0

感謝您的回答!我從來沒有理解在現在之前必須提供當地人作爲eval的論點。 – onkel

0

在Python中,我們有一個特殊的功能,您可以通過一個功能就像一個變量。

您的第一個方法是正確的差不多..稍稍偏出:)

>>> def outer_func(): 
...  def a(): 
...   return "Something" 
...  def b(): 
...   return "Something else" 
...  print map(lambda x: x(), [a, b]) 
... 
>>> outer_func() 
['Something', 'Something else'] 

EVAL真的很不錯,但像你面對,它的

風險如果使用這種對於你的第二個方法,它會工作。

>>> def test(): 
...  f = fcontainer() 
...  return map(lambda x: x(), [f.a, f.b]) 
... 
>>> test() 
['Something', 'Something else'] 

現在,您的問題:

Q1。爲什麼a和b不能在map函數中存在?

MAP功能很特別。它不會影響範圍之外的事情。這使得它更快。檢查下面的代碼來理解。

>>> dir() # used to check local variables/function defined already. 
['__builtins__', '__doc__', '__name__', '__package__', 'outer_func'] 
>>> map(lambda x: dir() , range(5)) 
[['x'], ['x'], ['x'], ['x'], ['x']] 
>>> # as you can see within MAP, outer_func is missing. 

Q2。有沒有一種「正確」的方式來做我想做的事情?

還有一個更簡單的方法來做到這一點:)

Q3。我是否應該最終坐下來圍繞裝飾者進行包裝?

我想你現在已經得到了答案。所以現在沒有裝飾

希望這可以幫助你:)

相關問題