Tôi đang học Python và vẫn là người mới bắt đầu, mặc dù tôi đã nghiên cứu nó trong khoảng một năm nay. Tôi đang cố gắng viết một mô-đun các hàm được gọi trong một mô-đun chính. Mỗi hàm trong mô-đun được gọi cần mô-đun toán học để chạy. Tôi tự hỏi nếu có một cách để làm điều này mà không cần nhập khẩu các mô-đun toán học bên trong các mô-đun được gọi là. Dưới đây là những gì tôi có:Python: Không gian tên với nhập khẩu mô-đun
main.py
:
from math import *
import module1
def wow():
print pi
wow()
module1.cool()
module1.py
:
def cool():
print pi
Khi chạy main.py
tôi nhận được:
3.14159265359
Traceback (most recent call last):
File "Z:\Python\main.py", line 10, in <module>
module1.cool()
File "Z:\Python\module1.py", line 3, in cool
print pi
NameError: global name 'pi' is not defined
Những gì tôi đang có một thời gian hiểu biết cứng là lý do tôi gặp lỗi tên khi chạy main.py
. Tôi biết rằng biến số pi
trở thành toàn cầu đối với mô đun chính khi nhập vì wow
có thể truy cập nó. Tôi cũng biết rằng cool
trở thành toàn cầu cho mô đun chính khi nhập vì tôi có thể in module1.cool
và nhận <function cool at 0x02B11AF0>
. Vì vậy, kể từ khi cool
nằm trong không gian tên chung của mô-đun chính, không nên chương trình đầu tiên nhìn vào bên trong hàm cool
cho biến pi
và sau đó khi không tìm thấy nó ở đó, hãy xem bên trong main
mô-đun cho biến pi
và tìm thấy nó ở đó?
Cách duy nhất để giải quyết vấn đề này mà tôi biết là nhập mô-đun toán học bên trong module1.py
. Tôi không thích ý tưởng đó, mặc dù bởi vì nó làm cho mọi thứ trở nên phức tạp hơn và tôi là một fan hâm mộ của mã đơn giản, đẹp. Tôi cảm thấy như tôi đang nắm chặt không gian tên, nhưng cần giúp đỡ về cái này. Cảm ơn.
Cảm ơn bạn đã phản hồi. Nếu tôi hiểu bạn một cách chính xác thì, khi tôi gọi "cool" bên trong main.py, trước tiên nó tìm kiếm pi trong chính nó, nhưng không tìm thấy nó, nó sẽ tìm kiếm pi trong module1.py, _not_ main.py, và rõ ràng là không Không tìm thấy nó. Vì vậy, việc tìm kiếm pi trong trường hợp này bị giới hạn trong không gian tên chung của module1 và không thể truy cập vào không gian tên chung của chính. Thê nay đung không? – SpencerAAA
@ SpencerAAA: Đó là một sự đơn giản hóa quá mức, nhưng chỉ một chút, và nó phù hợp với tất cả các bộ phận liên quan. Xem [Đặt tên và ràng buộc] (http://docs.python.org/2/reference/executionmodel.html#naming-and-binding) để biết chi tiết đầy đủ. – abarnert
@ SpencerAAA: Trên thực tế, bạn cần nhiều hơn một chút so với phần đó để có được tất cả các chi tiết. Tóm lại: tại thời điểm định nghĩa 'cool' được đánh giá, Python xác định rằng' pi' không phải là cục bộ (có nghĩa là, tự do trong phạm vi của hàm), và biên dịch hàm thành 'print_item (globals() ('pi')) '. (Nếu bạn hiểu, hoặc sẵn sàng học, CPython bytecode, hãy thử 'import dis' và' dis.dis (cool) 'để xem _exactly_ nó làm gì.) Sau đó, tìm kiếm' globals' là những gì tuân theo các quy tắc cho tra cứu toàn cầu trong Đặt tên và ràng buộc. – abarnert