2015-09-08 13 views
8

Recentemente ho avuto un problema in cui uno signal I was using from flask-security was not behaving as expected in python 3.3. Osservando il codice sorgente per la sicurezza delle palline, ho notato che il segnale che stavo importando da un modulo nel pacchetto di sicurezza delle palline è stato importato anche in __init__.py. Importando il segnale dal livello superiore del pacchetto sono stato in grado di risolvere il mio problema (poiché il segnale viene importato quando il pacchetto viene inizializzato).Differenza tra python 2.7 e 3.3+ durante l'importazione in __init__.py e modulo dalla stessa directory

Se corro il seguente codice:

from flask.ext.security import user_registered 
from flask.ext.security.signals import user_registered as user_reg_sig 
user_registered==user_reg_sig 

Prendo True in Python 2.7 e vado a prendere False per Python 3.3+.

Cosa c'è di diverso in python 3.3+ che causa questa differenza nel comportamento di importazione?

EDIT: Sono ancora sconcertato dal pitone 2,7 vs problema 3.3+, ma sono riuscito a restringere che il problema si verifica quando il __init__.py di flask.ext è chiamato e utilizza la classe ExtensionImporter da exthook.py per importare sicurezza del pallone.

Eseguire il seguente sotto pitone 3.4 ritorni True quando pallone di sicurezza è direttamente importato evitando il gancio estensione:

from flask_security.signals import user_registered as user_reg_sig 
from flask_security import user_registered 
user_registered==user_reg_sig 

Ecco repr() per i segnali per flask.ext.security e flask_security esempi:

from flask_security.signals import user_registered as user_reg_sig 
from flask_security import user_registered 

repr(user_registered) 
>>> "<blinker.base.NamedSignal object at 0x7fb38e258400; 'user-registered'>" 

repr(user_reg_sig) 
>>> "<blinker.base.NamedSignal object at 0x7fb38e258400; 'user-registered'>" 

from flask.ext.security import user_registered 
from flask.ext.security.signals import user_registered as user_reg_sig 

repr(user_registered) 
>>> "<blinker.base.NamedSignal object at 0x7fb38e258400; 'user-registered'>" 

repr(user_reg_sig) 
>>> "<blinker.base.NamedSignal object at 0x7fb38dd030b8; 'user-registered'>" 
+0

E se si stampa il repr di ciascuno? –

+0

Aggiunta la repr all'interno della domanda. Quindi sicuramente un oggetto diverso quando vi si accede tramite flask.ext. – khammel

+0

Immagino che abbia qualcosa a che fare con [http://stackoverflow.com/questions/4798589/what-could-cause-a-python-module-to-be-imported-twice] e le modifiche in Python3.3 in quell'area. Leggi anche questo [http://python-notes.curiousefficiency.org/en/latest/python_concepts/import_traps.html]. – mkiever

risposta

0

Ci sono diversi casi in cui Python può decidere di creare una nuova istanza di un oggetto quando si reimporta il modulo.

In realtà non è nemmeno specifico di Python 3 e può accadere in vari scenari.

Principalmente si deve supporre che i due oggetti potrebbero essere diversi e aggirarli.

+0

Grazie. Sembra che ci sia un po 'di problemi con l'uso dei segnali di Flask e cosa succede quando le importazioni avvengono tramite flask.ext. * – khammel

Problemi correlati