فضای نام (namespace) چیست؟
فضای نام، سیستمی است که در آن هر شیء در پایتون، نامی منحصر به فرد دارد. این شیء ممکن است متغیر یا متد باشد. پایتون خودش با استفاده از یک دیکشنری، فضای نام را مدیریت میکند.
بیایید این موضوع را با مثالی سادهتر در سایت دیتایاد بررسی کنیم؛ مانند ساختار پوشهها و فایلها در کامپیوتر. طبیعتاً میتوان در پوشههای مختلف، فایلهایی با نام مشابه داشت. اما فقط در صورتی میتوان به هر یک از این فایلهای همنام دسترسی داشت، که مسیر کامل آن را ذکر کنیم.
در مثالی دیگر، فضای نام مثل نام خانوادگی عمل میکند. شاید در یک کلاس، چندین نفر به نام “آلیس” باشند، اما وقتی از “آلیس لی” یا “آلیس کلارک” صحبت میکنیم، فقط یک نفر مشخص میشود (با فرض اینکه نام و نام خانوادگی یکسان برای چند دانشآموز وجود ندارد).
مفسر پایتون هم بر اساس فضای نام میفهمد که دقیقاً به کدام متد یا متغیر در کد اشاره میکنید.
تفکیک کلمه namespace، اطلاعات بیشتری به ما میدهد. “نام” (name) (به معنی شناسهای منحصر به فرد) به اضافه “فضا” (space) (که به دامنه اسم اشاره دارد). در اینجا، “نام” میتواند به هر متد یا متغیر پایتونی اشاره داشته باشد و “فضا” به مکانی که شخص میخواهد از آنجا به آن متغیر یا متد دسترسی پیدا کند، مرتبط است.
انواع فضاهای نام در پایتون
هنگامی که مفسر پایتون بدون استفاده از ماژولها، متدها، کلاسها و… ساخته شده توسط کاربر اجرا میشود، برخی توابع مانند print()، ()id همیشه وجود دارند و در دسترس هستند، و اینها فضاهای نام داخلی (built-in) هستند.
وقتی کاربر یک ماژول ایجاد میکند، یک فضای نام سراسری (جهانی – global) ایجاد میشود، و سپس با ایجاد توابع محلی، فضای نام محلی (local) به وجود میآید. فضای نام داخلی (built-in) فضای نام سراسری (global) را در برمیگیرد و فضای نام سراسری نیز فضای نام محلی (local) را در برمیگیرد.
طول عمر یک فضای نام
طول عمر یک فضای نام به دامنه اشیاء بستگی دارد، اگر دامنه یک شیء به پایان برسد، طول عمر آن فضای نام نیز به پایان میرسد. بنابراین، دسترسی به اشیاء یک فضای نام داخلی از یک فضای نام خارجی ممکن نیست.
مثال:
# var1 is in the global namespace var1 = 5 def some_func(): # var2 is in the local namespace var2 = 6 def some_inner_func(): # var3 is in the nested local # namespace var3 = 7
همانطور که در شکل زیر نشان داده شده است، یک نام شیء یکسان میتواند در چندین فضای نام مختلف وجود داشته باشد، اگر که ایزولاسیون بین نامهای یکسان توسط فضای نام آنها حفظ شود.
اگر بخواهید متغیرهای سراسری را پردازش و یا بهروزرسانی کنید، همانطور که در مثال زیر نشان داده شده است، باید به صراحت آن متغیر را به عنوان جهانی علامتگذاری کنید و سپس بهروزرسانی یا پردازش را انجام دهید. توجه داشته باشید که خط “count = count + 1” به متغیر سراسری ارجاع میدهد و بنابراین از متغیر سراسری استفاده میکند.
می توانید خط “global count” را حذف کرده و به جای آن عبارت count = 1 را بنویسید و خروجی اجرای برنامه را ببینید. سپس خواهید دید که اعلام global بودن در خط “global count” بر اساس قوانین دامنه کاملاً ضروری است.
# Python program processing # global variable count = 5 def some_method(): global count count = count + 1 print(count) some_method() print(count)
خروجی:
6
6
دامنه اشیاء در پایتون
دامنه به ناحیه کدنویسی اشاره دارد که از آنجا میتوان به یک شیء خاص پایتون دسترسی داشت. بنابراین نمیتوان از هر نقطهای از کد به یک شیء خاص دسترسی پیدا کرد، دسترسی باید توسط دامنه شیء مجاز باشد.
بیایید با یک مثال به درک دقیقتری از این موضوع دست پیدا کنیم:
مثال:
# Python program showing # a scope of object def some_func(): print("Inside some_func") def some_inner_func(): var = 10 print("Inside inner function, value of var:",var) some_inner_func() print("Try printing var from outer function: ",var) some_func()
خروجی:
Inside some_func Inside inner function, value of var: 10 Traceback (most recent call last): File "/home/1eb47bb3eac2fa36d6bfe5d349dfcb84.py", line 8, in some_func() File "/home/1eb47bb3eac2fa36d6bfe5d349dfcb84.py", line 7, in some_func print("Try printing var from outer function: ",var) NameError: name 'var' is not defined