2016-09-17 47 views
2

在Python測試夾具中,是否可以計算函數在其正文中聲明多少個局部變量?是否可以檢測函數中聲明的局部變量的數量?

def foo(): 
    a = 1 
    b = 2 

Test.assertEqual(countLocals(foo), 2) 

或者,有沒有辦法看看一個函數是否聲明瞭任何變量呢?

def foo(): 
    a = 1 
    b = 2 

def bar(): 
    pass 

Test.assertEqual(hasLocals(foo), True) 
Test.assertEqual(hasLocals(bar), False) 

我想到的用例與驗證用戶提交的代碼有關。

回答

8

是,相關的代碼對象佔該co_nlocals屬性所有本地名稱:

foo.__code__.co_nlocals 

演示:

>>> def foo(): 
...  a = 1 
...  b = 2 
... 
>>> foo.__code__.co_nlocals 
2 

Datamodel documentation

用戶自定義功能

[...]

__code__表示編譯函數體的代碼對象。

代碼對象

[...]

特殊只讀屬性:[...]co_nlocals是函數使用的局部變量的數量(包括參數); [...]

1

要在@Martijn優秀的答案多少有些語焉不詳,如果你讀了inspect — Inspect live objects模塊的文檔,你可以看到,它允許大量的數據,包括內省(如@ Martijn指出)在code類型中,具有以下屬性:

co_names tuple of names of local variables 
co_nlocals number of local variables 
相關問題