از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
پایتون: بررسی کنید که آیا متغیر یک دیکشنری است یا خیر
سرفصلهای مطلب
معرفی
متغیرها به عنوان یک عمل می کنند container برای ذخیره داده ها یک توسعهدهنده میتواند هنگام ایجاد متغیرها یا ارسال آرگومانها از تایپ اشارهها استفاده کند، با این حال، این یک ویژگی اختیاری در پایتون است و بسیاری از پایگاههای کد، قدیمی و جدید، هنوز آنها را ندارند. معمولتر است که متغیری در پایتون هیچ اطلاعاتی از نوع ذخیرهشده نداشته باشد.
اگر کدی داشتیم که نیاز به فرهنگ لغت داشت، اما فاقد نکات نوع بود، چگونه میتوانیم در صورت استفاده از متغیر از خطا جلوگیری کنیم نیست یک دیکشنری؟
در این آموزش نگاهی به این خواهیم داشت چگونه بررسی کنیم که آیا یک متغیر یک فرهنگ لغت در پایتون است یا خیر، با استفاده از type()
و isinstance()
توابع، و همچنین is
اپراتور:
توسعه دهندگان معمولا استفاده می کنند type()
و is
اگرچه، اینها می توانند در زمینه های خاصی محدود شوند، در این صورت، بهتر است از آن استفاده کنید isinstance()
تابع.
بررسی کنید که آیا متغیر یک دیکشنری با است type()
ما می توانیم استفاده کنیم type()
تابعی برای دریافت فوری نوع هر متغیر. برای یک متغیر از نوع Dictionary
، باید برگردد <class 'dict'>
:
squares = {1: 1, 2: 4, 3: 9}
print(type(squares))
این منجر به:
<class 'dict'>
بررسی کنید که آیا متغیر یک دیکشنری با است است اپراتور
در پایتون، is
یک اپراتور هویت است. بررسی می کند که آیا هر دو عملوند با یکدیگر یکسان هستند یا خیر. یکسان بودن نشان می دهد که آنها به یک مکان حافظه اشاره می کنند.
ما می توانیم استفاده کنیم is
عملگر با نتیجه a type()
تماس با متغیر و dict
کلاس خروجی خواهد داشت True
فقط در صورتی که type()
به همان محل حافظه اشاره می کند dict
کلاس در غیر این صورت خروجی خواهد داشت False
.
به عنوان یک بررسی سلامت عقل، می توانیم از آن استفاده کنیم id()
تابع برای دریافت آدرس شی در حافظه و تأیید مقایسه:
squares = {1: 1, 2: 4, 3: 9}
print(type(squares) is dict)
print("memory address of type(squares):", id(type(squares)))
print("memory address of dict:", id(dict))
این کد خروجی زیر را تولید می کند روی یک مفسر پایتون:
True
memory address of type(squares): 1609576584
memory address of dict: 1609576584
توجه داشته باشید: آدرس حافظه ممکن است برای شما متفاوت باشد، اما شناسه یکسانی باید برای هر دو موجود باشد type(squares)
و dict
.
یکی از اخطارهای این روش این است که اگر متغیر از نوع زیر کلاسی باشد، کار نمی کند. dict
. به عنوان مثال، اگر کد قبلی کار نمی کند squares
متغیر یک بود دیکشنری سفارشی بجای:
from collections import OrderedDict
squares = OrderedDict(((1, 1), (2, 4), (3, 9)))
print(type(squares) is dict)
print("memory address of type(squares):", id(type(squares)))
print("memory address of dict:", id(dict))
این خروجی:
False
memory address of type(squares): 9464512
memory address of dict: 9481952
اگر کد شما برای کار کردن لازم است روی زیر کلاس های دیکشنری ها، پس ترجیح می دهید از آن استفاده کنید isinstance()
روش.
بررسی کنید که آیا متغیر یک دیکشنری با است instance()
همانطور که دیدیم، is
اپراتور باز خواهد گشت True
زمانی که آدرس حافظه هر دو شیء یکسان باشد. اگر دیکشنری از نوع به ارث رسیده از کلاس داشته باشیم dict
، باز می گردد False
. به عنوان مثال، دیکشنری از یک زیر کلاس از dict
پسندیدن OrderedDict
یا defaultdict
به همان آدرس حافظه اشاره نخواهد کرد dict
.
در اینجا ما آن را داریم isinstance()
برای نجات عمل کند. این تابع دو آرگومان می گیرد. یک شی و یک کلاس اگر شی نمونه ای از کلاس یا زیر کلاس های آن باشد، برمی گردد True
. اگر شیء نمونه ای از کلاس داده شده، خواه مستقیم یا غیر مستقیم نباشد، برمی گردد False
.
در اینجا یک مثال کد برای بررسی اینکه آیا متغیر یک دیکشنری است با استفاده از isinstance()
تابع:
from collections import OrderedDict
squares = {1: 1, 2: 4, 3: 9}
print(isinstance(squares, dict))
cubes = OrderedDict(((1, 1), (2, 8)))
print(isinstance(cubes, dict))
این کد خروجی زیر را تولید می کند روی یک مفسر پایتون:
True
True
نتیجه
این آموزش راه هایی را نشان می دهد که از طریق آنها می توانیم بررسی کنیم که آیا یک متغیر یک دیکشنری است یا خیر. ما برای اولین بار دیده ایم type()
تابعی که خروجی دارد <class 'dict'>
برای هر شی دیکشنری سپس ما شاهد استفاده از is
عملگر برای بررسی اینکه آیا نوع متغیر به آن اشاره دارد یا خیر dict
در محل حافظه این برمی گردد True
یا False
بر این اساس.
در نهایت، ما آن را دیده ایم is
در شناسایی اشیاء دیکشنری ارثی شکست می خورد. وقتی می خواهیم اشیاء ارثی را بگیریم، می توانیم از آن استفاده کنیم isinstance()
تابع. برمی گردد True
اگر شی به طور مستقیم یا غیر مستقیم نمونه ای از کلاس داده شده باشد (dict
در این مقاله)، و False
در غیر این صورت.
همانطور که هر دو این روش بازگشت True
یا False
، می توانیم به راحتی از آنها در دستورات شرطی استفاده کنیم. مگر اینکه صراحتاً بخواهید زیر کلاسهای آن را رد کنید dict
، isinstance()
تابع مطمئن ترین راه برای بررسی اینکه آیا یک متغیر یک دیکشنری است یا خیر است.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-12 09:37:04