পাইথন মডিউলগুলি কেন কখনও কখনও তাদের উপ-মডিউলগুলি আমদানি করে না?


91

আমি আজ কিছু অদ্ভুত কিছু লক্ষ্য করেছি যা আমি ব্যাখ্যা করতে চাই। আমি এটিকে প্রশ্ন হিসাবে কীভাবে বাক্যবিন্যাস করব তা আমি 100% নিশ্চিত ছিলাম না, তাই গুগল প্রশ্নের বাইরে। কিছু অদ্ভুত কারণে লগিং মডিউলটির মডিউল লগিং hand হ্যান্ডলারের অ্যাক্সেস নেই। আপনি যদি আমাকে বিশ্বাস না করেন তবে নিজে চেষ্টা করুন:

>>> import logging
>>> logging.handlers
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'handlers'
>>> import logging.handlers
>>> logging.handlers
<module 'logging.handlers' from '/usr/lib/python2.6/logging/handlers.pyc'>

কেন এমন হয় কেউ ব্যাখ্যা করতে পারে?

উত্তর:


122

পাইথনে, মডিউলগুলি অ্যাক্সেসযোগ্য হওয়ার আগে তাদের আমদানি করা দরকার। import loggingশুধু লগিং মডিউল আমদানি করে। এটি এমনটি ঘটে যা loggingসাবমডিউলগুলি সহ একটি প্যাকেজ, তবে সেই সাবমডিউলগুলি এখনও স্বয়ংক্রিয়ভাবে লোড হয় না। সুতরাং, logging.handlersঅ্যাক্সেস করার আগে আপনাকে স্পষ্টতই আমদানি করতে হবে।

আপনি যদি ভাবছেন যে কেন কখনও কখনও এটির মতো অতিরিক্ত আমদানির দরকার হয় না: কিছু প্যাকেজগুলি তাদের আমদানি করার সময় তাদের কিছু বা সমস্ত সাবমোডিয়াল আমদানি করে - কেবল তাদের __init__.pyফাইলগুলিতে সেইগুলি আমদানি করে। অন্য ক্ষেত্রে এটি হতে পারে যে আপনি অন্য কিছু আমদানি করেন, আমদানি করেন logging.handlers। কোডের কোন অংশটি আমদানি করে তা বিবেচনা করে না; যতদিন কিছু আপনার প্রক্রিয়া আমদানির ক্ষেত্রে logging.handlersআগে আপনি এটা অ্যাক্সেস করতে, সেখানে থাকব। এবং কখনও কখনও এমন কোনও মডিউল যা প্যাকেজের মতো দেখতে সত্যই এক হয় না, তেমন osএবং os.pathosএটি কোনও প্যাকেজ নয়, এটি সঠিকভাবে অন্য মডিউলটি আমদানি করে (আপনার প্ল্যাটফর্মের জন্য) এবং এটিকে কল করে path, যাতে আপনি এটি হিসাবে অ্যাক্সেস করতে পারেন os.path


4

আমি অজগর থেকেও নতুন এবং এখন প্রচুর অনুশীলনের পরে আমি প্যাকেজ (ফোল্ডার), মডিউল (.পি), ক্লাস, ভেরিয়েবল ... ইত্যাদির মধ্যে পার্থক্য করতে পারি ...

যদি আপনি চান যে আপনার ফোল্ডারের কোনওটি পাইথন প্যাকেজ হতে পারে - এতে অবশ্যই __init__.pyফাইল থাকতে হবে এমনকি খালি ফাইলও করবে !!!

এবং থমাস যেমন বলেছিলেন, আপনি চাইলে আপনি অতিরিক্ত মডিউল আমদানি __init__.pকরতে পারেন !!! তবে মডিউল / প্যাকেজগুলি কেবল এটি আমদানি করার পরে অ্যাক্সেসযোগ্য ...

আপনি যদি কোনও মডিউল ব্যবহার করতে পারেন তবে সবকিছু আমদানি করতে চান

from logging import *

বিশ্রাম আপনি নীচের মত হ্যান্ডলারের মডিউল অ্যাক্সেস করতে পারেন,

from logging import handlers
print dir(handlers)


4
দয়া করে ব্যবহার করবেন না from module import *। এটি প্রায় সর্বদা একটি ভুল।
থমাস ওয়াউটারস

যদি আপনি চান একটি প্যাকেজের মধ্যে সবকিছু স্বয়ংক্রিয়ভাবে আমদানি করতে হবে, তাহলে সেই আমদানির না Init , .py পরিবর্তে স্থাপনের সব মধ্যে Init কোথাও .py এবং করছেন 'প্যাকেজ আমদানি থেকে *'।
টমাস ওয়াউটারস

4
@ পিট: কারণ এটি স্ট্যান্ডার্ড নেমস্পেসকে "দূষিত" করে যা দ্ব্যর্থহীনতা এবং বিরোধের দিকে নিয়ে যায়। যদি আমি থাকতাম import zipperএবং zipper.open()আপনি ঠিক জানতেন যে আমি কোন খোলা কল করছি। এর বিপরীতে from zipper import *অনুসৃত দ্বারা open()এটা বিল্ট-ইন খোলা বা zipper.open বা অন্য কিছু। import zipper as zআপনি টাইপ করে ক্লান্ত হয়ে পড়লে অনেক বেশি পছন্দ করা হয়zipper
এমএসডাব্লু

4
@ পিট: এটিও একটি সমস্যা কারণ আপনি হয়ত নিজের কিছু নামস্থান অজান্তেই ওভাররাইট করতে পারেন। আমি numpy import *এগুলি ব্যবহার করতাম কারণ কিছু নম্পি ফাংশন কাজ করে না আপনি যদি না সমস্ত নমাই আমদানি করেন (তাদের অংশের আইএমওতে ভয়ানক নকশার ত্রুটি) তবে নিম্পির মধ্যে এটি প্রচুর পরিমাণে অবজেক্ট করে। আমি প্রচুর ফাংশন ওভাররাইট করে শেষ করেছি (আমি বিশ্বাস করি অনুলিপিটি একটি ছিল ... আমি পরীক্ষা করতে খুব ক্লান্ত হয়েছি)। এখন আমি এনপি হিসাবে নম্পিটি আমদানি করি যদি আমি এতটা নিম্পি ব্যবহার করতে যাচ্ছি যে আমি এটিকে বারবার টাইপ করতে পারি না।
ক্রিসকোলি

4
পছন্দ করেছেন
উইনস্টন ইওয়ার্ট

2

টমাস ওয়াউটারস এই প্রশ্নের উত্তর খুব ভাল দিয়েছিলেন, কিন্তু হায় আফসোস, মূল ডকুমেন্টেশনে উত্তরটি খুঁজে পাওয়ার পরে আমি এই প্রশ্নটি পেয়েছি। সে লক্ষ্যে আমি ভেবেছিলাম যে এটি ভবিষ্যতে অনুসন্ধান ইঞ্জিনের শীর্ষের কাছে এসে দাঁড়াবে এই আশায় আমি এটি যুক্ত করব।

প্রশ্ন

ত্রুটিটি কেন ঘটে : ' এ্যাট্রিবিউটআরআর : মডিউল' মডিউল_নাম 'এর কোনও বৈশিষ্ট্য নেই' সাব_মডিউল_নাম 'যদিও আমার সম্পাদক (যেমন ভিজ্যুয়াল কোড) উপ-মডিউলটির নামটি স্বয়ংক্রিয়ভাবে সম্পূর্ণ করে:

 import module_name
 module_name.sub_module_name(parameter)

উত্তর

আপনার সম্পাদক এটির প্রকল্পের ফাইল কাঠামোটি সম্পূর্ণরূপে পাইথন আচরণের বাইরে নয় its আপনি যখন মডিউলটি আমদানি করেন তখন সাব-মডিউলগুলি 'স্বয়ংক্রিয়ভাবে' আমদানি করা হয় না। রেফারেন্স পাইথন ডকুমেন্টেশন কিভাবে আপনা থেকেই আমদানি উপ-মডিউল বিস্তারিত যখন ব্যবহার

 import module_name

কোনও 'মডিউল' বা 'প্যাকেজ' আমদানির চেষ্টা করার সময় এট্রিবিউটআরারের সংযোজন হ'ল এই উত্তরের মূল অবদান

আশা করি এটি কাউকে সাহায্য করবে!


1

আমি সম্প্রতি একই অদ্ভুত পরিস্থিতির মুখোমুখি হয়েছি। সুতরাং, আমি বাজি ধরছি আপনি কিছু তৃতীয় পক্ষের lib আমদানি সরিয়ে দিয়েছেন। অপসারিত liberal এর সংক্ষিপ্ত রূপ অন্তর্ভুক্ত from logging import handlersবা from logging import *এবং আপনার দেওয়া handlers। এবং অন্যান্য স্ক্রিপ্টে আপনার মতো কিছু ছিল import loggingএবং সবেমাত্র ব্যবহার হয়েছিল logging.handlersএবং আপনি ভেবেছিলেন যে জিনিসগুলি আমার মতো কাজ করার উপায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.