2013-01-03 26 views
5

Tôi hiện có mã như thế này:Một thay thế cho toàn cầu trong Python

cache = 1 
def foo(): 
    global cache 
    # many 
    # lines 
    # of code 
    cache = 2 

Tuy nhiên, điều này có thể dẫn đến khó tìm-lỗi trong tương lai, bởi vì người đọc không thể nhận thấy rằng global cache xuất hiện ở đâu đó trên cache = 2. Ngoài ra, người đóng góp có thể nhầm thêm def bar(): cache = 2 và quên thêm global cache.

Làm cách nào để tránh sự cố này?

+1

Chính xác thì lỗ hổng là gì? Bạn đang cố gắng làm gì, và cái gì không hiệu quả? – BrenBarn

+0

Nếu ai đó viết phương pháp thứ hai thì sao? Nó vẫn sẽ là một biến cục bộ. Không có vấn đề với mã của bạn. – ATOzTOA

+2

Nếu không có khai báo 'global', thì biến là local - nếu 'người đọc' có bất kỳ nền nào trong python, thì họ sẽ biết nó là local. Nếu bạn thực sự muốn, chỉ cần thêm một bình luận nói rằng đó là địa phương hoặc một cái gì đó. – Volatility

Trả lời

12
class Cache: 
    myvar = 1 

def foo(): 
    Cache.myvar = 2 

Bằng cách này, Cache.myvar thực chất là "toàn cầu". Có thể đọc/ghi nó từ bất cứ đâu.

Tôi thích tùy chọn này hơn từ điển thay thế, vì nó cho phép tự động hoàn thành tên biến.

+1

Câu trả lời tuyệt vời, thanh lịch và chính xác những gì tôi đang tìm kiếm! Cảm ơn bạn –

8
cache = 1 
def foo(): 
    return 2 
cache = foo() 

hoặc

d = {'cache': 1} 
def foo(x): 
    x['cache'] = 2 
foo(d) 
3

"người đọc có thể vô tình nghĩ rằng biến toàn cầu đã được cập nhật" là không nhiều của một cái bẫy. Bạn phải mong đợi rằng mọi người đọc mã của bạn biết cách Python hoạt động. Nếu bạn muốn làm cho nó rõ ràng hơn, sử dụng một bình luận. Đó là những gì họ đang cho.

2

Sử dụng biến toàn cục không phải là phương pháp lập trình tốt. Vượt qua biến như một đối số: làm cho hàm trả về một cái gì đó và sử dụng nó trong một hàm khác. Chức năng có thể được gán cho biến đó là cách Python hoạt động.

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