2013-01-18 17 views
7

Questa domanda segue The way to make namespace packages in Python e How do I create a namespace package in Python?.Pacchetti di namespace con una parte principale?

Nota PEP 420, e la distribute docs, in cui si afferma:

non si deve includere qualsiasi altro codice e dati in un pacchetto namespace di __init__.py. Anche se può sembrare che funzioni durante lo sviluppo, o quando i progetti vengono installati come file .egg, non funzionerà quando i progetti vengono installati usando gli strumenti di packaging "di sistema" - in questi casi i file __init__.py non verranno installati, per non parlare dell'esecuzione.


Tutto questo sembra rendere impossibile avere un pacchetto "libreria principale" con sotto-pacchetti di estensione distribuite in modo indipendente. Quello che voglio è essere in grado di:

  1. definire un pacchetto di libreria di base, per essere utilizzato in questo modo:

    import mylibrary 
    
    mylibrary.some_function() 
    
  2. consentire estensioni biblioteca, confezionato e distribuito separatamente, da utilizzare come questo :

    import mylibrary.myextension 
    
    mylibrary.myextension.some_other_function() 
    

mi sarei aspettato di essere in grado di fare questo con i pacchetti namespace, ma non sembra per essere il caso, sulla base delle domande e dei link sopra. Questo può essere fatto a tutti?

+0

Non riesco ancora a credere che questo sia ancora il caso del moderno Python. Certamente rende definitive le parti principali per convenienza nel vostro pacchetto namespace abbastanza "difficile":/ –

risposta

3

In effetti non è possibile avere il codice in un livello superiore __init__.py per un pacchetto di spazio dei nomi PEP 420.

Se fossi in te, mi piacerebbe uno:

  1. creare 2 pacchetti, uno chiamato MyLibrary (un pacchetto normale), che contiene il codice della libreria reale, e l'altro chiamato mylibrary_plugins che è un pacchetto namespace.
  2. oppure, creare mylibrary.lib, che è un pacchetto normale e contiene il codice e mylibrary.plugins, che è un pacchetto di spazio dei nomi.

Personalmente mi piacerebbe usare l'opzione 1.

La sezione logica del PEP 420 spiega perché __init__.py non può contenere alcun codice.

+0

Eric, nel caso 2, 'mylibrary' dovrebbe anche essere un pacchetto namespace, corretto? – jbenet

1

in senso stretto, è possibile avere variabili sotto mylibrary, non sarà possibile definirli lì. È possibile, ad esempio:

# mylibrary/core.py 
import mylibrary 
def some_function(): 
    pass 

mylibrary.some_function = some_function 

e gli utenti possono utilizzarlo come:

import mylibrary.core 
mylibrary.some_function() 

Vale a dire, mylibrary.core patch scimmia mylibrary in modo che, oltre l'importazione, sembra che somefunction è definito in mylibrary anziché in un pacchetto secondario.

Problemi correlati