2012-11-15 86 views
1

是否有可能在Python中將函數調用分解爲函數及其參數列表?例如,採取func(1,4,True)並將其變爲[func, 1, 4, True]或類似的東西。理想情況下,我想爲任意函數執行此操作。Python - 拆分函數調用函數和參數

編輯:我是編程課程的助教,目的是檢查學生在代碼中包含哪些測試用例。我想看看學生爲了確保他們正確地測試了代碼而給他們的代碼添加了什麼樣的價值。我們讓學生在編寫測試時使用比較函數(它們從模塊導入),所以我希望編輯比較函數以檢查它們包含的測試用例。

我對如何達到相同的最終結果有一些其他想法(例如以文本形式讀取代碼或將學生代碼複製到具有func的不同定義的新文件),但兩者都涉及更多的工作,並且比重新定義比較功能更有潛在的問題。

+0

是。你有什麼嘗試? – Marcin

+2

你能否更詳細地解釋你想要做什麼?我不明白這個問題。函數* call *不是一個對象,所以就我所知,談論分裂它並不是非常有意義。 –

+0

在解析時間或執行時間? –

回答

3

您的問題的直接回答是,因爲函數調用不是一個對象,而是一個語句。

要獲得任何功能的信息,如它的名字,它的參數等,可以用一些屬性和方法附加到每個功能:

>>> def foo(a,b): 
... print a,b 
... 
>>> foo.func_name 
'foo' 
>>> foo.func_code.co_varnames 
('a', 'b') 

鍵入dir(funcname)會給你更多的東西去探索。

如果您想知道函數的工作方式,調用時如何分配參數以及其他此類調查性故障排除 - 有inspect module

0
call = [func, 1, 4, True] 
f,args = call[0],call[1:] 
result = f(*args) 
+0

這是迄今爲止發佈的最相關答案,但這似乎仍不能回答問題。提問者說他​​想要'取''func(1,4,True)'和'*將它變成*'[func,1,4,True]'(不管他的意思是什麼)。你所做的是另一種方式。 –

+1

哈,我喜歡它。好的Marcin。 –

+0

@MarkAmery這會通知函數。 – Marcin

2

如何定義一個裝飾:

def func_call_decorator(func): 
    def _wrapper(*args, **kwargs): 
     ret = func(*args, **kwargs) 
     return [func]+list(args)+kwargs.items() + [ret] 
    return _wrapper 

@func_call_decorator 
def foo(a,b): 
    return a+b 

print foo(2,3) 

主要生產:

[<function foo at 0x10045f5f0>, 2, 3, 5] 

我還附上了函數的返回值給定的參數作爲列表的最後一個元素。

我不知道什麼是你的使用情況......