हाल ही में मुझे एक समस्या थी जहां 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'>"
और यदि आप प्रत्येक के प्रतिनिधि को मुद्रित करते हैं? –
प्रश्न के भीतर repr जोड़ा गया। फ्लास्क.ext के माध्यम से उपयोग किए जाने पर निश्चित रूप से एक अलग वस्तु। – khammel
मुझे लगता है कि इसका कुछ संबंध है [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