2009-02-24 25 views

Trả lời

122

Nếu bạn cũng muốn các giá trị bạn có thể sử dụng các mô-đun inspect

import inspect 

def func(a, b, c): 
    frame = inspect.currentframe() 
    args, _, _, values = inspect.getargvalues(frame) 
    print 'function name "%s"' % inspect.getframeinfo(frame)[2] 
    for i in args: 
     print " %s = %s" % (i, values[i]) 
    return [(i, values[i]) for i in args] 

>>> func(1, 2, 3) 
function name "func" 
    a = 1 
    b = 2 
    c = 3 
[('a', 1), ('b', 2), ('c', 3)] 
+9

[blog của Kelly Yancey] (http://kbyanc.blogspot.com/2007 /07/python-aggregating-function-arguments.html) có một bài viết tuyệt vời giải thích chi tiết này và đưa ra một phiên bản hơi tinh tế hơn, plos một so sánh với, ví dụ giải pháp không được biết. Được đề xuất. –

+0

điều gì về 'def foo (thứ nhất, thứ hai, thứ ba, * therest):'? – MeadowMuffins

144

locals() (tài liệu cho Python 2, Python 3) trả về một cuốn từ điển với tên địa phương:

def func(a,b,c): 
    print locals().keys() 

in danh sách các tham số. Nếu bạn sử dụng các biến cục bộ khác, những biến này sẽ được đưa vào danh sách này. Nhưng bạn có thể tạo một bản sao ở đầu chức năng của bạn.

+2

'địa phương in(). Keys()' sẽ trả về '['arg']'. Tôi đã sử dụng 'print locals.get ('arg')' – Droogans

+0

@Droogans vui lòng kiểm tra lại. Các giải pháp từ @unbeknown in '['a', 'b', 'c']' (có thể không theo thứ tự a-b-c), như mong đợi. Giải pháp của bạn (a) không hoạt động, làm tăng một 'AttributeError' - có thể bạn có nghĩa là' in local(). Get ('arg') '? và (b) nếu đó là những gì bạn đang cố gắng làm, in giá trị của tham số, không phải tên của tham số như OP được yêu cầu. –

+8

Cảm ơn bạn! Tôi có một tình yêu mới cho '" tìm thấy {thing} trong {place}, lấy {action}, dẫn đến {result} ". Định dạng (** locals())' thay vì '" tìm thấy {thing} trong {place} Định dạng (điều = điều, vị trí = vị trí, hành động = hành động, kết quả = kết quả) ' –

74
import inspect 

def func(a,b,c=5): 
    pass 

inspect.getargspec(func) # inspect.signature(func) in Python 3 

(['a', 'b', 'c'], None, None, (5,)) 
+1

Đó không phải là bên trong hàm. –

+11

bạn có thể làm điều đó bên trong hàm quá – Oli

+4

điều này thực sự tốt hơn, vì nó cho thấy làm thế nào để có được các thông số của phương pháp bạn không viết cho mình. – Dannid

188

Vâng chúng ta không thực sự cần inspect đây.

>>> func = lambda x, y: (x, y) 
>>> 
>>> func.__code__.co_argcount 
2 
>>> func.__code__.co_varnames 
('x', 'y') 
>>> 
>>> def func2(x,y=3): 
... print(func2.__code__.co_varnames) 
... pass # Other things 
... 
>>> func2(3,3) 
('x', 'y') 
>>> 
>>> func2.__defaults__ 
(3,) 

Đối với Python 2.5 trở lên, sử dụng func_code thay vì __code__, và func_defaults thay vì __defaults__.

+10

sẽ là 'func.func_code.co_varnames [: func.func_code.co_argcount]' vì co_varnames là một bộ gồm tất cả các biến có trong hàm – squirrel

+18

Trong python3, đây sẽ là func .__ code __. Co_varnames – michaelJohn

+0

Cảm ơn bạn rất nhiều @mikeschuldt , bạn nên thêm một trả lời của riêng bạn cho python3 cho khả năng hiển thị – Kethryweryn

Các vấn đề liên quan