2015-09-08 6 views
8

हाल ही में मुझे एक समस्या थी जहां signal I was using from flask-security was not behaving as expected पायथन 3.3 में। फ्लास्क-सुरक्षा के लिए स्रोत कोड को देखते हुए मैंने देखा कि फ्लास्क-सुरक्षा पैकेज में मॉड्यूल से आयात करने वाला सिग्नल भी __init__.py में आयात किया गया था। पैकेज के शीर्ष स्तर से सिग्नल आयात करके मैं अपनी समस्या को हल करने में सक्षम था (चूंकि पैकेज प्रारंभ होने पर सिग्नल आयात हो जाता है)।पाइथन 2.7 और 3.3+ के बीच अंतर जब एक ही निर्देशिका से __init__.py और मॉड्यूल में आयात करते हैं

अगर मैं निम्नलिखित कोड चलाएँ:

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

मैं अजगर 2.7 में True मिल जाएगा और मैं अजगर के लिए False मिलेगा 3.3+।

पायथन 3.3+ में क्या भिन्न है जो आयात व्यवहार में इस अंतर का कारण बनता है?

संपादित करें: मैं अभी भी अजगर 2.7 बनाम 3.3+ समस्या से स्टम्प्ड हूँ, लेकिन नीचे संकीर्ण करने के लिए कि इस मुद्दे को जब flask.ext की __init__.py कहा जाता है उत्पन्न हो रही है में कामयाब रहे और exthook.py से ExtensionImporter वर्ग का उपयोग करता है फ्लास्क-सुरक्षा आयात करने के लिए।

जब कुप्पी के सुरक्षा सीधे विस्तार हुक से परहेज आयात किया जाता है 3.4 रिटर्न True अजगर के अंतर्गत निम्नलिखित चल रहा है:

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

यहाँ flask.ext.security और flask_security उदाहरण के लिए संकेतों के लिए रेपर() है:

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

और यदि आप प्रत्येक के प्रतिनिधि को मुद्रित करते हैं? –

+0

प्रश्न के भीतर repr जोड़ा गया। फ्लास्क.ext के माध्यम से उपयोग किए जाने पर निश्चित रूप से एक अलग वस्तु। – khammel

+0

मुझे लगता है कि इसका कुछ संबंध है [http://stackoverflow.com/questions/4798589/what-could-cause-a-python- मॉड्यूल-to-be-imported-twice] और Python3.3 में परिवर्तन वह क्षेत्र यह भी पढ़ें [http://python-notes.curiousefficiency.org/en/latest/python_concepts/import_traps.html]। – mkiever

उत्तर

0

ऐसे कई मामले हैं जहां पाइथन मॉड्यूल को फिर से आयात करते समय किसी ऑब्जेक्ट का नया उदाहरण बनाने का निर्णय ले सकता है।

वास्तव में यह भी पाइथन 3 विशिष्ट नहीं है और यह विभिन्न परिदृश्यों में हो सकता है।

मुख्य रूप से आपको यह मानना ​​होगा कि दोनों ऑब्जेक्ट अलग हो सकते हैं और इसके आसपास काम कर सकते हैं।

+0

धन्यवाद। ऐसा लगता है कि फ्लास्क द्वारा सिग्नल के उपयोग के साथ कुछ समस्या है और जब फ्लास्क.क्स्ट के माध्यम से आयात होता है तो क्या होता है। * – khammel

संबंधित मुद्दे