2011-07-08 6 views
20

Tôi muốn truy xuất các biến cục bộ từ Python từ một hàm được gọi. Có cách nào để làm điều này không? Tôi nhận ra điều này là không đúng đối với hầu hết các chương trình, nhưng về cơ bản tôi đang xây dựng một trình gỡ lỗi. Ví dụ:Nhận người dân địa phương gọi không gian tên trong Python

def show_locals(): 
    # put something in here that shows local_1. 

local_1 = 123 
show_locals() # I want this to show local_1. 

Tôi đặt gì trong phần ? Nếu tôi phải sửa đổi tuyên bố gọi điện thoại, sửa đổi tối thiểu tôi có thể thực hiện là gì?

Lưu ý: điều này phải hoạt động khi nằm trong mô-đun khác cho người gọi.

Trả lời

51

Nếu bạn đang viết một trình gỡ lỗi, bạn sẽ muốn tận dụng nặng nề của các mô-đun inspect:

def show_callers_locals(): 
    """Print the local variables in the caller's frame.""" 
    import inspect 
    frame = inspect.currentframe() 
    try: 
     print(frame.f_back.f_locals) 
    finally: 
     del frame 
+1

đẹp, đẹp. – Peter

+0

Siêu hữu ích. Cảm ơn. –

+0

Yay! Tôi tìm thấy giải pháp của bạn sau khi chạy vào các vấn đề hiệu suất đáng kể với một giải pháp thay thế: 'caller = inspect.stack() [1] [0]; myvars = caller.f_locals'. Cách của bạn là MUCH nhanh hơn. – TheGerm

-1

Bạn sử dụng được xây dựng trong python, dir() hoặc vars():

vars (object)

Đối với ví dụ sử dụng dir(), xem: this post

Ví dụ sử dụng vars:

>>> class X: 
...  a=1 
...  def __init__(self): 
...   b=2 
... 
>>> 
>>> vars(X) 
{'a': 1, '__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x100488848>} 
>>> 
>>> vars(X()) 
{} 

Một thực tế có khả năng có vấn đề: các lớp học kiểu mới không trả lại kết quả tương tự

>>> class X(object): 
...  a=1 
...  def __init__(self): 
...   b=2 
... 
>>> 
>>> vars(X) 
<dictproxy object at 0x1004a1910> 
>>> vars(X()) 
{} 

Ngoài ra: đối với một lớp được thuyết minh (phong cách mới và cũ), nếu bạn thêm một biến sau instantiating, vars sẽ trở lại của đối tượng dict như thế này:

>>> x = X() 
>>> x.c = 1 
>>> vars(x) 
{'c': 1} 
>>> 

Xem: http://docs.python.org/library/functions.html#vars

+2

Điều này không trả lời câu hỏi, OP muốn các oppersite nơi bên trong của func_1, nếu bạn gọi func_2 bạn có thể thấy tất cả người dân địa phương từ func_1. – PsyKzz