2010-02-22 41 views
12

Do tôi có đối tượng mã cho mô-đun, làm cách nào để nhận đối tượng mô-đun tương ứng?Cách tạo đối tượng mô-đun từ đối tượng mã trong Python

Có vẻ như moduleNames = {}; exec code in moduleNames thực hiện điều gì đó rất gần với những gì tôi muốn. Nó trả về các globals được khai báo trong module thành một từ điển. Nhưng nếu tôi muốn các đối tượng mô-đun thực tế, làm thế nào để tôi nhận được nó?

EDIT: Dường như bạn có thể cuộn đối tượng mô-đun của riêng mình. Các loại mô-đun không thuận tiện ghi nhận, nhưng bạn có thể làm điều gì đó như thế này:

import sys 
module = sys.__class__ 
del sys 
foo = module('foo', 'Doc string') 
foo.__file__ = 'foo.pyc' 
exec code in foo.__dict__ 
+0

Việc tiếp cận ưa thích điểm cho loại mô-đun là 'types.ModuleType'. –

Trả lời

19

Là một bình luận đã chỉ ra, trong Python hiện nay cách ưa thích để nhanh chóng loại mà không có built-in tên là gọi loại thu được thông qua các mô-đun types từ thư viện tiêu chuẩn:

>>> import types 
>>> m = types.ModuleType('m', 'The m module') 

lưu ý rằng điều này không không tự động chèn các module mới trong sys.modules:

>>> import sys 
>>> sys.modules['m'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'm' 

Đó là một nhiệm vụ bạn phải thực hiện bằng tay:

>>> sys.modules['m'] = m 
>>> sys.modules['m'] 
<module 'm' (built-in)> 

Đây có thể là quan trọng, vì đối tượng mã của một mô-đun thông thường thực hiện sau của thêm vào sys.modules mô-đun - ví dụ, nó hoàn toàn chính xác cho ví dụ mã để tham chiếu đến sys.modules[__name__] và điều đó sẽ không thành công (KeyError) nếu bạn quên bước này. Sau bước này, và thiết lập m.__file__ như bạn đã có trong chỉnh sửa của bạn,

>>> code = compile("a=23", "m.py", "exec") 
>>> exec code in m.__dict__ 
>>> m.a 
23 

(hoặc Python 3 tương đương, nơi exec là một chức năng, nếu Python 3 là những gì bạn đang sử dụng, tất nhiên; -) là chính xác (tất nhiên, bạn thường sẽ thu được đối tượng mã bởi subtler có nghĩa là biên dịch một chuỗi, nhưng đó không phải là tài liệu cho câu hỏi của bạn ;-).

Trong các phiên bản cũ của Python bạn đã có thể sử dụng các mô-đun new thay vì các mô-đun types để làm cho một đối tượng mô-đun mới vào lúc bắt đầu, nhưng new bị phản đối từ Python 2.6 và loại bỏ trong Python 3.

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