2013-03-26 83 views
2

我想知道是否可以在調用它之前列出Python函數期望的變量,以便從包含大量變量的更大的字典中傳遞期望的變量。Python中函數期望的列表變量?

我搜查了網絡,但找不到任何東西。然而,python解釋器可以顯示預期變量的列表,所以在腳本中肯定有一些方法可以做到這一點?

回答

9

可以使用inspect.getargspec() function

import inspect 

argspec = inspect.getargspec(somefunction) 

argspec是一個名爲元組有4個要素:

  • 與參數名
  • 的包羅萬象*args參數的名稱列表,如果定義(None,否則)
  • 流行的名稱**kwargs第如果定義(None,否則)
  • 具有關鍵字參數默認值的元組;他們與論證的最後一個要素一致;通過默認值元組的長度匹配這些元素。

演示:

>>> import inspect 
>>> def foo(bar, baz, spam='eggs', *monty, **python): pass 
... 
>>> inspect.getargspec(foo) 
ArgSpec(args=['bar', 'baz', 'spam'], varargs='monty', keywords='python', defaults=('eggs',)) 
+0

完美,正是我所需要的!非常感謝您的詳細解釋。但是,您能否詳細解釋一下「默認值」?我無法理解這些可以如何與「args」匹配 – gaborous 2013-03-26 22:18:11

+3

說'len(argspec.defaults)'是3,那麼這些默認屬於'argspec.args'中列出的最後三個參數名稱。在我的例子中,'argspec.defaults'中只有* one *項,因此它屬於'argspec.args',''spam''中的最後一項。如果有2個,那麼它們就會成爲''baz''和''spam''的默認值,等等。 – 2013-03-26 23:20:30

+1

我看到,默認值只是最後n個關鍵字變量的開始,因爲對於非關鍵字變量沒有默認值)必須在關鍵字變量之前聲明。因此無法混淆它們。非常感謝Martijn。 – gaborous 2013-04-04 20:25:39

0

正如一個側面回答,我現在用另一種方式傳遞給函數,他們希望中的變量:我通過他們的。

我的意思是,我保持一種全球性的/我的根對象(這是所有其他對象的父)共享dictionnary的變量,例如:

shareddict = {'A': 0, 'B':'somestring'} 

然後,我只是通過這個字典任何其他對象的任何方法被調用,就像這樣:

shareddict.update(call_to_func(**shareddict)) 

正如你所看到的,我們打開所有在shareddict鍵/值作爲關鍵字參數call_to_func()。我們還更新了返回的結果,我們將在下面看到原因。

本TECHNIC

現在,我可以簡單明瞭地在我的函數定義/方法,如果我需要從這個字典的一個或幾個變量:

my_method1(A=None, *args, **kwargs): 
''' This method only computes on A ''' 
    new_A = Do_some_stuff(A) 
    return {'A': new_A} # Return the new A in a dictionary to update the shared value of A in the shareddict 

my_method2(B=None, *args, **kwargs): 
''' This method only computes on B ''' 
    new_B = Do_some_stuff(B) 
    return {'B': new_B} # Return the new B in a dictionary to update the shareddict 

my_method3(A=None, B=None, *args, **kwargs): 
''' This method swaps A and B, and then create a new variable C ''' 
    return {'A': B, 'B': A, 'C': 'a_new_variable'} # Here we will update both A and B and create the new variable C 

正如你可以看到,上述所有回報的字典的方法的變量,這將更新shareddict,並將傳遞給其他函數。

這TECHNIC有幾個優點:

  • 很容易實現
  • 優雅的方式來維持的變量,但不使用全局變量
  • 函數和方法顯然是一個共享列表,在定義顯示什麼他們預計(但當然一個警告是,甚至強制變量將需要設置爲一個默認值如None的關鍵字參數,這通常意味着變量是可選的,但這裏不是
  • 方法是繼承和重載
  • 低內存佔用,因爲同樣shareddict傳遞一直
  • 孩子們函數/方法定義他們需要什麼,而不是根定義將被傳遞給孩子什麼樣的參數(頂(自下而上)可以非常容易地創建/更新變量
  • 可選地,它非常容易將所有這些變量轉儲到文件中,例如通過使用json.dumps(finaldict,sort_keys = True)。