2008-09-28 42 views
60

Tôi đã đọc một câu hỏi về câu hỏi toàn cầu toàn cầu ("Python scope") và tôi đã ghi nhớ về mức độ thường xuyên sử dụng câu lệnh này khi tôi là người mới bắt đầu Python (tôi đã sử dụng toàn cầu nhiều) và như thế nào , Tôi không sử dụng nó cả. Tôi thậm chí còn xem xét nó một chút "un-pythonic".
Bạn có sử dụng câu lệnh "chung" trong Python không?

Bạn có sử dụng câu lệnh này bằng Python không? Việc bạn sử dụng nó có thay đổi theo thời gian không?

Trả lời

15

Tôi chưa bao giờ sử dụng hợp pháp cho tuyên bố trong bất kỳ mã sản xuất nào trong hơn 3 năm sử dụng Python chuyên nghiệp và hơn năm năm là một người có sở thích Python. Bất kỳ trạng thái nào tôi cần phải thay đổi nằm trong các lớp hoặc, nếu có một số trạng thái "toàn cục", nó nằm trong một số cấu trúc được chia sẻ như một bộ nhớ cache chung.

1

Một hoặc hai lần. Nhưng nó luôn luôn là điểm khởi đầu tốt để tái cấu trúc.

0

Nếu tôi có thể tránh nó, không. Và, với kiến ​​thức của tôi, luôn luôn có một cách để tránh nó. Nhưng tôi không nói rằng nó hoàn toàn vô dụng hoặc là

3

Đối tượng là cách được ưu tiên để có trạng thái không phải là địa phương, vì vậy toàn cầu hiếm khi cần thiết. Tôi không nghĩ rằng sửa đổi nonlocal sắp tới sẽ được sử dụng rộng rãi hoặc là, tôi nghĩ rằng nó chủ yếu là có để làm cho lispers ngừng phàn nàn :-)

8

Theo tôi, ngay khi bạn cảm thấy cần phải sử dụng biến toàn cầu trong một con trăn mã, đây là thời điểm tuyệt vời để dừng lại một chút và làm việc để tái cấu trúc mã của bạn.
Đặt mã số global vào mã và trì hoãn quá trình tái cấu trúc có thể có vẻ đầy hứa hẹn nếu đường chết của bạn gần, nhưng, hãy tin tôi, bạn sẽ không quay lại vấn đề này trừ khi bạn thực sự phải - như mã của bạn đã dừng làm việc cho một số lý do lẻ, bạn phải gỡ lỗi nó, bạn gặp phải một số những biến số global và tất cả những gì họ làm là những thứ lộn xộn lên.

Vì vậy, một cách trung thực, ngay cả khi được phép, tôi cũng có thể tránh sử dụng nó. Ngay cả khi nó có nghĩa là một lớp học đơn giản xây dựng xung quanh đoạn mã của bạn.

2

Tôi tránh điều đó và thậm chí chúng tôi có quy tắc pylint cấm điều đó trong mã sản xuất của chúng tôi. Tôi thực sự tin rằng nó thậm chí không nên tồn tại.

54

tôi sử dụng 'toàn cầu' trong một bối cảnh như thế này:

_cached_result = None 
def myComputationallyExpensiveFunction(): 
    global _cached_result 
    if _cached_result: 
     return _cached_result 

    # ... figure out result 

    _cached_result = result 
    return result 

tôi sử dụng 'toàn cầu' bởi vì nó có ý nghĩa và là rõ ràng đối với người đọc của hàm những gì đang xảy ra. Tôi cũng biết có mẫu này, tương đương, nhưng đặt nhiều tải nhận thức hơn lên đầu đọc:

def myComputationallyExpensiveFunction(): 
    if myComputationallyExpensiveFunction.cache: 
     return myComputationallyExpensiveFunction.cache 

    # ... figure out result 

    myComputationallyExpensiveFunction.cache = result 
    return result 
myComputationallyExpensiveFunction.cache = None 
+15

Tôi có xu hướng sử dụng chức năng 'memoize' module trang trí trong các trường hợp như thế này nhưng tôi không thể lỗi rõ ràng của việc sử dụng toàn cầu của bạn :) –

+6

tôi không biết về khả năng xác định một thuộc tính của một hàm như myComputationallyExpensiveFunction.cache và sử dụng nó bên trong phần thân hàm, cảm ơn! –

+2

Tôi chưa bao giờ nghe nói về việc gán một thuộc tính cho một hàm, đó là công cụ tuyệt vời! Cảm ơn! – brad

2

Hiếm khi. Tôi đã không tìm thấy một sử dụng cho nó cả.

2

Nó có thể hữu ích trong các chủ đề để chia sẻ trạng thái (với các cơ chế khóa xung quanh nó).

Tuy nhiên, tôi hiếm khi sử dụng nó.

2

Tôi đã sử dụng nó nhanh chóng & các tập lệnh đơn lẻ, sử dụng một lần để tự động hóa một số tác vụ một lần. Bất cứ điều gì lớn hơn thế, hoặc cần phải được tái sử dụng, và tôi sẽ tìm thấy một cách thanh lịch hơn.

3

tôi sử dụng nó cho các tùy chọn toàn cầu với các kịch bản dòng lệnh và 'optparse':

tôi main() phân tích các đối số và vượt qua những để bất cứ chức năng thực hiện công việc của các kịch bản ... nhưng viết được cung cấp các tùy chọn cho từ điển 'opts' toàn cầu.

Tùy chọn kịch bản lệnh thường chỉnh sửa hành vi 'lá', và thật bất tiện (và không cần thiết) để tạo từ điển 'opts' thông qua mọi danh sách đối số.

9

Tôi đã sử dụng nó trong trường hợp một hàm tạo hoặc đặt các biến sẽ được sử dụng trên toàn cầu. Dưới đây là một số ví dụ:

discretes = 0 
def use_discretes(): 
    #this global statement is a message to the parser to refer 
    #to the globally defined identifier "discretes" 
    global discretes 
    if using_real_hardware(): 
     discretes = 1 
... 

hoặc

file1.py: 
    def setup(): 
     global DISP1, DISP2, DISP3 
     DISP1 = grab_handle('display_1') 
     DISP2 = grab_handle('display_2') 
     DISP3 = grab_handle('display_3') 
     ... 

file2.py: 
    import file1 

    file1.setup() 
    #file1.DISP1 DOES NOT EXIST until after setup() is called. 
    file1.DISP1.resolution = 1024, 768 
Các vấn đề liên quan