2013-06-21 30 views
7

Chúng ta đều được thông báo sử dụng from module import * là một ý tưởng tồi. Tuy nhiên, có cách nào để nhập một tập hợp con nội dung của module bằng ký tự đại diện không?Python: nhập khẩu tập hợp ký tự đại diện

Ví dụ:

module.py:

MODULE_VAR1 = "hello" 
MODULE_VAR2 = "world" 
MODULE_VAR3 = "The" 
MODULE_VAR4 = "quick" 
MODULE_VAR5 = "brown" 
... 
MODULE_VAR10 = "lazy" 
MODULE_VAR11 = "dog!" 
MODULE_VAR12 = "Now" 
MODULE_VAR13 = "is" 
... 
MODULE_VAR98 = "Thats" 
MODULE_VAR99 = "all" 
MODULE_VAR100 = "folks!" 

def abs(): 
    print "Absolutely useful function: %s" % MODULE_VAR1 

Rõ ràng chúng ta không muốn sử dụng from module import * bởi vì chúng tôi muốn được trọng các abs chức năng. Nhưng giả sử chúng tôi DID muốn tất cả các biến số MODULE_VAR* để có thể truy cập cục bộ.

Chỉ cần đặt from module import MODULE_VAR* không hoạt động. Có cách nào để hoàn thành nó không?

Tôi đã sử dụng 100 biến làm hình minh họa, vì làm from module import MODULE_VAR1, MODULE_VAR2, MODULE_VAR3, ..., MODULE_VAR100 rõ ràng là khó sử dụng và sẽ không hoạt động nếu có nhiều biến hơn (ví dụ: MODULE_VAR101) được thêm vào.

Trả lời

2

Bạn có thể sử dụng biến số __all__ để nhập các biến cụ thể khi sử dụng cú pháp import *.

mymodule.py

__all__ = [ 
    'MODULE_VAR1', 
    'MODULE_VAR2', 
    'MODULE_VAR3', 
    'MODULE_VAR4', 
    'MODULE_VAR5', 
] 

MODULE_VAR1 = "hello" 
MODULE_VAR2 = "world" 
MODULE_VAR3 = "The" 
MODULE_VAR4 = "quick" 
MODULE_VAR5 = "brown" 

def abs(): 
    print "Absolutely useful function: %s" % MODULE_VAR1 

Sau đó, chúng ta có thể sử dụng nó thusly:

from mymodule import * 
print MODULE_VAR1 # hello 
print abs # <built-in function abs> 

Khi một mô-đun được nhập khẩu sử dụng *, Python kiểm tra các mô-đun cho một __all__ biến mà có thể ghi đè lên những gì nếu không sẽ được xem xét các biến "công khai" bình thường trong mô-đun (đó sẽ là các biến không bắt đầu bằng dấu gạch dưới) và cho phép bạn xác định rõ ràng biến nào là "công khai". Check out this question

+0

Điều này thật tuyệt! Nhưng có cách nào để đạt được hiệu quả tương tự nếu bạn không có quyền kiểm soát mã nguồn của mô-đun không? – seaotternerd

+0

Xin lỗi tôi đã hiểu lầm. Tôi không biết cách nào để nhập các biến cụ thể từ một mô-đun khác. Nhưng như một giải pháp rất đơn giản, bạn có thể tạo ra một trình trợ giúp để nhập mô-đun và lặp lại các thuộc tính của mô-đun để trích xuất các biến mà bạn muốn. Trong ví dụ của bạn, điều này sẽ ngăn chặn biến 'abs' bị ghi đè mà bạn không nhập các biến mô-đun nhưng chính mô đun đó. Ngoài ra, bạn * có thể * nhập các biến mô-đun trong phạm vi của một hàm, ngăn chức năng 'abs' tích hợp bị ghi đè. Tôi nghĩ rằng @jsbueno có một ví dụ hoàn hảo. – kuujo

+0

Tôi không biết nếu bạn hiểu lầm - tôi không phải là người hỏi câu hỏi, tôi chỉ tò mò thôi. Cảm ơn! – seaotternerd

7

Bạn có thể có một hàm helper cho rằng - và nó có thể được thực hiện mà không kỳ diệu:

import re 

def matching_import(pattern, module, globals): 
    for key, value in module.__dict__.items(): 
     if re.findall(pattern, key): 
      globals[key] = value 

Bây giờ, bạn có thể làm ví dụ:

from utils import matching_import 
import constants 

matching_import("MODULE_VAR.*", constants, globals()) 

Sử dụng globals() rõ ràng trong này cách tránh ma thuật nội soi khung, thường được xem là có hại.

+0

Giải pháp tốt. +1 – kuujo

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