2011-01-21 42 views
9

Xét đoạn mã sau:Sửa đổi một biến trong một module nhập khẩu sử dụng từ ... nhập khẩu *

#main.py 
From toolsmodule import * 
database = "foo" 

#toolsmodule 
database = "mydatabase" 

Như có vẻ như, điều này tạo ra một biến trong mỗi mô-đun với nội dung khác nhau. Làm thế nào tôi có thể sửa đổi các biến bên trong toolsmodule từ chính? Các nội dung sau không hoạt động:

toolsmodule.database = "foo" 

Trả lời

13

Âm thanh như một lý do khác không tốt để sử dụng from toolsmodule import *.

Nếu bạn chỉ cần làm import toolsmodule, thì bạn có thể làm toolsmodule.database = 'foo' và mọi thứ đều tuyệt vời.

+2

Tôi biết điều này, nhưng tôi sử dụng các biến này rất nhiều, tôi có tên mô-đun dài và tôi muốn tránh việc nhập thêm. – David

+12

Vì vậy, hãy đặt tên mô-đun ngắn: 'nhập longmodulename thành sname'. Bây giờ 'sname' sẽ tham chiếu đến' longmodulename'. – user225312

+4

Nếu bạn không muốn gõ 'toolsmodule' mọi lúc, bạn có thể làm như sau:' import toolsmodule as tm'. Bằng cách này bạn giữ cho không gian tên của bạn lành mạnh và lưu lại cách gõ. – miku

1

Tại sao bạn không làm điều đó như thế:

import toolsmodule 
toolsmodule.database = "foo" 
from toolsmodule import * #bad idea, but let's say you have to.. 
print database #outputs foo 
+0

Khi tôi thử điều này, tôi tin rằng tôi đã không thể sửa đổi biến từ bên trong toolsmodule nữa. Điều này cần được xác minh. – David

7

Trăn tên biến chỉ là nhãn trên các biến. Khi bạn import * tất cả các nhãn đó là cục bộ và khi bạn đặt cơ sở dữ liệu, bạn chỉ cần thay thế biến cục bộ, chứ không phải biến trong công cụ mô-đun. Do đó, làm điều này:

toolsmodule.py:

database = "original" 

def printdatabase(): 
    print "Database is", database 

Và sau đó chạy:

import toolsmodule 
toolsmodule.database = "newdatabase" 
toolsmodule.printdatabase() 

Đầu ra là

Database is newdatabase 

Lưu ý rằng nếu bạn sau đó từ KHÁC mô-đun CŨNG đã thực hiện một thay đổi là import *.

Tóm lại: KHÔNG BAO GIỜ sử dụng from x import *. Tôi không biết tại sao tất cả những người mới vẫn tồn tại trong việc này mặc dù tất cả các tài liệu tôi biết nói rằng đó là một ý tưởng tồi.

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