एक पायथन प्रोग्राम में, यदि प्रोग्राम के नामस्थान में कोई नाम मौजूद है, तो यह पता लगाना संभव है कि नाम कुछ मॉड्यूल से आयात किया गया है, और यदि हां, तो कौन सा मॉड्यूल आयात किया जाता है?मैं कैसे पता लगा सकता हूं कि कौन सा मॉड्यूल नाम से आयात किया जाता है?
उत्तर
आप जो मॉड्यूल एक समारोह __module__
विशेषता के माध्यम से में परिभाषित किया गया है देख सकते हैं । From the Python Data model documentation on __module__
:
मॉड्यूल का नाम परिभाषित किया गया था, या अनुपलब्ध होने पर कोई भी नहीं।
उदाहरण:
>>> from re import compile
>>> compile.__module__
're'
>>> def foo():
... pass
...
>>> foo.__module__
'__main__'
>>>
The Data model later mentions कि वर्गों के साथ-साथ एक ही विशेषता है:
__module__
मॉड्यूल का नाम है, जिसमें वर्ग परिभाषित किया गया है।
>>> from datetime import datetime
>>> datetime.__module__
'datetime'
>>> class Foo:
... pass
...
>>> Foo.__module__
'__main__'
>>>
आप भी इस तरह के int
और list
के रूप में निर्मित नाम के साथ ऐसा कर सकते हैं। आप उन्हें builtins
मॉड्यूल से एक्सेस कर सकते हैं।
>>> int.__module__
'builtins'
>>> list.__module__
'builtins'
>>>
मैं
from builtins import int, list
बिनाint
औरlist
उपयोग कर सकते हैं। तोint
औरlist
मेरे प्रोग्राम में कैसे उपलब्ध हो?
ऐसा इसलिए है क्योंकि int
और list
अंतर्निहित नाम हैं। आपको वर्तमान नामस्थान में उन्हें खोजने में सक्षम होने के लिए उन्हें पायथन के लिए स्पष्ट रूप से आयात करने की आवश्यकता नहीं है। आप इसे CPython virtual machine source code में अपने लिए देख सकते हैं। जैसा कि @ user2357112 उल्लेख किया गया है, वैश्विक लुकअप विफल होने पर अंतर्निहित नामों का उपयोग किया जाता है। यहां प्रासंगिक स्निपेट है:
if (v == NULL) {
v = PyDict_GetItem(f->f_globals, name);
Py_XINCREF(v);
if (v == NULL) {
if (PyDict_CheckExact(f->f_builtins)) {
v = PyDict_GetItem(f->f_builtins, name);
if (v == NULL) {
format_exc_check_arg(
PyExc_NameError,
NAME_ERROR_MSG, name);
goto error;
}
Py_INCREF(v);
}
else {
v = PyObject_GetItem(f->f_builtins, name);
if (v == NULL) {
if (PyErr_ExceptionMatches(PyExc_KeyError))
format_exc_check_arg(
PyExc_NameError,
NAME_ERROR_MSG, name);
goto error;
}
}
}
}
उपरोक्त कोड में, सीपीथन पहले वैश्विक दायरे में एक नाम की खोज करता है। यदि यह विफल हो जाता है, तो यह वापस आ जाता है और मौजूदा फ्रेम ऑब्जेक्ट में इसके निष्पादन में बिल्टिन नामों के मैपिंग से नाम प्राप्त करने का प्रयास करता है। यही f->f_builtins
है।
आप sys._getframe()
का उपयोग कर अजगर स्तर से इस मानचित्रण का निरीक्षण कर सकते हैं:
>>> import sys
>>> frame = sys._getframe()
>>>
>>> frame.f_builtins['int']
<class 'int'>
>>> frame.f_builtins['list']
<class 'list'>
>>>
sys._getframe()
कॉल स्टैक के शीर्ष पर फ़्रेम लौटाता है। इस मामले में, यह मॉड्यूल स्कोप के लिए फ्रेम है।और जैसा कि आप ऊपर से देख सकते हैं, f_builtins
फ्रेम के लिए मैपिंग में int
और list
कक्षाएं हैं, इसलिए पायथन ने स्वचालित रूप से उन नामों को आपके लिए उपलब्ध कराया है। दूसरे शब्दों में, यह उन्हें "निर्मित" क्षेत्र में बनाया गया है; इसलिए शब्द "बिल्टिन"।
कुछ ऑब्जेक्ट्स (लेकिन सभी से दूर) में __module__ विशेषता है।
जब तक कोड वैश्विक अद्यतन करने की तरह कुछ असामान्य कर रहा है सीधे, स्रोत कोड का संकेत देना चाहिए जहां हर चर से आया था:
x = 10 # Assigned in the current module
from random import randrange # Loaded from random
from functools import * # Loads everything listed in functools.__all__
धन्यवाद। यदि आपके स्रोत कोड में 'आयात *' से कई आयात विवरण हैं, तो आप कैसे बता सकते हैं कि कौन सा मॉड्यूल एक चर से आता है? – Tim
"somemod import ** स्टेटमेंट्स से सभी मॉड्यूल से पता चलता है कि कौन से मॉड्यूल से आया था। हालांकि, आप आयात के अलावा अपना खुद का" आयात somemod "चला सकते हैं और ऊपर सूचीबद्ध के रूप में आगे बढ़ सकते हैं। –
किसी कारण स्रोत अनुपलब्ध है के लिए, आप inspect
से getmodule
इस्तेमाल कर सकते हैं, तो जो __module__
हथियाने यदि वह मौजूद है और उसके बाद अन्य विकल्पों पर वापस गिरने से मॉड्यूल को खोजने के लिए अपने सबसे अच्छे रूप कोशिश करता है।
यदि सबकुछ ओ.के. हो जाता है, तो आप मॉड्यूल ऑब्जेक्ट वापस लेते हैं। कि से, आप __name__
हड़पने मॉड्यूल का वास्तविक नाम पाने के लिए कर सकते हैं:
from inspect import getmodule
from collections import OrderedDict
from math import sin
getmodule(getmodule).__name__
'inspect'
getmodule(OrderedDict).__name__
'collections'
getmodule(sin).__name__
'math'
यह कुछ भी नहीं मिल रहा है, तो यह रिटर्न None
तो आप विशेष मामला इस करना होगा। आम तौर पर यह आपके लिए तर्क को समाहित करता है, इसलिए यदि आप मौजूद हैं तो __module__
को वास्तव में पकड़ने के लिए आपको स्वयं को एक फ़ंक्शन लिखने की आवश्यकता नहीं है।
यह उन वस्तुओं के लिए काम नहीं करता है जिनके पास यह जानकारी संलग्न नहीं है। तुम्हें पता है, फ़ॉल-बैक के रूप में, कोशिश करते हैं और प्रकार में पारित यह नाकाम करने के लिए कर सकते हैं:
o = OrderedDict()
getmodule(o) # None
getmodule(type(0)).__name__ # 'collections'
लेकिन वह हमेशा सही परिणाम नहीं होगा:
from math import pi
getmodule(type(pi)).__name__
'builtins'
तुम भी globals()
देख सकते हैं , यह नामों के अंदर घोषित वैरिएबल, मॉड्यूल और फ़ंक्शंस के साथ-साथ सभी नामों के साथ एक ध्रुव आउटपुट करेगा। मॉड्यूल के साथ भी
if globals()['x']:
print('x exist')
try:
print(globals()['y'])
except KeyError:
print('but y does not')
# x exist
# but y does not
काम करता है::
>>> x = 10
>>> import os
>>> globals() # to big to display here but finish with
# {... 'x': 10, 'os': <module 'os' from '/usr/local/lib/python2.7/os.py'>}
इसलिए, आप परीक्षण कर सकते हैं, तो चर इस तरह घोषित किया गया
print(globals()['os']) # <module 'os' from '/usr/local/lib/python2.7/os.py'>
try:
print(globals()['math'])
except KeyError:
print('but math is not imported')
# <module 'os' from '/usr/local/lib/python2.7/os.py'>
# but math is not imported
धन्यवाद। आप 'ग्लोबल्स()' के बजाय 'प्रिंट (ग्लोबल्स()) 'का उपयोग क्यों करते हैं? – Tim
मैं परीक्षण करते समय एक पायथन कंसोल का उपयोग नहीं कर रहा हूं, इसलिए मुझे 'प्रिंट' की आवश्यकता है, लेकिन अगर आप अपनी पठनीयता को कम करते हैं तो मैं इसे हटा सकता हूं। –
- 1. मैं कैसे पता लगा सकता हूं कि कौन सा बटन क्लिक किया गया था?
- 2. मैं कैसे पता लगा सकता हूं कि विंडोज प्रोग्राम में कौन सा कंप्यूटर डोमेन नियंत्रक है?
- 3. मैं कैसे पता लगा सकता हूं कि कौन सा जेएआर एप्लीकेशन उपयोग नहीं कर रहा है?
- 4. मैं कैसे पता लगा सकता हूं कि मैं रिपोर्टलाब का कौन सा संस्करण चला रहा हूं?
- 5. UILongPressGestureRecognizer पर मैं कैसे पता लगा सकता हूं कि कौन सा ऑब्जेक्ट ईवेंट उत्पन्न करता है?
- 6. मैं कैसे पता लगा सकता हूं कि कौन सा जीडब्ल्यूटी तत्व केंद्रित है?
- 7. मैं कैसे पता लगा सकता हूं कि इंटरनेट एक्सप्लोरर का कौन सा संस्करण स्थापित है?
- 8. मैं कैसे पता लगा सकता हूं कि TinyMCE का कौन सा संस्करण चल रहा हूं?
- 9. मैं कैसे पता लगा सकता हूं कि साइबेस का कौन सा संस्करण चल रहा है
- 10. मैं कैसे पता लगा सकता हूं कि .NET विंडोज फॉर्म में कौन सा नियंत्रण केंद्रित है?
- 11. मैं कैसे पता लगा सकता हूं कि मॉड्यूल मूस लोड कर रहा है?
- 12. मैं कैसे पता लगा सकता हूं कि मेरे मेजबान ने मेरे लिए कौन सा मेल-सर्वर स्थापित किया है?
- 13. wxPython: मैं कैसे पता लगा सकता हूं कि किस विजेट पर ध्यान केंद्रित किया गया है?
- 14. मैं कैसे पता लगा सकता हूं कि निष्पादन योग्य कौन से डीएल लोड होंगे?
- 15. मैं कैसे पता लगा सकता हूं कि ऑब्जेक्ट को तुरंत चालू किया गया है?
- 16. मैं कैसे पता लगा सकता हूं कि एक्शनकेबल से कौन जुड़ा है?
- 17. कैसे पता चलेगा कि संघ से कौन सा चर इस्तेमाल किया जाता है?
- 18. पर्ल में, मैं कैसे देख सकता हूं कि कौन सा मॉड्यूल दिया गया फ़ंक्शन आयात किया गया था?
- 19. मैं कैसे पता लगा सकता हूं कि कौन सा सर्वर मेरे विंडोज डोमेन पर एलडीएपी होस्ट करता है?
- 20. मैं कैसे पता लगा सकता हूं कि एक बोअर पैकेज का कौन सा संस्करण वास्तव में स्थापित है?
- 21. node.js आंतरिक: मैं कैसे पता लगा सकता हूं कि 'process.binding (' eval ') को परिभाषित किया गया है?
- 22. मैं कैसे पता लगा सकता हूं कि मेरा पृष्ठ पोस्टबैक
- 23. मैं कैसे पता लगा सकता हूं कि विंडोज में एक टीसीपी/आईपी पोर्ट को कौन सा प्रोग्राम सुन रहा है?
- 24. मैं कैसे पता लगा सकता हूं कि HTML तत्वों से कौन सी घटनाएं संलग्न हैं?
- 25. मैं कैसे पता लगा सकता हूं कि इनोटिफ़ाई घड़ियों को पंजीकृत किया गया है?
- 26. मैं कैसे पता लगा सकता हूं कि मैं किस गिट का संस्करण चला रहा हूं?
- 27. मैं कैसे पता लगा सकता हूं कि वीबी.Net DataRow
- 28. मैं कैसे पता लगा सकता हूं कि जेनकिंस
- 29. मैं कैसे देख सकता हूं कि कौन सा चेकबॉक्स चेक किया गया है?
- 30. कैसे पता चलेगा कि मोंगोडब में कौन सा स्टोरेज इंजन उपयोग किया जाता है?
धन्यवाद। क्या यह संभव है यह जानने के लिए कि 'int' और' list' जैसे बिल्टिन प्रकारों को कौन सा मॉड्यूल आयात किया गया है? – Tim
@ टिम यूप से आयात करें। अपने आरईपीएल में 'int .__ मॉड्यूल__' और' list .__ मॉड्यूल__' 'आज़माएं।' बिल्टिन 'मॉड्यूल में परिभाषित किया गया है –
मैं 'int' और' list' का उपयोग 'अंतर्निहित आयात int, सूची' से 'के बिना कर सकता हूं। तो मेरे प्रोग्राम में' int' और 'list' कैसे उपलब्ध हो सकता है? – Tim