2014-12-19 12 views
6

Tôi đang tạo một thư viện giao dịch với các mô-đun Python. Nếu không đi vào chi tiết, tôi cần một danh sách các phần mở rộng mô-đun Python phổ biến.Có cách nào dễ dàng để nhận tất cả các tiện ích mở rộng mô-đun phổ biến không?

Rõ ràng, tôi muốn .py, nhưng tôi cũng muốn bao gồm những cái như .pyw, .pyd, v.v. Nói cách khác, tôi muốn mọi thứ bạn có thể nhập.

Có công cụ nào trong thư viện chuẩn sẽ tạo danh sách này cho tôi không? Hay tôi phải tự mình làm (và mã hóa tất cả các giá trị)?

extensions = ['.py', '.pyw', ...] 

Trả lời

7

Chức năng này có thể được tìm thấy trong importlib.machinery module. Bên trong, có rất nhiều các hằng số có liên quan đến các phần mở rộng mô-đun Python khác nhau:

>>> import importlib 
>>> importlib.machinery.SOURCE_SUFFIXES 
['.py', '.pyw'] 
>>> importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES 
['.pyo'] 
>>> importlib.machinery.EXTENSION_SUFFIXES 
['.pyd'] 
>>> importlib.machinery.DEBUG_BYTECODE_SUFFIXES 
['.pyc'] 
>>> 

Vì vậy, bạn có thể rất dễ dàng tham gia các vào một tập hợp toàn cầu :

>>> set(importlib.machinery.SOURCE_SUFFIXES + 
...  importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES + 
...  importlib.machinery.EXTENSION_SUFFIXES + 
...  importlib.machinery.DEBUG_BYTECODE_SUFFIXES) 
{'.pyw', '.py', '.pyd', '.pyc', '.pyo'} 
>>> 

Bạn có thể đặt cũng quan tâm đến số all_suffixes function:

>>> importlib.machinery.all_suffixes() 
['.py', '.pyw', '.pyc', '.pyd'] 
>>> 

Tuy nhiên, lưu ý rằng chức năng này sẽ thay thế .pyc bằng .pyo nếu Python được khởi chạy với -O or -OO options. Để tránh điều này, bạn có thể làm:

>>> set(importlib.machinery.all_suffixes() + 
...  importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES + 
...  importlib.machinery.DEBUG_BYTECODE_SUFFIXES) 
{'.pyw', '.py', '.pyd', '.pyc', '.pyo'} 
>>> 

này sẽ đảm bảo rằng cả hai .pyc.pyo này nằm trong bộ.


Cuối cùng, bạn nên cảnh giác với importlib.machinery.BYTECODE_SUFFIXES. Như @MartijnPieters đã lưu ý trong các nhận xét, nó sẽ luôn bằng OPTIMIZED_BYTECODE_SUFFIXES hoặc DEBUG_BYTECODE_SUFFIXES. Điều này có nghĩa là nếu bạn thêm nó vào bộ sưu tập, bạn sẽ nhận được .pyc trùng lặp hoặc giá trị .pyo trùng lặp (trừ khi bạn sử dụng một tập hợp khóa học).

Từ docs:

importlib.machinery.BYTECODE_SUFFIXES

Một danh sách các chuỗi đại diện cho các hậu tố tập tin được công nhận cho module bytecode. Đặt thành DEBUG_BYTECODE_SUFFIXES hoặc OPTIMIZED_BYTECODE_SUFFIXES dựa trên việc liệu __debug__ có đúng không.

Tôi không bận tâm khi sử dụng hằng số này vì tôi muốn cả hai OPTIMIZED_BYTECODE_SUFFIXESDEBUG_BYTECODE_SUFFIXES trong bộ sưu tập. Vì vậy, không có lý do gì để thêm nó.


tôi quyết định sử dụng một bộ bởi vì họ có một thời gian tra cứu nhanh hơn so với danh sách. Có nghĩa là, chúng phù hợp hơn với tập hợp các giá trị toàn cầu sẽ không thay đổi và không cần thứ tự cụ thể. Ngoài ra, họ sẽ đảm bảo rằng chúng tôi không vô tình thêm các phần mở rộng trùng lặp vào bộ sưu tập.

+1

Lưu ý rằng 'all_suffixes()' cũng bao gồm * mô-đun mở rộng *; trên máy Mac, nó cung cấp cho '['.py', '.pyc', '.cpython-34m.so', '.abi3.so', '.so']' chẳng hạn. –

+0

Ngoài ra, hãy thêm hoặc 'importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES' hoặc' importlib.machinery.DEBUG_BYTECODE_SUFFIXES', bao giờ là * không * bằng 'importlib.machinery.BYTECODE_SUFFIXES'. Nếu không, bạn sẽ có '.pyo' * hai lần * khi chạy với' -O' hoặc '-OO'. –

+0

Có, một bộ sẽ vẫn tốt hơn. Xem tài liệu ['importlib.machinery.BYTECODE_SUFFIXES'] (https: // docs.python.org/3/library/importlib.html # importlib.machinery.BYTECODE_SUFFIXES'): * Đặt thành' DEBUG_BYTECODE_SUFFIXES' hoặc 'OPTIMIZED_BYTECODE_SUFFIXES' dựa trên việc '__debug__' có đúng không. * –

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