در قسمت اول مجموعه نوشتههای متغیرها در پایتون به تعریف آنها و بررسی مهمترین کاربردهای متغیرها در پایتون پرداخته شد. در این نوشته، سعی میشود قواعد و الزامات نامگذاری متغیرها در پایتون را به همراه best practice های نامگذاری متغیرها بررسی کنیم.
فهرست مطالب:
در مثالهای قسمت اول این مجموعه، از نامهای کوتاه و گاهاً بیمعنی برای نامگذاری متغیرها استفاده شد. اما در عمل، نام متغیر باید توصیفی نسبتاً کامل از محتوای آن داشته باشد تا خوانایی کد را افزایش دهد. به همین علت، نام متغیرها در واقعیت، معمولاً چند کلمهای و طولانیتر است. در ادامه به بررسی قواعد نامگذاری متغیرها در پایتون میپردازیم.
قواعد نامگذاری متغیرها در پایتون
نام متغیرها در پایتون محدودیتی از نظر طول ندارد اما میبایست شامل حروف کوچک (a-z)، حروف بزرگ (A-Z)، ارقام (9-0) و کاراکتر _ باشد. دقت کنید که نام متغیرها در پایتون میتواند شامل ارقام ۰ تا ۹ باشد اما نمیتواند با یک عدد شروع شود.
نام همه متغیرهای زیر از نظر قواعد نامگذاری متغیرها در پایتون، معتبر است:
>>> name = "Bob"
>>> year_of_birth = 1970
>>> is_adult = True
مثال زیر، یک نمونه از نامهای غیرمعتبر برای متغیرهای پایتونی است؛ چون با یک کاراکتر عددی شروع شده است:
>>> 1099_filed = False
File "<input>", line 1
1099_filed = False
^
SyntaxError: invalid decimal literal
دقت داشته باشید که نام متغیرها در پایتون، به کوچکی و بزرگ حروف حساس است:
>>> age = 1
>>> Age = 2
>>> aGe = 3
>>> AGE = 4
>>> age
1
>>> Age
2
>>> aGe
3
>>> AGE
4
اگرچه از نظر پایتون age و Age دو متغیر مجزا به حساب میآیند اما در عمل، استفاده همزمان از age و Age در یک برنامه توصیه نمیشود زیرا باعث سردرگمی سایر کسانی که کد شما را میخوانند میشود؛ یا حتی بعد از گذشت مدتی از کدنویسی، خود شما را دچار اشتباه خواهد کرد.
از آنجایی که استفاده از فاصله (space) بین کلمات نام یک متغیر مجاز نیست، کاراکتر _ به زیبایی میتواند در نقش جداکننده کلمات ظاهر شود و خوانایی کد شما را بهبود دهد:
>>> first_name = "John"
>>> pen_color = "red"
>>> next_node = 123
البته از نظر فنی، شما میتوانید نام متغیرهای خود را به صورت زیر نیز انتخاب کنید:
>>> firstname = "John"
>>> pencolor = "red"
>>> nextnode = 123
اما خوانایی این نوع نامگذاری به مراتب کمتر است و افرادی که میخواهند کد شما را استفاده کنند باید تلاش بیشتری برای فهم کلمات مجزا به خرج دهند.
بهترین الگوی نامگذاری متغیرها در پایتون
الان که با الزامات سینتکسی نامگذاری متغیرها در پایتون آشنا شدیم، سراغ بهترین الگوی نامگذاری متغیرها در پایتون یا اصطلاحاً best practice های نامگذاری متغیرها خواهیم رفت.
۱) همانطور که قبلتر اشاره شد، همواره باید نام متغیر، توصیف نسبتاً کامل و شفافی از محتوا و هدف آن باشد. گاهی اوقات میتوان با یک کلمه، نام توصیفی مناسبی انتخاب کرد:
>>> temperature = 25
>>> weight = 54.5
>>> message = "Hello, Pythonista!"
از آنجایی که متغیرها به آبجکتهای مشخصی اشاره دارند، از نظر دستور زبان، نام متغیرها باید یک اسم باشد. استفاده از کلمات عمومی مانند variable یا data یا value یا var میتواند خیلی کلی و گمراهکننده باشد. شاید این اسامی برای برخی تستها در محیط توسعه مناسب باشند اما برای کدهای یک برنامه واقعی در محیط پروداکشن، اکیداً توصیه نمیشوند!
۲) به صورت کلی، از نامهای تک حرفی برای متغیرهای خود اجتناب کنید:
>>> t = 25 # Don't do this
>>> temperature = 25 # Do this instead
رمزگشایی از نامهای تک حرفی برای کسانی که میخواهند کد شما را استفاده کنند، احتمالاً کاری عذابآور خواهد بود. این شیوه نامگذاری میتواند باعث سردرگمی و حتی ایجاد خطا شود. البته استثنائاتی برای این قضیه وجود دارد. مثلاً متغیرهایی که به عنوان اندیس شمارنده در حلقههای تو در تو استفاده میشوند عمدتاً با حروف i و j و k نامگذاری میشوند:
>>> matrix = [
... [9, 3, 8],
... [4, 5, 2]
... ]
>>> for i in matrix:
... for j in i:
... print(j)
...
9
3
8
4
5
2
به صورت مشابه، حروف x و y و z برای اشاره به مختصات نقاط بسیار پرکاربرد هستند.
۳) استفاده از کلمات اختصاری توصیه نمیشود زیرا ممکن است خواننده با آن کلمه اختصاری آشنا نباشد یا یک کلمه اختصاری، چندین معنی داشته باشد:
>>> doc = "Freud" # Don't do this
>>> doctor = "Freud" # Do this instead
اما اگر کلمه اختصاری مورد استفاده، به صورت عام شناخته شده است، کاربرد آن مشکلی ندارد:
>>> cmd = "python -m pip list"
>>> msg = "Hello, Pythonista!"
در این مثال، چون استفاده از کلمات cmd و msg به عنوان اختصار برای command و message بسیار متداول است، میتوان آنها را به عنوان نام متغیر به کار گرفت. کلمه cls نیز به کرات برای اشاره به آبجکت فعلی در متدهای کلاس استفاده میشود.
۴) همانطور که قبلتر اشاره شد، اگر در نامگذاری متغیرها از چندین کلمه استفاده میشود، بهتر است کاراکتر _ به عنوان جداکننده کلمات به کار برده شود.
به صورت کلی در نامگذاری متغیرهای چند کلمهای، شکلهای مختلفی از نوشتار امکانپذیر است:
- شیوه Snake case: همه کلمات با حروف کوچک نوشته میشوند و بین آنها کاراکتر _ به عنوان جداکننده استفاده میشود؛ مثل
number_of_students. - شیوه Camel case: اولین کلمه کاملاً با حروف کوچک نوشته میشود و حرف اول باقی کلمات، با حروف بزرگ نوشته میشود؛ مثل
numberOfStudents. - شیوه Pascal case: مشابه حالت قبل است با این تفاوت که حرف اول همه کلمات با حروف بزرگ نوشته میشود؛ مثل
NumberOfStudents.
طبق استاندارد جهانی PEP8 که در واقع راهنمای شیوه نوشتن صحیح کدهای پایتونی است، توصیه میشود از شیوه Snake case برای نامگذاری متغیرها در پایتون استفاده شود.
۵) استفاده از یک صفت در کنار یک اسم میتواند نام متغیر چندکلمهای شما را توصیفیتر و قابل فهمتر نماید:
>>> initial_temperature = 25
>>> current_file = "marketing_personnel.csv"
>>> next_point = (2, 4)
تذکر: استفاده از پیشوند _my هیچ ارزش افزودهای برای نام متغیر شما ندارد و توصیه میشود در پروژههای واقعی از کلماتی نظیر my_file و my_color و … استفاده نکنید.
۶) استفاده از پیشوندهای _is یا _has برای نامگذاری فلگها باعث افزایش خوانایی کدهای شما میشود:
>>> is_authenticated = True
>>> has_permission = False
۷) از آنجایی که لیستها و دیکشنریها در واقع یک ظرف یا کانتینر برای نگهداری مجموعهای از دادهها با تایپ مشابه هستند، استفاده از اسامی جمع توصیه میشود:
>>> fruits = ["apple", "banana", "cherry"]
>>> colors = {
... "Red": (255, 0, 0),
... "Green": (0, 255, 0),
... "Blue": (0, 0, 255),
... "Yellow": (255, 255, 0),
... "Black": (0, 0, 0),
... "White": (255, 255, 255),
... }
۸) چون تاپلها برای نگهداری مجموعهای از دادهها با تایپهای متفاوت به کار میروند، بهتر است از اسامی مفرد در نامگذاری آنها استفاده شود:
>>> row = ("Jane", 25, "Python Dev", "Canada")
۹) بین برنامهنویسان پایتون متداول است که نام متغیرهای non-public را با یک کاراکتر _ شروع کنند:
_timeout = 30
def get_timeout():
return _timeout
def set_timeout(seconds):
global _timeout
_timeout = seconds
یادآوری: متغیر non-public متغیری است که داخل یک ماژول یا کلاس تعریف شده و صرفاً همانجا استفاده میشود و کاربرد عمومی در باقی قسسمتها و کلاسها ندارد.
کلمات ممنوعه برای نامگذاری متغیرها در پایتون
برخی کلمات خاص که اصطلاحاً کلمه کلیدی یا keyword نامیده میشوند، از قبل توسط پایتون رزرو شدهاند. لیستی از این کلمات را میتوانید با اجرای دستور زیر، مشاهده کنید:
>>> import keyword
>>> keyword.kwlist
[
'False',
'None',
'True',
'and',
'as',
'assert',
'async',
...,
'yield'
]
در اغلب مواقع، استفاده از این کلمات به عنوان نام متغیر، منجر به نمایش خطای سینتکس میشود:
>>> class = "Business"
File "<input>", line 1
class = "Business"
^
SyntaxError: invalid syntax
این رفتار برای اغلب کلمات کلیدی صادق است. اگر اصرار دارید از این کلمات استفاده کنید، طبق توصیه PEP8 میتوانید یک کاراکتر _ به پایان آنها اضافه کنید:
>>> class_ = "Business"
گرچه برای بهبود خوانایی توصیه میشود این کلمات را با صفات یا کلمات دیگر ترکیب کنید تا توصیف بهتری از متغیر شما باشند:
>>> passenger_class = "Business"
برخی کلمات در اصطلاح soft keywords یا کلمه کلیدی نرم نامیده میشوند. برخلاف کلمات بالا، این کلمات فقط در یک ساختار مشخص جزء کلمات رزرو شده هستند و در باقی موارد میتوان از آنها به عنوان نام متغیر استفاده کرد. یک مثال کلاسیک از کلمات کلیدی نرم، کلمه match است. کلمه فقط در ساختارهای match/case به عنوان کلمه کلیدی شناخته میشود و به عنوان نام متغیر قابل استفاده نیست؛ اما در باقی موارد میتوان متغیری با نام match ایجاد کرد:
>>> import re
>>> text = "Some text containing a number: 123"
>>> match = re.search("123", text)
>>> if match:
... print("Found a match :D")
... else:
... print("No match found :(")
...
Found a match :D
شدیداً توصیه شده است که از نامهای پیشساخته (built-in) پایتون مثل list و tuple و zip به عنوان نام متغیر استفاده نشود؛ زیرا باعث بهم ریختن ساختار کلی کد میشود. به عنوان مثال کد زیر را در نظر بگیرید:
>>> list = [1, 2, 3, 4]
>>> list
[1, 2, 3, 4]
در اینجا کلمه list به عنوان نام متغیر استفاده شده و کد بدون مشکل اجرا شده است. اما با این کار، تعریف اصلی list برای پایتون از بین رفته و اگر در ادامه بخواهید از تابع list استفاده کنید، با خطا مواجه خواهید شد:
>>> list(range(10))
Traceback (most recent call last):
...
TypeError: 'list' object is not callable
نکته تکمیلی: برای مشاهده فهرست کاملی از اسامی پیشساخته پایتون میتوانید دستور زیر را در شل تعاملی پایتون خود اجرا کنید:
>>> import builtins
>>> dir(builtins)
[
'ArithmeticError',
'AssertionError',
'AttributeError',
...
'tuple',
'type',
'vars',
'zip'
]
این لیست نسبتاً طولانی است و احتمالاً بخاطر سپردن کامل آن، شدنی نباشد. پس میتوانید به سادگی با استفاده از دستورزیر، چک کنید که نام متغیر مدنظر شما در این لیست قرار دارد یا خیر!
>>> import builtins
>>> "name" in dir(builtins)
False
در سومین قسمت از مجموعه نوشتههای متغیرها در پایتون، به مباحث تکمیلی پیرامون متغیرها خواهیم پرداخت.