2012-06-07 27 views
9

Tôi tạo một từ điển từ cơ sở dữ liệu từ xa như một phần của ứng dụng đang chạy. Quá trình này là khá I/O nặng, vì vậy tôi đã quyết định tạo một ví dụ "singleton" của từ điển này và chỉ cần gọi nó là nó cần thiết trong ứng dụng của tôi.Tại sao mô-đun python hoạt động như một singleton?

Mã này trông giống như (trong Dictionaries.py):

state_code_dict = None 

def get_state_code_dict(): 
    global state_code_dict 
    if state_code_dict == None: 
     state_code_dict = generate_state_code_dict() 
    return state_code_dict 

Sau đó tôi nhập khẩu và gọi get_state_code_dict() chức năng khi cần thiết. Tôi đã thêm một câu lệnh in để kiểm tra xem state_code_dict đã được khởi tạo lại hay sử dụng lại chưa và tôi thấy nó đang được sử dụng lại (đó là chức năng tôi muốn). Tại sao bản sao của state_code_dict vẫn còn tồn tại khi chạy ứng dụng?

Sửa

tôi nhập khẩu các get_state_code_dict chức năng trong nhiều file.

+0

vì mã được nhập chỉ được thực hiện lần đầu tiên? – KurzedMetal

+0

chỉnh sửa để làm rõ: Tôi nhập mã ở nhiều vị trí (nhiều tệp bao gồm chức năng 'get_state_code_dict'. –

+1

Nhập mã mà trình thông dịch đã tải sẽ không tải lại mã đó theo mặc định.Có thể cố tình tải lại một mô-đun nhưng nếu bạn phải làm điều này vì bất kỳ lý do nào khác ngoài vì mã thực sự của mô-đun có thể đã thay đổi trong thời gian chạy, bạn có thể sử dụng một thành ngữ lập trình khác để làm những gì bạn muốn làm. –

Trả lời

16

Đây là mô tả của Python Language Reference của how importing a module works:

(1) tìm thấy một mô-đun, và khởi tạo nó nếu cần thiết ; (2) xác định một tên hoặc tên trong không gian tên địa phương

(Nhấn mạnh thêm.) Ở đây, khởi một module có nghĩa là thực thi mã của nó. Việc thực thi này chỉ được thực hiện nếu cần thiết, tức là nếu mô-đun chưa được nhập trước đó trong quy trình hiện tại. Vì các mô-đun Python là các đối tượng thời gian chạy hạng nhất, chúng có hiệu quả trở thành các trình đơn, được khởi tạo tại thời điểm nhập lần đầu tiên.

Lưu ý rằng điều này có nghĩa là không cần chức năng get_state_dict_code; chỉ khởi state_code_dict ở cấp cao nhất:

state_code_dict = generate_state_code_dict() 

Đối với một sâu hơn giải thích, xem this talk by Thomas Wouters, đặc biệt. phần đầu tiên - khoảng 04:20 - nơi ông thảo luận nguyên tắc "mọi thứ là thời gian chạy".

+0

+1 cho thành ngữ mô-đun đơn giản. –

+0

Sau đó tôi sẽ nhận được state_code_dict bằng cách gọi 'nhập từ điển; state_code_dict = Dictionaries.state_code_dict'? –

+0

@TylerDeWitt: có. Hoặc bằng thành ngữ 'từ Từ điển nhập khẩu state_code_dict'. –

10

Tôi đã bỏ phiếu cho câu trả lời của larsmans, tôi chỉ muốn thêm ví dụ.

hello.py:

hi = 'hello' 

print(hi) 

def print_hi(): 
    print(hi) 

phiên ipython:

In [1]: from hello import print_hi 
hello 

In [2]: print_hi() 
hello 

In [3]: from hello import print_hi 

In [4]: import hello 

In [5]: hello.print_hi() 
hello 


Nhìn rằng nhập khẩu tại dòng 3 và 4 không ra "hello" như nhập khẩu trong dòng 1 đã làm, điều đó có nghĩa là mã không được thực hiện lại.

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