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