পাইথনের স্কোপ এবং নেমস্পেসের মধ্যে সম্পর্ক কী?


12

অনেক সংস্থানগুলিতে আমি "স্কোপ" এবং "নেমস্পেস" একে অপরকে ব্যবহারযোগ্য হিসাবে পেয়েছি , যা কিছুটা বিভ্রান্ত বলে মনে হয় যেহেতু তারা বিভিন্ন জিনিস বোঝায়।

  • স্কোপ কোডের অঞ্চলটি সংজ্ঞা দেয় যেখানে একটি নাম উপলব্ধ available
  • এলজিবি নিয়মটি নামগুলি কীভাবে সন্ধান করা হয় তা নির্ধারণ করে।
  • নেমস্পেস এমন একটি জায়গা যেখানে আপনি নামগুলি সন্ধান করেন।

তারপরে আমি পড়লাম:

  • "নামগুলি যেখানে নির্দিষ্ট করা হয়েছে সেই অনুসারে একটি নামস্থানের সাথে আবদ্ধ হয় ..." (যা আমি বিশ্বাস করি যে লেক্সিকাল স্কোপিংয়ের স্কোপগুলি সম্পর্কিত চুক্তি)।
  • "ফাংশনগুলি আপনার প্রোগ্রামগুলিতে একটি অতিরিক্ত নেমস্পেস স্তর যুক্ত করে" [ রেফ। ] (তারা কি কোনও অতিরিক্ত স্থানীয় সুযোগ যুক্ত করে না?)
  • "একটি ফাংশন সংজ্ঞায়নের জন্য নির্ধারিত সমস্ত নাম স্থানীয় স্কোপে রাখা হয় (ফাংশন কলের সাথে যুক্ত নামস্থান)" "
  • "গ্লোবাল স্কোপ — এটি হ'ল একটি নেমস্পেস যেখানে মডিউল ফাইলের শীর্ষ স্তরের লাইভ লাইভে ভেরিয়েবল তৈরি (নির্ধারিত) করা হয়েছে।"

* সমস্ত উদ্ধৃতি পাইথন 5 ম সংস্করণ ch17 শিখার দ্বারা

স্কাইপগুলি বাস্তবায়িত করার জন্য পাইথনের নেমস্পেসগুলি কী? তারা একই জিনিস? কেউ কি আমাকে আলোকিত করতে পারেন?


1
আপনি কি উদ্ধৃতিগুলির জন্য রেফারেন্স সরবরাহ করতে পারেন - আমি একটি খুঁজে পেতে পারলাম, তবে অন্যটি নয়।
jonrsharpe

1
নেমস্পেসগুলি কেবল এক ধরণের সুযোগ। স্ট্যাকওভারফ্লো.com
রবার্ট হার্ভে

উত্তর:


16

একটি নেমস্পেস একটি অভিধান, মানগুলিতে মানগুলি ম্যাপিং (স্ট্রিং হিসাবে) মানগুলিতে। আপনি যখন কোনও অ্যাসাইনমেন্ট করেন, যেমন a = 1আপনি কোনও নেমস্পেস পরিবর্তন করছেন। আপনি যখন কোনও রেফারেন্স তৈরি করেন, ঠিক print(a)তেমনি, পাইথন নামের জায়গাগুলির একটি তালিকা হিসাবে কী হিসাবে নামটির সাথে একটি চেষ্টা করে দেখতে চেষ্টা করে looks

কোন স্কোপটি সংজ্ঞায়িত করে যে কোন নেমস্পেসগুলি এবং কোন ক্রমে সন্ধান করা হবে। কোন রেফারেন্স সুযোগ সবসময় স্থানীয় নামস্থান মধ্যে শুরু হয়, এবং বাহিরের দিকে প্যাচসমূহ পর্যন্ত এটি মডিউল এর বিশ্বব্যাপী নামস্থান পৌঁছালে, যাওয়ার আগে builtins(নামস্থান যে রেফারেন্স পাইথন এর পূর্বনির্ধারিত কার্যকারিতা ও ধ্রুবক, মত rangeএবং getattr), যা লাইন শেষ হয় ।

কল্পনা করুন আপনার নামের একটি ফাংশন রয়েছে , innerনামটি দেওয়া একটি বিশ্বব্যাপী ফাংশনটির মধ্যে বাসা বেঁধেছে outerএবং innerএকটি নামের সাথে একটি রেফারেন্স রয়েছে। পাইথন প্রথমে innerনেমস্পেসে দেখায় । নামটি যদি সেখানে না থাকে তবে পাইথন তারপরে outerনেমস্পেসে তাকান। যদি এটি ব্যর্থ হয়, পাইথন মডিউলটির globalনামস্থান, তারপরে নামস্থান চেষ্টা করে builtin, NameErrorনামটি না পাওয়া গেলে অবশেষে একটি নিক্ষেপ করে ।

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

আপনি যখনই কোনও ফাংশন সংজ্ঞায়িত করেন, আপনি একটি নতুন নেমস্পেস এবং একটি নতুন সুযোগ তৈরি করেন। নেমস্পেস হল নামের নতুন, স্থানীয় হ্যাশ। সুযোগটি হ'ল নেমস্পেসগুলির অন্তর্নিহিত শৃঙ্খলা যা নতুন নেমস্পেসে শুরু হয়, তারপরে কোনও বাহ্যিক নেমস্পেস (বাইরের স্কোপস), গ্লোবাল নেমস্পেস (গ্লোবাল স্কোপ) অবধি এবং বিল্টিনগুলি পর্যন্ত কাজ করে।

পদগুলি প্রায় বিনিময়যোগ্য হিসাবে ব্যবহার করা যেতে পারে, তবে তা এগুলি নয় কারণ তারা একই জিনিস বোঝায়; কারণ তারা যা বোঝায় তাতে তারা প্রচুর পরিমাণে ওভারল্যাপ করে।


3
"পদগুলি প্রায় বিনিময়যোগ্যভাবে ব্যবহার করা যেতে পারে, তবে এটি একই জিনিসটির অর্থ হ'ল না; কারণ তারা যা বোঝায় তাতে তারা প্রচুর পরিমাণে ছড়িয়ে পড়ে p"
নিকোস

2
এই উত্তরটি স্পিরিটে সঠিক, তবে বিশদে ভুল। পাইথনের ক্লাসগুলি একটি নতুন নেমস্পেসের প্রবর্তন করে না, এ কারণেই শ্রেণীর বৈশিষ্ট্যগুলি অবশ্যই শ্রেণীর নামের সাথে যোগ্যতা অর্জন করতে হবে এবং উদাহরণ বৈশিষ্ট্যগুলি উদাহরণের নামের সাথে কেন যোগ্য হতে হবে। পাইথনের ভিতরের থেকে বাইরের বাইরের নেমস্পেসের স্তরগুলি হ'ল স্থানীয়, এনক্লোজিং, গ্লোবাল এবং বিল্ট-ইন। এই স্তরের যে কোনও একটিতে কোনও শ্রেণি সংজ্ঞায়িত করা যেতে পারে তবে একটি শ্রেণির সদস্যদের অবশ্যই সর্বদা যোগ্য হতে হবে।
রব স্মলশায়ার

তুমি ঠিক বলছো. ক্লাসগুলি আমি বলেছি যেভাবে তারা কাজ করে না do আমি ভাবছিলাম তারা কোনও ফাংশনের মতো একটি লেজিকাল স্কোপ তৈরি করে, তবে তারা তা করে না। আপনার কাছে সময় থাকলে উত্তরটি আপডেট করুন, অন্যথায় আমি এটি কোনও সময়ে করব some ধন্যবাদ।
কার্ল স্মিথ

1
+1 উজ্জ্বল উত্তর, এত সূক্ষ্মতা এতটা অর্থনৈতিকভাবে আবদ্ধ করে। আমি এটি খুব সহায়ক পেয়েছি, আপনাকে ধন্যবাদ!
সন্ধানকারী

1
"একজন নামস্থান নাম, মান জোড়া, একটি পাইথন অভিধান মত অনেক একটি হ্যাশ হয়" - আমি নিশ্চিত নামব্যবধান আছি করছে পাইথন অভিধান যেমন সংরক্ষণ করা হয়। উদাহরণস্বরূপ, আপনি গ্লোবাল () কল করে গ্লোবাল নেমস্পেসটি সম্পাদনা করতে পারেন, যা আপনাকে সরাসরি শব্দ এবং বস্তুগুলির নামগুলি বাঁধতে অভিধানে পরিবর্তন করতে দেয়: উদাহরণস্বরূপ গ্লোবাল () [নাম] = "অবজেক্ট"। অন্যথায় দুর্দান্ত উত্তর।
ইভান রোজিকা

4

পাইথন নেমস্পেসে এখানে একটি দুর্দান্ত নিবন্ধ রয়েছে । স্কোপ এবং নেমস্পেসের মধ্যে রেফারেন্স সম্পর্কে আপনার প্রশ্নের উত্তর দেওয়ার জন্য প্রাসঙ্গিক অংশটি উদ্ধৃত করতে:

একটি স্কোপ এমন একটি প্রোগ্রামের অঞ্চলকে বোঝায় যেখানে একটি উপসর্গ ব্যতীত একটি নেমস্পেসে প্রবেশ করা যায়।

উদাহরণস্বরূপ, একটি সাধারণ ডাই-রোলিং প্রোগ্রামটি কল্পনা করুন:

import random  # 'random' is in module namespace

def roll(sides=6):  # 'roll' is in module namespace, 'sides' is in roll's
    return random.randint(1, sides)  # both 'random' and 'sides' are in scope here

# but sides can't be accessed out here 

roll নিজস্ব নামস্থান হয়েছে , কিন্তু মডিউল এর নামস্থানে নাম সুযোগ এছাড়াও


@ কার্লস্মিত নোট করুন যে প্রারম্ভিক পাইথন ডকুমেন্টেশন একই জিনিস বলেছিল : "স্কোপটি পাইথন প্রোগ্রামের একটি পাঠ্য অঞ্চল যেখানে একটি নাম স্থান সরাসরি অ্যাক্সেসযোগ্য" "সরাসরি অ্যাক্সেসযোগ্য" 'এর অর্থ একটি নামের একটি অযোগ্য রেফারেন্স নামটি সন্ধানের চেষ্টা করে নামের
জায়গাতে

@ কার্লস্মিথ অতিরিক্ত-স্থানীয় / ঘের বন্ধনের সুযোগকে বাদ দিয়ে কি এতটা পরিবর্তন হয়েছে? আমি মনে করি আমরা একই জিনিসটি বলছি - একটি নেমস্পেসে নাম এবং মান রয়েছে এবং সুযোগটি আপনাকে জানিয়ে দেয় যে কোন নেমস্পেসগুলি অ্যাক্সেসযোগ্য।
jonrsharpe

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