2012-10-16 32 views
6

Theo tài liệu Python, cả hai dir() (không có args) và locals() đánh giá vào danh sách các biến trong một cái gì đó gọi là local scope. Đầu tiên trả về danh sách các tên, thứ hai trả về một từ điển của các cặp tên-giá trị. Đó có phải là sự khác biệt duy nhất không? Điều này luôn hợp lệ?Bất kỳ sự khác biệt nào giữa dir() và locals() bằng Python?

assert dir() == sorted(locals().keys()) 
+0

Bạn đang cố giải quyết vấn đề gì? Tại sao bạn cần phải biết? – phant0m

+1

Tôi cần biết kiến ​​trúc ngôn ngữ để viết mã tốt hơn. Câu hỏi chính xác là 'chức năng nào cần sử dụng để kiểm tra xem một số biến được định nghĩa trong phạm vi cục bộ'. – grigoryvp

Trả lời

5

Kết quả của dir() khi được gọi là không có đối số là gần như tương tự như locals(), nhưng dir() trả về một danh sách các chuỗi và locals() trả về một cuốn từ điển và bạn có thể cập nhật từ điển đó để thêm biến mới.

dir(...) 
    dir([object]) -> list of strings 

    If called without an argument, return the names in the current scope. 


locals(...) 
    locals() -> dictionary 

    Update and return a dictionary containing the current scope's local variables. 

Loại:

>>> type(locals()) 
<type 'dict'> 
>>> type(dir()) 
<type 'list'> 

Update hoặc thêm các biến mới sử dụng locals():

In [2]: locals()['a']=2 

In [3]: a 
Out[3]: 2 

sử dụng dir(), tuy nhiên, điều này không làm việc:

In [7]: dir()[-2] 
Out[7]: 'a' 

In [8]: dir()[-2]=10 

In [9]: dir()[-2] 
Out[9]: 'a' 

In [10]: a 
Out[10]: 2 
+3

Do cách Python tối ưu hóa truy cập vào các biến cục bộ trong các hàm, thường không thể thay đổi các biến cục bộ bằng cách sử dụng từ điển 'locals()', đó là lý do tại sao tài liệu cảnh báo chống lại nó. – kindall

+1

@kindall là đúng - bạn nên xem xét 'locals()' chỉ đọc. – DSM

0

câu hỏi chính xác là 'hàm nào để sử dụng để kiểm tra xem một số biến được định nghĩa trong phạm vi địa phương.

Tiếp cận một biến không xác định bằng Python đặt ra một ngoại lệ:

>>> undefined 
NameError: name 'undefined' is not defined 

Cũng giống như bất kỳ ngoại lệ khác, bạn có thể bắt nó:

try: 
    might_exist 
except NameError: 
    # Variable does not exist 
else: 
    # Variable does exist 

Tôi cần phải biết kiến ​​trúc ngôn ngữ để viết mã tốt hơn.

Điều đó sẽ không làm cho mã của bạn tốt hơn. Bạn nên không bao giờ biến mình thành một tình huống mà một điều như vậy là bắt buộc, nó hầu như luôn là phương pháp sai lầm.

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