পাইথন মডিউলটি আমদানি করা হয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


91

আমি কোডের কোথাও কোনও মডিউল আমদানি করেছি কিনা তা আমি কীভাবে চেক করব?

 if not has_imported("somemodule"):
     print('you have not imported somemodule')

আমি ইতিমধ্যে একটি মডিউল আমদানি করেছি কিনা তা যাচাই করতে চাই তার কারণ হ'ল আমার কাছে এমন একটি মডিউল রয়েছে যা আমি আমদানি করতে চাই না কারণ মাঝে মাঝে এটি আমার প্রোগ্রামকে গোলযোগ করে।


raise SystemError()আপনি যে মডিউলটি আমদানি করতে চান না তার উপরে কেবল (বা আপনার পছন্দের অন্যান্য ব্যতিক্রম) রাখুন। আপনি যদি না আসলে কোথাও আমদানি করতে, আপনার প্রোগ্রাম একটি ট্রেসব্যাক করে প্রস্থান নিক্ষেপ করা হবে।
লার্স্ক

কীভাবে কোনও মডিউল আমদানি করা আপনার প্রোগ্রামকে বিশৃঙ্খলা তৈরি করে? খুব সম্ভবত শব্দ হয় না।
বিল উড্ডার


নিবন্ধন করুন এবং আমদানি এত নিরপেক্ষ শব্দ।
বিল উড্ডার

উত্তর:


122

sys.modulesঅভিধানে মডিউল নামের পরীক্ষা করুন :

import sys

modulename = 'datetime'
if modulename not in sys.modules:
    print 'You have not imported the {} module'.format(modulename)

ডকুমেন্টেশন থেকে:

এটি একটি অভিধান যা মডিউলগুলিতে মডিউলগুলির মানচিত্র তৈরি করে যা ইতিমধ্যে লোড হয়ে গেছে।

নোট করুন যে একটি importবিবৃতি দুটি কাজ করে:

  1. যদি মডিউলটি আগে কখনও আমদানি করা হয়নি (== উপস্থিত না থাকে sys.modules), তবে এটি লোড এবং এতে যুক্ত হয় sys.modules
  2. মডিউল অবজেক্টকে বা মডিউল নেমস্পেসের সদস্য হওয়া অবজেক্টগুলিকে রেফারেন্স করে বর্তমান নেমস্পেসে 1 বা আরও বেশি নাম বেঁধে রাখুন।

modulename not in sys.modulesপদক্ষেপ 1 স্থান নিয়েছে কিনা এক্সপ্রেশন পরীক্ষা করে। পদক্ষেপ 2 এর ফলাফলের জন্য পরীক্ষার জন্য জেনে রাখা উচিত যে সঠিক অবয়বটি কীভাবে importব্যবহৃত হয়েছিল কারণ তারা বিভিন্ন বস্তুর রেফারেন্সের জন্য বিভিন্ন নাম নির্ধারণ করে:

  • import modulename সেট modulename = sys.modules['modulename']
  • import packagename.nestedmoduleসেট packagename = sys.modules['packagename'](আপনি কতগুলি অ্যাডিয়োনাল স্তর যুক্ত করেন তা নয়)
  • import modulename as altname সেট altname = sys.module['modulename']
  • import packagename.nestedmodule as altname সেট altname = sys.modules['packagename.nestedmodule']
  • from somemodule import objectname সেট objectname = sys.modules['somemodule'].objectname
  • from packagename import nestedmodulenameসেট nestedmodulename = sys.modules['packagename.nestedmodulename'](কেবলমাত্র যখন কোন নামে বস্তুর ছিল nestedmodulenameমধ্যে packagenameএই আমদানি আগে নামস্থান, নেস্টেড মডিউলের জন্য একটি অতিরিক্ত নাম পিতা বা মাতা প্যাকেজ নামস্থান এই সময়ে যোগ করা হয়)
  • from somemodule import objectname as altname সেট altname = sys.modules['somemodule'].objectname
  • from packagename import nestedmodulename as altnameসেট altname = sys.modules['packagename.nestedmodulename'](কেবলমাত্র যখন কোন নামে বস্তুর ছিল nestedmodulenameমধ্যে packagenameএই আমদানি আগে নামস্থান, নেস্টেড মডিউলের জন্য একটি অতিরিক্ত নাম পিতা বা মাতা প্যাকেজ নামস্থান এই সময়ে যোগ করা হয়)

আমদানি করা অবজেক্টটি যে নামটিতে আবদ্ধ ছিল সেই নামটি যদি প্রদত্ত নেমস্পেসে উপস্থিত থাকে তবে আপনি পরীক্ষা করতে পারেন:

# is this name visible in the current scope:
'importedname' in dir()

# or, is this a name in the globals of the current module:
'importedname' in globals()

# or, does the name exist in the namespace of another module:
'importedname' in globals(sys.modules['somemodule'])

এটি কেবল আপনাকে নামটি উপস্থিত রয়েছে (আবদ্ধ হয়েছে) সম্পর্কে বলবে, যদি না এটি মডিউলটির কোনও নির্দিষ্ট মডিউল বা বস্তুকে বোঝায়। আপনি যদি সেই অবজেক্টটি পরীক্ষা করতে পারেন বা এটি পরীক্ষা করতে পারেন তবে এটি যদি উপস্থিত থাকে তবে একই জিনিস sys.modules, যদি আপনার নামটি পুরোপুরি পুরোপুরি সেট করা শুরু হয় তবে এটি রক্ষণ করতে হবে।


4
কোনও ফাংশনের অভ্যন্তরে প্রয়োজনীয় প্যাকেজটি পরীক্ষা করার এটি কি সেরা উপায়? অর্থ্যাৎ কিছু ফাংশনের জন্য numpyপ্যাকেজ দরকার - import sysফাংশনটির ভিতরে এটি আমদানি করা হয়েছে কি না তা পরীক্ষা করে সেরা ব্যবহার করা হয়? "সেরা" দ্বারা আমি পারফর্মেন্স ইফেক্টের শব্দটি বোঝাতে চাইছি যতক্ষণ import sysনা ততবার প্রতিটি ফাংশন বলা হবে। আপনাকে ধন্যবাদ
হতবুদ্ধি

আপনি যদি উদ্বিগ্ন হন তবে আপনি সহজেই ফাংশনের বাইরে সিএস আমদানি করতে পারেন @ এটি import sysকোনওভাবেই ব্যয়বহুল নয়; sysসর্বদা বিদ্যমান, এটি ডিফল্টরূপে ইতিমধ্যে লোড হয়েছে। তবে একটি alচ্ছিক প্যাকেজের জন্য: কেবল প্যাকেজটি আমদানি করুনImportErrorপ্যাকেজটি ইনস্টল না থাকলে ব্যতিক্রমটি ধরুন এবং আমদানি সফল হলে এটি ইনস্টল করা হবে এমন একটি পতাকা সেট করুন। এর পরে আপনি useচ্ছিক নির্ভরতা আপনার ব্যবহার জানাতে পতাকা ব্যবহার করতে পারেন।
মার্টিজন পিটারস

@ কনফাউন্ডড পরীক্ষাটি কেবল name in sys.modulesতখনই কার্যকর যখন আপনি আমদানি করতে চান না
মার্টিজন পিটারস

24

Sys.modules এর উত্তর গ্রহণ করাতে, আমি আমদানিতে মডিউলগুলির নামকরণের বিষয়ে সতর্ক হতে একটি সাবধানতা যুক্ত করব:

>>> import sys
>>> import datetime as dt
>>> 'dt' in sys.modules
False
>>> 'datetime' in sys.modules
True

18

কোনও মডিউল আমদানি করা হয়েছে কিনা তা পরীক্ষা করতে sys.modules ব্যবহার করুন (আমি উদাহরণ হিসাবে ইউনিকোডেটা ব্যবহার করছি):

>>> import sys
>>> 'unicodedata' in sys.modules
False
>>> import unicodedata
>>> 'unicodedata' in sys.modules
True

5

sys.modules বর্তমান দোভাষীর যে কোনও জায়গায় ব্যবহৃত সমস্ত মডিউল রয়েছে এবং তাই অন্য কোনও পাইথন মডিউলে আমদানি করা থাকলে তা প্রদর্শিত হবে if

dir() নামটি বর্তমান নামস্থানে সংজ্ঞায়িত করা হয়েছে কিনা তা পরীক্ষা করে।

2 এর সংমিশ্রণ প্রতিটি পৃথকের চেয়ে বেশি সুরক্ষিত এবং যতক্ষণ আপনি copyনিজের কোনও সংজ্ঞা দেননি ততক্ষণ কাজ করে ।

if ('copy' in sys.modules) and ('copy' in dir()):

0
if "sys" not in dir():
  print("sys not imported!")

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