2014-12-19 11 views
6

Sto creando una libreria che si occupa di moduli Python. Senza entrare nei dettagli, ho bisogno di un elenco delle estensioni dei moduli Python comuni.C'è un modo semplice per ottenere tutte le estensioni dei moduli più comuni?

Ovviamente, voglio .py, ma mi piacerebbe anche includere quelli come .pyw, .pyd, ecc In altre parole, voglio tutto ciò che è possibile importare.

C'è uno strumento nella libreria standard che farà questo elenco per me? O devo farlo da solo (e hardcode tutti i valori)?

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

risposta

7

Questa funzionalità è disponibile nello importlib.machinery module. All'interno, ci sono numerose costanti che riguardano le varie estensioni di moduli Python:

>>> 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'] 
>>> 

Quindi, si potrebbe facilmente aderire a questi in un insieme globale :

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

Potrebbero essere anche interessato allo all_suffixes function:

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

Si noti tuttavia che questa funzione sostituirà .pyc con .pyo se Python viene avviato con lo -O or -OO options. Per evitare questo, si può fare:

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

Questo farà sì che sia .pyc e .pyo sono nel set.


Infine, dovresti diffidare di importlib.machinery.BYTECODE_SUFFIXES. Come @MartijnPieters annotato nei commenti, sarà sempre uguale a OPTIMIZED_BYTECODE_SUFFIXES o DEBUG_BYTECODE_SUFFIXES. Ciò significa che se lo aggiungi alla raccolta, otterrai un duplicato .pyc o un valore duplicato .pyo (a meno che non utilizzi un set ovviamente).

Dal docs:

importlib.machinery.BYTECODE_SUFFIXES

una lista di stringhe che rappresentano i suffissi file riconosciuti per i moduli bytecode. Impostare su DEBUG_BYTECODE_SUFFIXES o OPTIMIZED_BYTECODE_SUFFIXES in base al fatto che __debug__ sia vero.

non mi sono preoccupato di utilizzare questo costante però perché voglio sia OPTIMIZED_BYTECODE_SUFFIXES e DEBUG_BYTECODE_SUFFIXES nella collezione. Quindi, non c'è motivo di aggiungerlo.


ho deciso di usare un insieme perché hanno un tempo di ricerca più veloce di liste. Significa che sono più adatti per una collezione globale di valori che non cambieranno e che non ha bisogno di un ordine particolare. Inoltre, assicureranno che non aggiungiamo accidentalmente estensioni duplicate alla raccolta.

+1

Si noti che 'all_suffixes()' include anche * moduli di estensione *; su Mac questo dà '['.py', '.pyc', '.cpython-34m.so', '.abi3.so', '.so']' per esempio. –

+0

Aggiungete inoltre "importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES' o" importlib.machinery.DEBUG_BYTECODE_SUFFIXES', che * non * è uguale a 'importlib.machinery.BYTECODE_SUFFIXES'. Altrimenti avrete '.pyo' * due volte * quando correte con' -O' o '-OO'. –

+0

Sì, un set sarebbe ancora meglio. Vedere la documentazione ['importlib.machinery.BYTECODE_SUFFIXES'] (https: // docs.python.org/3/library/importlib.html # importlib.machinery.BYTECODE_SUFFIXES'): * Impostare su' DEBUG_BYTECODE_SUFFIXES' o 'OPTIMIZED_BYTECODE_SUFFIXES'. in base al fatto che '__debug__' sia vero. * –