2011-06-14 24 views
8

Tôi đang cố gắng nhập một mô-đun từ bên trong một hàm và có sẵn cho toàn bộ tệp của tôi giống như cách tôi nhập vào bên ngoài bất kỳ hàm nào và trước tất cả các mã khác. Lý do nó nằm trong một hàm là bởi vì tôi không có nhiều quyền kiểm soát cấu trúc của tập lệnh. Điều này có thể xảy ra nếu không sử dụng những thứ như hack __builtin__ hoặc chuyển những gì tôi cần xung quanh mã của tôi?Có thể nhập vào phạm vi toàn cục từ bên trong một hàm (Python) không?

+2

Đừng làm điều đó nếu bạn quan tâm đến người tiếp theo phải đọc mã của bạn (có thể là chính bạn). Có vẻ như bạn đang sử dụng thực hành tổ chức kém như một cái cớ để thực hành mã hóa kém; cố gắng sửa chữa nguyên nhân gốc rễ. – msw

+1

Tôi đang sửa đổi một dự án mã nguồn mở và cố gắng thay đổi mức tối thiểu tuyệt đối cần thiết. – scott77777

+3

Vì vậy, bằng cách cố gắng thay đổi mức tối thiểu cần thiết, bạn sẽ làm cho nó không thể hiểu được đối với tất cả những người đóng góp khác. Đó là một sự đánh đổi kém. – msw

Trả lời

9

Làm thế nào về một cái gì đó giống như globals()["os"] = __import__("os")?

Tôi đoán đây có thể được bọc trong một hàm tổng quát nếu bạn muốn vì tên mô-đun là một chuỗi.

+0

Điều này là tốt vì chỉ mục có thể được sử dụng để mô phỏng hành vi "nhập dưới dạng" không phải là (tôi tin) được xây dựng trong '__import __()'. Nó chỉ ra rằng điều này không giải quyết vấn đề của tôi, nhưng nó trả lời câu hỏi tôi hỏi. – scott77777

7

Xem nhận xét mới của bạn, tôi muốn nhấn mạnh rằng điều này nghe có vẻ không cần thiết. Bạn đang thực sự sửa đổi tập lệnh nhiều hơn bằng cách nhập trong một hàm bằng cách nhập ở đầu tập lệnh theo cách thông thường. Tuy nhiên, theo tinh thần trả lời câu hỏi, tôi để lại câu trả lời trước của tôi.


Tôi thành thật không chắc chắn đây là cách chính xác để làm điều này, nhưng một kiểm tra nhanh chóng khẳng định rằng nếu bạn khai báo tên mô-đun như global trong chức năng trước khi nhập khẩu, nó được nhập khẩu vào không gian tên toàn cầu.

>>> def import_re(): 
...  global re 
...  import re 
... 
>>> re 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 're' is not defined 
>>> import_re() 
>>> re 
<module 're' from '/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/re.pyc'> 

Đừng làm điều này trừ khi bạn thực sự phải - rồi viết nó bằng chữ màu đỏ lớn, để nói.

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