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'>"
E se si stampa il repr di ciascuno? –
Aggiunta la repr all'interno della domanda. Quindi sicuramente un oggetto diverso quando vi si accede tramite flask.ext. – khammel
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