PYLINT(1) Pylint PYLINT(1)

pylint - مستندات Pylint [تصویر]
https://github.com/pylint-dev/pylint/actions[تصویر]
https://codecov.io/gh/pylint-dev/pylint[تصویر: نسخه بسته PyPI] [تصویر]
https://pypi.python.org/pypi/pylint[تصویر: وضعیت مستندات] [تصویر]
https://pylint.readthedocs.io/en/latest/?badge=latest[تصویر]
https://github.com/ambv/black[تصویر]
https://github.com/pylint-dev/pylint[تصویر: وضعیت pre-commit.ci] [تصویر]
https://results.pre-commit.ci/latest/github/pylint-dev/pylint/main[تصویر: بهترین شیوه‌های CII] [تصویر]
https://bestpractices.coreinfrastructure.org/projects/6328[تصویر: کارت امتیاز OpenSSF] [تصویر]
https://api.securityscorecards.dev/projects/github.com/PyCQA/pylint[تصویر: Discord] [تصویر]
https://discord.gg/qYxpadCgkx

Pylint یک تحلیل‌گر ایستای کد https://en.wikipedia.org/wiki/Static_code_analysis برای Python 2 یا Python 3 است. آخرین نسخه از Python 3.10.0 و بالاتر پشتیبانی می‌کند.

Pylint کد شما را بدون اجرای واقعی آن تحلیل می‌کند. این ابزار خطاها را بررسی می‌کند، استانداردهای کدنویسی را اعمال می‌نماید، به دنبال بوی کد (code smells) https://martinfowler.com/bliki/CodeSmell.html می‌گردد و می‌تواند پیشنهادهایی دربارهٔ چگونگی بازآرایی (refactor) کد ارائه دهد.

برای استفاده در خط فرمان، pylint به صورت زیر نصب می‌شود:

pip install pylint

یا اگر می‌خواهید املای واژگان را نیز با enchant بررسی کنید (ممکن است لازم باشد کتابخانه C مربوط به enchant را نصب کنید https://pyenchant.github.io/pyenchant/install.html#installing-the-enchant-c-library):

pip install pylint[spelling]

همچنین می‌توان آن را با بیشتر ویرایشگرها یا IDEها یکپارچه کرد. اطلاعات بیشتر را می‌توانید در مستندات https://pylint.readthedocs.io/en/latest/user_guide/installation/index.html بیابید..SH "چه چیزی PYLINT را متمایز می‌کند؟ (WHAT DIFFERENTIATES PYLINT?)"

ابزار Pylint به تعیین نوع (typing) شما اعتماد نمی‌کند و مقادیر واقعی گره‌ها را با استفاده از نمایش کد داخلی خود (astroid) استنتاج می‌کند (در وهله اول به این دلیل که وقتی pylint آغاز به کار کرد، هنوز نوع‌بندی در پایتون وجود نداشت). اگر کد شما به صورت import logging as argparse باشد، Pylint می‌تواند بررسی کرده و متوجه شود که argparse.error(...) در واقع یک فراخوانی از logging است و نه فراخوانی argparse. این امر pylint را کندتر می‌کند، اما همچنین به آن اجازه می‌دهد در صورتی که کد شما به طور کامل تعیین نوع نشده باشد، مشکلات بیشتری را بیابد.

[استنتاج] ویژگی کلیدی و تعیین‌کننده‌ای است که باعث می‌شود با وجود کُندی دردناکش، همچنان از [pylint] در پروژه‌مان استفاده کنیم. - یک کاربر واقع‌بین pylint https://github.com/charliermarsh/ruff/issues/970#issuecomment-1381067064، 2022

ابزار pylint که هراسی از کمی کندتر بودن نسبت به وضعیت فعلی‌اش ندارد، بسیار دقیق‌تر و جامع‌تر از سایر لینترها عمل می‌کند. بررسی‌های بیشتری در آن گنجانده شده است، از جمله برخی بررسی‌های سلیقه‌ای (opinionated) که به صورت پیش‌فرض غیرفعال هستند اما می‌توان با استفاده از پیکربندی آن‌ها را فعال کرد.

ابزار Pylint باهوش‌تر از شما نیست: ممکن است درباره مواردی به شما هشدار دهد که آگاهانه انجام داده‌اید یا مواردی را بررسی کند که برایتان اهمیتی ندارند. در زمان به‌کارگیری، به‌ویژه در یک پروژه قدیمی (legacy) که pylint هرگز در آن اعمال نشده بود، بهتر است کار را با پرچم --errors-only آغاز کنید، سپس پیام‌های مربوط به قراردادها و بازسازی (refactor) را با --disable=C,R غیرفعال نمایید و به تدریج همگام با تحول اولویت‌هایتان، پیام‌ها را بازبینی و مجدداً فعال کنید.

ابزار Pylint بسیار پیکربندی‌پذیر است و امکان نگارش پلاگین‌ها را برای افزودن بررسی‌های دلخواهتان (برای نمونه، برای کتابخانه‌های داخلی یا یک قاعده داخلی) فراهم می‌کند. Pylint همچنین دارای زیست‌بومی از پلاگین‌های موجود برای چارچوب‌های محبوب و کتابخانه‌های شخص ثالث است.

نکته:

ابزار Pylint به صورت پیش‌فرض و بی‌درنگ از کتابخانه استاندارد پایتون پشتیبانی می‌کند. کتابخانه‌های شخص ثالث همیشه پشتیبانی نمی‌شوند، بنابراین ممکن است به یک پلاگین نیاز باشد. یک نقطه شروع مناسب PyPI است که اغلب با جستجوی pylint <library> یک پلاگین ارائه می‌دهد. نمونه‌هایی از این دست پلاگین‌ها عبارتند از: pylint-pydantic https://pypi.org/project/pylint-pydantic، pylint-django https://github.com/pylint-dev/pylint-django و pylint-sonarjson https://github.com/cnescatlab/pylint-sonarjson-catlab. اطلاعات بیشتر درباره پلاگین‌ها و نحوه بارگذاری آن‌ها را می‌توانید در plugins https://pylint.readthedocs.io/en/latest/development_guide/how_tos/plugins.html#plugins بیابید.

پروژه‌هایی که ممکن است بخواهید در کنار pylint استفاده کنید عبارتند از ruff https://github.com/astral-sh/ruff (بسیار سریع، به همراه تصحیح خودکار داخلی و تعداد زیادی بررسی برگرفته از لینترهای محبوب، اما پیاده‌سازی‌شده در rust) یا flake8 https://github.com/PyCQA/flake8 (چارچوبی برای پیاده‌سازی بررسی‌های دلخواهتان در پایتون با استفاده مستقیم از ast)، mypy https://github.com/python/mypy، pyright https://github.com/microsoft/pyright / pylance یا pyre https://github.com/facebook/pyre-check (بررسی‌های مربوط به تعیین نوع)، bandit https://github.com/PyCQA/bandit (بررسی‌های متمرکز بر امنیت)، black https://github.com/psf/black و isort https://pycqa.github.io/isort (قالب‌بندی خودکار)، autoflake https://github.com/myint/autoflake (حذف خودکار واردسازی‌ها یا متغیرهای استفاده‌نشده)، pyupgrade https://github.com/asottile/pyupgrade (ارتقای خودکار به نحو جدیدتر پایتون) و pydocstringformatter https://github.com/DanielNoord/pydocstringformatter (پیاده‌سازی خودکار pep257).

ابزار Pylint همراه با دو ابزار جانبی عرضه می‌شود:

ما از تمامی اشکال مشارکت استقبال می‌کنیم؛ مانند به‌روزرسانی مستندات، کدهای جدید، بررسی تکراری نبودن گزارش‌ها (issues) یا اطلاع دادن به ما برای بستن آن‌ها، تأیید اینکه مشکلات همچنان وجود دارند، باز کردن گزارش مشکل به دلیل یافتن یک باگ یا درخواست یک قابلیت https://pylint.readthedocs.io/en/latest/contact.html#bug-reports-feedback و غیره. هرگونه مشارکتی بسیار ارزشمند است!

لطفاً مرام‌نامه اخلاقی https://github.com/pylint-dev/pylint/blob/main/CODE_OF_CONDUCT.md را رعایت کرده و اگر مایل به مشارکت کدی هستید، راهنماهای مشارکت‌کنندگان https://pylint.readthedocs.io/en/latest/development_guide/contribute.html را مطالعه نمایید.

شما می‌توانید این نشان (badge) را در فایل README خود قرار دهید تا دیگران بدانند پروژه شما از pylint استفاده می‌کند.

نحوه افزودن نشان به مستندات خود را در مستندات نشان https://pylint.readthedocs.io/en/latest/user_guide/installation/badge.html بیاموزید.

ابزار pylint، به استثنای چند مورد ذکر شده در زیر، تحت GPLv2 https://github.com/pylint-dev/pylint/blob/main/LICENSE منتشر می‌شود.

فایل‌های آیکون تحت پروانه CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0 هستند:

این آموزش تماماً دربارهٔ مواجهه با استانداردهای کدنویسی، با دانش اندک یا بدون داشتن شناختی عمیق از برنامه‌نویسی یا خود استانداردهای کد است. این کار معادل نادیده گرفتن دفترچهٔ راهنما و پریدن مستقیم به میان کار است.

اعلان خط فرمان برای این مثال‌ها بدین صورت است:

tutor Desktop$

اجرای Pylint با آرگومان‌های --help دیدی کلی از آرگومان‌های موجود به شما می‌دهد. این کار را اکنون انجام دهید، مانند:

pylint --help

برخی از گزینه‌هایی که در اینجا بر آن‌ها تمرکز خواهیم کرد عبارتند از:

Commands:
  --help-msg=<msg-id>
  --generate-toml-config
Messages control:
  --disable=<msg-ids>
Reports:
  --reports=<y or n>
  --output-format=<format>

اگر به جزئیات بیشتری نیاز دارید، می‌توانید پیام راهنمای حتی طولانی‌تری را درخواست کنید:

pylint --long-help

به بخش پایانی خروجی این راهنمای طولانی‌تر دقت کنید. این بخش به شما نشان می‌دهد که Pylint قرار است به چه مواردی ایراد بگیرد:

Output:
   Using the default text output, the message format is :
  MESSAGE_TYPE: LINE_NUM:[OBJECT:] MESSAGE
  There are 5 kind of message types :
  * (C) convention, for programming standard violation
  * (R) refactor, for bad code smell
  * (W) warning, for python specific problems
  * (E) error, for probable bugs in the code
  * (F) fatal, if an error occurred which prevented pylint from doing
  further processing.

هنگامی که Pylint برای نخستین بار روی یک قطعه کد تازه اجرا می‌شود، یک شکایت رایج این است که بیش از حد پرسروصدا (noisy) است. پیکربندی پیش‌فرض هشدارهای زیادی را اعمال می‌کند. ما از برخی گزینه‌هایی که در بالا اشاره کردیم استفاده خواهیم کرد تا آن را کمی بیشتر با ترجیحات شما سازگار کنیم..SS "نخستین اجرای Pylint (Your First Pylint'ing)"

ما از یک اسکریپت پایه پایتون که ابزار black https://github.com/psf/black از قبل روی آن اعمال شده است، به‌عنوان محتوای نمونه برای آموزش خود استفاده خواهیم کرد. کد آغازی که به کار خواهیم برد simplecaesar.py نام دارد و در اینجا به‌صورت کامل آورده شده است:

#!/usr/bin/env python3
import string
shift = 3
choice = input("would you like to encode or decode?")
word = input("Please enter text")
letters = string.ascii_letters + string.punctuation + string.digits
encoded = ""
if choice == "encode":
    for letter in word:
        if letter == " ":
            encoded = encoded + " "
        else:
            x = letters.index(letter) + shift
            encoded = encoded + letters[x]
if choice == "decode":
    for letter in word:
        if letter == " ":
            encoded = encoded + " "
        else:
            x = letters.index(letter) - shift
            encoded = encoded + letters[x]
print(encoded)

بیایید شروع کنیم. اگر این دستور را اجرا کنیم:

tutor Desktop$ pylint simplecaesar.py
************* Module simplecaesar
simplecaesar.py:1:0: C0114: Missing module docstring (missing-module-docstring)
simplecaesar.py:5:0: C0103: Constant name "shift" doesn't conform to UPPER_CASE naming style (invalid-name)
simplecaesar.py:8:0: C0103: Constant name "letters" doesn't conform to UPPER_CASE naming style (invalid-name)
simplecaesar.py:9:0: C0103: Constant name "encoded" doesn't conform to UPPER_CASE naming style (invalid-name)
simplecaesar.py:13:12: C0103: Constant name "encoded" doesn't conform to UPPER_CASE naming style (invalid-name)
simplecaesar.py:15:12: C0103: Constant name "x" doesn't conform to UPPER_CASE naming style (invalid-name)
simplecaesar.py:16:12: C0103: Constant name "encoded" doesn't conform to UPPER_CASE naming style (invalid-name)
simplecaesar.py:20:12: C0103: Constant name "encoded" doesn't conform to UPPER_CASE naming style (invalid-name)
simplecaesar.py:22:12: C0103: Constant name "x" doesn't conform to UPPER_CASE naming style (invalid-name)
simplecaesar.py:23:12: C0103: Constant name "encoded" doesn't conform to UPPER_CASE naming style (invalid-name)
-----------------------------------
Your code has been rated at 4.74/10

می‌توانیم ببینیم که خط دوم چنین است:

"simplecaesar.py:1:0: C0114: Missing module docstring (missing-module-docstring)"

این موضوع اساساً بدین معناست که سطر ۱ در ستون ۰ از قرارداد C0114 عدول کرده است. بخش دیگری از اطلاعات، نماد پیام در میان پرانتزها، یعنی missing-module-docstring است.

اگر بخواهیم کمی بیشتر در این باره مطالعه کنیم، می‌توانیم به خط فرمان بازگردیم و این دستور را امتحان کنیم:

tutor Desktop$ pylint --help-msg=missing-module-docstring
:missing-module-docstring (C0114): *Missing module docstring*
  Used when a module has no docstring.Empty modules do not require a docstring.
  This message belongs to the basic checker.

این مورد کاملاً ساده و بدیهی بود، اما ممکن است با پیام‌های خطایی نیز روبرو شویم که با مفاهیم نظری کدِ مربوط به آن‌ها آشنایی نداشته باشیم..SS گام بعدی

حال که برخی از موارد پیکربندی را پشت سر گذاشتیم، بیایید ببینیم با هشدارهای باقی‌مانده چه کار می‌توانیم بکنیم. اگر یک docstring برای توصیف کاری که کد قرار است انجام دهد اضافه کنیم، کمک خواهد کرد. پیام‌های invalid-name وجود دارند که بعداً به آن‌ها خواهیم پرداخت. در اینجا کد به‌روزشده آمده است:

#!/usr/bin/env python3
"""This script prompts a user to enter a message to encode or decode
using a classic Caesar shift substitution (3 letter shift)"""
import string
shift = 3
choice = input("would you like to encode or decode?")
word = input("Please enter text")
letters = string.ascii_letters + string.punctuation + string.digits
encoded = ""
if choice == "encode":
    for letter in word:
        if letter == " ":
            encoded = encoded + " "
        else:
            x = letters.index(letter) + shift
            encoded = encoded + letters[x]
if choice == "decode":
    for letter in word:
        if letter == " ":
            encoded = encoded + " "
        else:
            x = letters.index(letter) - shift
            encoded = encoded + letters[x]
print(encoded)

در ادامه آنچه هنگام اجرای آن رخ می‌دهد آمده است:

tutor Desktop$ pylint simplecaesar.py
************* Module simplecaesar
simplecaesar.py:8:0: C0103: Constant name "shift" doesn't conform to UPPER_CASE naming style (invalid-name)
simplecaesar.py:11:0: C0103: Constant name "letters" doesn't conform to UPPER_CASE naming style (invalid-name)
simplecaesar.py:12:0: C0103: Constant name "encoded" doesn't conform to UPPER_CASE naming style (invalid-name)
simplecaesar.py:16:12: C0103: Constant name "encoded" doesn't conform to UPPER_CASE naming style (invalid-name)
simplecaesar.py:18:12: C0103: Constant name "x" doesn't conform to UPPER_CASE naming style (invalid-name)
simplecaesar.py:19:12: C0103: Constant name "encoded" doesn't conform to UPPER_CASE naming style (invalid-name)
simplecaesar.py:23:12: C0103: Constant name "encoded" doesn't conform to UPPER_CASE naming style (invalid-name)
simplecaesar.py:25:12: C0103: Constant name "x" doesn't conform to UPPER_CASE naming style (invalid-name)
simplecaesar.py:26:12: C0103: Constant name "encoded" doesn't conform to UPPER_CASE naming style (invalid-name)
------------------------------------------------------------------
Your code has been rated at 5.26/10 (previous run: 4.74/10, +0.53)

عالی است! Pylint به ما نشان داد که امتیاز کدمان از آخرین اجرا چقدر بهبود یافته است، و اکنون تنها پیام‌های invalid-name باقی مانده‌اند.

قراردادهای نسبتاً مشخصی پیرامون نام‌گذاری مواردی چون متغیرهای نمونه، توابع، کلاس‌ها و غیره وجود دارد. این قراردادها بر استفاده از حروف بزرگ (UPPERCASE) و کوچک (lowercase) و همچنین نویسه‌های جداکننده چند کلمه در نام تمرکز دارند. این مسئله برای بررسی از طریق عبارت باقاعده (regular expression) بسیار مناسب است، از این رو عبارت should match (([A-Z_][A-Z1-9_]*)|(__.*__))$ مطرح می‌شود.

در این حالت Pylint به ما می‌گوید که این متغیرها ثابت (constant) به نظر می‌رسند و باید تماماً با حروف بزرگ باشند. این یک قرارداد داخلی است که از بدو پیدایش Pylint همراه آن بوده است. شما نیز می‌توانید قراردادهای نام‌گذاری داخلی خود را ایجاد کنید اما برای اهداف این راهنما، می‌خواهیم به استاندارد PEP 8 https://peps.python.org/pep-0008 پایبند باشیم. در این مورد، متغیرهایی که تعریف کردیم باید از قرارداد حروف تماماً کوچک پیروی کنند. قاعده مناسب چیزی شبیه به این خواهد بود: "should match [a-z_][a-z0-9_]{2,30}$". به حروف کوچک در عبارت باقاعده (a-z در مقابل A-Z) توجه کنید.

اگر این قاعده را با استفاده از گزینه --const-rgx='[a-z\_][a-z0-9\_]{2,30}$' اجرا کنیم، اکنون خروجی بسیار ساکت‌تر خواهد بود:

tutor Desktop$ pylint simplecaesar.py --const-rgx='[a-z\_][a-z0-9\_]{2,30}$'
************* Module simplecaesar
simplecaesar.py:18:12: C0103: Constant name "x" doesn't conform to '[a-z\\_][a-z0-9\\_]{2,30}$' pattern (invalid-name)
simplecaesar.py:25:12: C0103: Constant name "x" doesn't conform to '[a-z\\_][a-z0-9\\_]{2,30}$' pattern (invalid-name)
------------------------------------------------------------------
Your code has been rated at 8.95/10 (previous run: 5.26/10, +3.68)

می‌توانید درباره عبارات باقاعده در https://docs.python.org/library/re.html مطالعه کنید یا از وب‌سایتی مانند https://regex101.com برای کمک گرفتن استفاده نمایید.

نکته:

مشخص کردن مداوم این عبارت باقاعده در خط فرمان واقعاً دردسرساز خواهد بود، به‌ویژه اگر از گزینه‌های بسیار دیگری نیز استفاده کنیم. فایل پیکربندی دقیقاً برای همین منظور است. می‌توانیم Pylint را به گونه‌ای پیکربندی کنیم که گزینه‌هایمان را برای ما ذخیره کند تا مجبور نباشیم آن‌ها را در خط فرمان تعریف کنیم. استفاده از یک فایل پیکربندی روش مناسبی برای رسمی کردن قواعد شما و اشتراک‌گذاری سریع آن‌ها با دیگران است. اجرای pylint --generate-toml-config یک بخش نمونه .toml با تمام گزینه‌های تنظیم‌شده و توضیح داده‌شده در کامنت‌ها ایجاد می‌کند. سپس می‌توان این بخش را به فایل pyproject.toml خود یا هر فایل .toml دیگری که با گزینه --rcfile مشخص شده اضافه کرد.

Pylint را می‌توان به روش‌های زیر نصب کرد:

  • به عنوان یک ابزار خط فرمان <#installation>
  • یکپارچه‌شده در ویرایشگر یا IDE شما <#ide-integration>
  • به عنوان یک قلاب pre-commit <#pre-commit-integration>
  • برای چندین مفسر python در یکپارچه‌سازی مداوم (CI) شما <#continuous-integration>

Pylint با استفاده از یک مدیر بسته قابل نصب است. مدیر بستهٔ شما نسخه‌ای سازگار با مفسر شما را پیدا خواهد کرد. ما pip را توصیه می‌کنیم:

pip install pylint

یا اگر می‌خواهید املا را نیز با enchant بررسی کنید (ممکن است به نصب کتابخانهٔ C مربوط به enchant نیاز داشته باشید https://pyenchant.github.io/pyenchant/install.html#installing-the-enchant-c-library):

pip install pylint[spelling]

جدیدترین نسخهٔ pylint از تمام مفسرهای Python که پایان عمرشان فرانرسیده است پشتیبانی می‌کند.

ما استفاده از آخرین مفسر را توصیه می‌کنیم زیرا به ماژول توکار ast متکی هستیم که با هر مفسر جدید Python بهبود می‌یابد. به عنوان مثال، یک مفسر Python 3.6 نمی‌تواند نحو 3.8 را تحلیل کند (به ویژه به دلیل عملگر جدید walrus)، در حالی که یک مفسر 3.8 می‌تواند با Python 3.6 نیز کار کند. برای جزئیات بیشتر به بخش استفاده از pylint با چندین مفسر <#continuous-integration> مراجعه کنید.

نکته:

شما همچنین می‌توانید از conda یا مدیر بستهٔ سیستم خود در سیستم‌عامل‌های مبتنی بر debian استفاده کنید. این مدیر بسته‌ها کمی عقب‌تر هستند چرا که توسط نهادی جداگانه با چرخهٔ انتشار کندتری نگهداری می‌شوند.
conda install pylint
sudo apt-get install pylint

Pylint را می‌توان در ویرایشگرها و IDEهای گوناگون ادغام کرد. در زیر می‌توانید راهنماهایی را برای برخی از متداول‌ترین آن‌ها پیدا کنید.

ابزار epylint در نسخهٔ 2.16.0 منسوخ شد و برای حذف در نسخهٔ 3.0.0 در نظر گرفته شده است. تمام فایل‌های مرتبط با emacs و flymake حذف شدند و پشتیبانی از آن‌ها اکنون در یک مخزن خارجی انجام خواهد شد: https://github.com/emacsorphanage/pylint.

Pylint را به روش معمول نصب کنید:

pip install pylint

بستهٔ Python را برای TextMate نصب کنید https://github.com/textmate/python.tmbundle:

1.
مسیر TextMate > Preferences را انتخاب کنید
2.
برگهٔ Bundles را انتخاب کنید
3.
بستهٔ Python را در فهرست پیدا کرده و تیک بزنید

اکنون باید آن را در Bundles > Python مشاهده کنید.

در Preferences، برگهٔ Variables را انتخاب کنید. اگر متغیر TM_PYCHECKER از پیش در فهرست نیست، آن را با مقدار pylint اضافه کنید.

میان‌بر پیش‌فرض صفحه‌کلید برای اجرای بررسی‌کننده نحو (syntax checker) کلیدهای Control-Shift-V است - یک فایل .py را در Textmate باز کرده و آن را آزمایش کنید.

باید خروجی را در یک پنجرهٔ جدید ببینید:

PyCheckMate 1.2 – Pylint 1.4.4

No config file found, using default configuration

آنگاه همه چیز روبه‌راه است و به احتمال زیاد Pylint نکاتی را دربارهٔ کد پایتون شما گوشزد کرده است (یا اگر کد شما از قبل با انتظارات آن مطابقت داشته باشد، با وضعیت 0 خارج خواهد شد).

اگر پیامی به این صورت دریافت کردید:

Please install PyChecker, PyFlakes, Pylint, PEP 8 or flake8 for more extensive code checking.

این پیام یعنی Pylint پیدا نشد، که احتمالاً ناشی از مشکلی در مسیرهای دستور است - TextMate باید در مسیرهای درستی به دنبال Pylint بگردد.

با استفاده از دستور which بررسی کنید که Pylint در کجا نصب شده است:

$ which pylint
/usr/local/bin/pylint

خروجی به شما خواهد گفت که Pylint کجا قرار دارد؛ در این مورد، در /usr/local/bin.

1.
مسیر TextMate > Preferences را انتخاب کنید
2.
برگهٔ Variables را انتخاب کنید
3.
بررسی کنید که متغیر PATH وجود داشته باشد و شامل مسیر مناسب باشد (اگر مسیر Pylint همان‌طور که در بالا آمد /usr/local/bin/pylint باشد، متغیر باید شامل /usr/local/bin باشد). یک نمونهٔ واقعی در این مورد می‌تواند $PATH:/opt/local/bin:/usr/local/bin:/usr/texbin باشد که شامل مسیرهای دیگر نیز می‌شود.

... و دوباره اجرای Pylint را امتحان کنید..SS یکپارچه‌سازی با Pre-commit (Pre-commit integration)

از pylint می‌توان به عنوان یک هوک pre-commit https://pre-commit.com استفاده کرد. با این حال ما استفاده از آن را توصیه نمی‌کنیم، چرا که pylint -- با توجه به سرعتش -- برای یک کار یکپارچه‌سازی پیوسته (CI) یا هوک pre-push در git مناسب‌تر است، به‌ویژه اگر مخزن شما بزرگ باشد.

از آنجا که pylint برای عملکرد صحیح نیاز به وارد کردن (import) ماژول‌ها و وابستگی‌ها دارد، این هوک تنها با نصب محلی pylint (در محیط شما) کار می‌کند. این بدان معناست که نمی‌توان از آن به همراه pre-commit.ci استفاده کرد و لازم است موارد زیر را به .pre-commit-config.yaml خود اضافه کنید:

.. sourcecode:: yaml
skip: [pylint]

محدودیت دیگر این است که pylint برای استنتاج بهینهٔ مقادیر واقعی ناشی از فراخوانی‌ها، باید تمام کد شما را به یک‌باره تحلیل کند. اگر تنها بخشی از فایل‌ها به آن داده شوند، ممکن است pylint نوع یک مقدار خاص را تشخیص ندهد و برای آن زیرمجموعه استنتاج ضعیف‌تری ارائه کند. از آنجا که pre-commit فایل‌های ورودی را به منظور موازی‌سازی پردازش تکه‌بندی (slice) می‌کند، ممکن است نتیجه دچار افت کیفیت شود. همچنین در صورت تغییر مجموعهٔ فایل‌ها، نتیجه ممکن است به شکلی غیرمنتظره متفاوت باشد چرا که برش‌بندی جدید می‌تواند استنتاج را تغییر دهد. بنابراین در صورتی که درستی و قطعیت (تکرارپذیری) برای شما اهمیت بیشتری نسبت به موازی‌سازی دارد، گزینهٔ require_serial باید روی true تنظیم شود.

اگر pylint را به صورت محلی نصب کرده‌اید، می‌توانید آن را به شکل زیر به .pre-commit-config.yaml بیفزایید:

- repo: local
  hooks:
    - id: pylint
      name: pylint
      entry: pylint
      language: system
      types: [python]
      require_serial: true
      args:
        [
          "-rn", # Only display messages
          "-sn", # Don't display the score
        ]

می‌توانید همان‌طور که در آموزش <#tutorial> شرح داده شده است، از args برای ارسال آرگومان‌های خط فرمان استفاده کنید. یک هوک با آرگومان‌های بیشتر می‌تواند شبیه به این باشد:

- repo: local
  hooks:
    - id: pylint
      name: pylint
      entry: pylint
      language: system
      types: [python]
      args:
        [
          "-rn", # Only display messages
          "-sn", # Don't display the score
          "--rcfile=pylintrc", # Link to your config file
          "--load-plugins=pylint.extensions.docparams", # Load an extension
        ]

امکان تحلیل کدهای نوشته‌شده برای مفسرهای قدیمی‌تر یا چندگانه با استفاده از گزینهٔ py-version و تنظیم آن روی قدیمی‌ترین مفسر پشتیبانی‌شده توسط کد شما وجود دارد. برای نمونه، می‌توانید بررسی کنید که هیچ f-stringsی در کد Python 3.5 وجود نداشته باشد در حالی که از Python 3.8 به همراه یک نسخهٔ به‌روز از pylint استفاده می‌کنید، حتی اگر دورهٔ پشتیبانی رسمی (EOL) از Python 3.5 به پایان رسیده باشد و نسخهٔ pylint مورد استفاده شما با آن سازگار نباشد.

ما تضمین نمی‌کنیم که py-version تا ابد برای تمام مفسرهای منسوخ‌شدهٔ پایتون کار کند (برای نسخه‌های قبل از Python 3.5 احتمالاً کار نخواهد کرد). اگر نسخهٔ جدیدتر برای شما کار نمی‌کند، بهترین pylint در دسترس ممکن است نسخهٔ قدیمی‌تری باشد که با مفسر قدیمی شما کار می‌کند، اما فاقد رفع اشکالات و قابلیت‌های نسخه‌های بعدی خواهد بود.

می‌توانید این نشان (badge) را در فایل README خود قرار دهید تا دیگران بدانند پروژهٔ شما از pylint استفاده می‌کند.

استفاده از نشان در فایل README.md پروژه (یا هر فایل Markdown دیگر):

[![linting: pylint](https://img.shields.io/badge/linting-pylint-yellowgreen)](https://github.com/pylint-dev/pylint)

استفاده از نشان در فایل README.rst پروژه (یا هر فایل rst دیگر):

.. image:: https://img.shields.io/badge/linting-pylint-yellowgreen
    :target: https://github.com/pylint-dev/pylint

اگر از GitHub Actions استفاده می‌کنید و یکی از گردش‌های کاری CI شما با "name: pylint" آغاز می‌شود، می‌توانید از نشان‌های وضعیت گردش‌کار گیت‌هاب https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/adding-a-workflow-status-badge#using-the-workflow-file-name برای نمایش وضعیت لحظه‌ای گذراندن موفق pylint در pushهای ارسالی به شاخهٔ پیش‌فرض خود استفاده کنید. برای اطلاعات دقیق‌تر، مستندات را بررسی کنید.

احتمالاً بهتر است نسخهٔ pylint را در محیط توسعهٔ خود تثبیت کنید تا بتوانید زمان ارتقای هشدارهای pylint را مدیریت نمایید. pylint از نسخه‌بندی معنایی (semver) پیروی می‌کند؛ اما ما نمی‌توانیم تضمین کنیم که خروجی برنامه در بین نسخه‌های مختلف کاملاً یکسان باقی بماند. معنای این امر این است که:

•
در انتشارهای وصله‌ای (patch release) (1.2.3)، ما فقط هشدارهای مثبت کاذب (false positives) و خرابی‌ها (crashes) را رفع می‌کنیم.

اگر نسخهٔ فرعی (minor) را ثابت نگه داشته و به یک نسخهٔ وصله‌ای جدید ارتقا دهید، می‌توانید انتظار پیام‌های کمتری را داشته باشید. با این وجود، فعال بودن useless-suppression به این معناست که پس از برطرف شدن یک مثبت کاذب که قبلاً آن را غیرفعال کرده بودید، ممکن است یک هشدار جدید useless-suppression دریافت کنید. همچنین، اگر کتابخانهٔ مورد استفاده شما ارتقا یافته باشد و رفتار آن نسبت به قبل بهتر یا بدتر تشخیص داده شود، ممکن است پیام‌های جدیدی نیز دریافت کنید.

•
در انتشارهای فرعی (minor releases) (1.2.0)، بررسی‌های جدیدی اضافه می‌کنیم، برخی بررسی‌ها را حذف می‌کنیم، مفسرهای پایتون منسوخ‌شده را کنار می‌گذاریم، نسخه‌های اصلی یا فرعی astroid را ارتقا داده و منفی‌های کاذب (false negatives) را رفع می‌کنیم.

در این حالت می‌توانید انتظار تغییرات بسیار بیشتری در خروجی داشته باشید که عمدهٔ آن مربوط به بررسی‌های جدید است.

•
در انتشارهای اصلی (major releases) (1.0.0)، باقی بخش‌ها را تغییر می‌دهیم (گزینه‌های pylint، خروجی json، رابط برنامه‌نویسی توسعه و...)، در حالی که همچنان سعی می‌کنیم اختلالات به حداقل ممکن برسد.

در این شرایط ممکن است لازم باشد دستوری را که اجرا می‌کنید یا افزونه و یکپارچه‌سازی ویرایشگر مورد استفادهٔ خود را تغییر دهید.

ابزار Pylint برای فراخوانی از خط فرمان طراحی شده است. نحوهٔ استفاده بدین صورت است:

pylint [options] modules_or_packages

به‌طور پیش‌فرض دستور pylint تنها فهرستی از ماژول‌ها و بسته‌های پایتون را می‌پذیرد. در نسخه‌های قبل از 2.15، تعیین دایرکتوری‌ای که یک بستهٔ صریح نباشد (حاوی __init__.py نباشد) به خطا منجر می‌شود:

pylint mydir
************* Module mydir
mydir/__init__.py:1:0: F0010: error while code parsing: Unable to load file mydir/__init__.py:
[Errno 2] No such file or directory: 'mydir/__init__.py' (parse-error)

بنابراین، در نسخه‌های قبل از 2.15 استفاده از گزینهٔ --recursive=y امکان تحلیل ایستای بسته‌های فضای نام (namespace package) را فراهم می‌کند:

pylint --recursive=y mydir mymodule mypackage

این گزینه باعث می‌شود pylint تلاش کند تمام ماژول‌ها (فایل‌های منتهی به پسوند .py) و تمام بسته‌های صریح (تمامی دایرکتوری‌های حاوی فایل __init__.py) را شناسایی کند.

ابزار Pylint این بسته یا ماژول را وارد (import) نخواهد کرد، اما برای تعیین مکان آن‌ها از ساختار درونی پایتون استفاده می‌کند و به همین دلیل مشمول همان قوانین و پیکربندی‌ها خواهد بود. شما باید به متغیر محیطی PYTHONPATH خود توجه داشته باشید، زیرا تحلیل نسخهٔ نصب‌شدهٔ یک ماژول به جای نسخهٔ در حال توسعهٔ آن یک خطای رایج است..SS روی فایل‌ها (On files)

همچنین تحلیل فایل‌های Python، با چند محدودیت، امکان‌پذیر است. برای سهولت کار، در صورتی که بتوان با استفاده از python path نام ماژول را از روی مسیر فایل تشخیص داد، می‌توانید نام فایل را به آن بدهید. چند مثال:

دستور pylint mymodule.py باید همیشه کار کند، چرا که دایرکتوری کاری فعلی به‌طور خودکار به ابتدای python path اضافه می‌شود

دستور pylint directory/mymodule.py کار خواهد کرد اگر: directory یک بستهٔ Python باشد (یعنی شامل یک فایل __init__.py باشد)، یک بستهٔ فضای‌نام ضمنی (implicit namespace package) باشد، یا اگر directory در python path قرار داشته باشد.

اگر سورس‌های تحلیل‌شده از بسته‌های فضای‌نام ضمنی (PEP 420) استفاده می‌کنند، ریشه(های) سورس باید با استفاده از گزینهٔ --source-roots مشخص شوند. در غیر این صورت، نام بسته‌ها به اشتباه تشخیص داده می‌شود، زیرا بسته‌های فضای‌نام ضمنی فاقد فایل __init__.py هستند.

همچنین امکان مشخص کردن دایرکتوری‌ها و فایل‌ها با استفاده از الگوهای تطبیق (globbing patterns) وجود دارد:

pylint [options] packages/*/src

پیش از هر چیز، دو گزینهٔ پایه (اما کاربردی) وجود دارد.

نمایش شمارهٔ نسخهٔ برنامه و خروج
نمایش راهنما دربارهٔ گزینه‌های خط فرمان

ابزار Pylint بر پایهٔ چندین بررسی‌کننده (checker) معماری شده است. شما می‌توانید یک بررسی‌کنندهٔ خاص یا برخی از پیام‌ها یا دسته‌های پیام آن را با مشخص کردن --disable=<symbol> غیرفعال کنید. اگر می‌خواهید تنها برخی از بررسی‌کننده‌ها یا برخی از نمادهای پیام را فعال کنید، ابتدا از --disable=all و سپس از --enable=<symbol> استفاده کنید که در آن <symbol> فهرستی از نام‌های بررسی‌کننده و نمادهای پیام جداشده با کاما است. برای شرح بررسی‌کننده‌های ارائه‌شده همراه با قابلیت‌هایشان، فهرست ویژگی‌های موجود را ببینید. گزینه‌های --disable و --enable را می‌توان با فهرست‌های جداشده با کاما شامل ترکیبی از بررسی‌کننده‌ها، شناسه‌های پیام و دسته‌ها مانند -d C,W,no-error,design به کار برد

غیرفعال کردن همهٔ پیام‌ها با --disable=all امکان‌پذیر است. این کار برای فعال کردن تنها چند بررسی‌کننده یا چند پیام، با ابتدا غیرفعال کردن همه‌چیز و سپس فعال‌سازی دوبارهٔ تنها مواردی که نیاز دارید، کاربردی است.

هر بررسی‌کننده گزینه‌های خاصی دارد که می‌توانند یک مقدار yes/no، یک عدد صحیح، یک عبارت باقاعدهٔ Python، یا فهرستی از مقادیر جداشده با کاما (که عموماً برای بازنویسی یک عبارت باقاعده در شرایط خاص استفاده می‌شوند) دریافت کنند. برای فهرست کامل گزینه‌ها، از --help استفاده کنید

مشخص کردن تمام گزینه‌های مناسب برای پیکربندی و استانداردهای کدنویسی شما می‌تواند خسته‌کننده باشد؛ بنابراین می‌توان از یک فایل پیکربندی برای تعیین مقادیر پیش‌فرض استفاده کرد. می‌توانید یک فایل پیکربندی را در خط فرمان با استفاده از گزینهٔ --rcfile مشخص کنید. در غیر این صورت، Pylint به ترتیب زیر به دنبال فایل پیکربندی می‌گردد و از اولین موردی که بیابد استفاده می‌کند:

1.
فایل pylintrc در دایرکتوری کاری فعلی
2.
فایل pylintrc.toml در دایرکتوری کاری فعلی، به شرطی که دست‌کم یک بخش tool.pylint. داشته باشد.
3.
فایل .pylintrc در دایرکتوری کاری فعلی
4.
فایل .pylintrc.toml در دایرکتوری کاری فعلی، به شرطی که دست‌کم یک بخش tool.pylint. داشته باشد.
5.
فایل pyproject.toml در دایرکتوری کاری فعلی، به شرطی که دست‌کم یک بخش tool.pylint. داشته باشد. در pyproject.toml باید نام بخش‌ها با پیشوند tool.pylint. آغاز شود، برای نمونه [tool.pylint.'MESSAGES CONTROL']. آن‌ها همچنین می‌توانند از طریق خط فرمان ارسال شوند.
6.
فایل setup.cfg در دایرکتوری کاری فعلی، به شرطی که دست‌کم یک بخش pylint. داشته باشد
7.
فایل tox.ini در دایرکتوری کاری فعلی، به شرطی که دست‌کم یک بخش pylint. داشته باشد
8.
ابزار Pylint برای یافتن فایل pyproject.toml سلسله‌مراتب دایرکتوری‌ها را به سمت بالا جستجو می‌کند، مگر آن‌که فایل پیدا شود، یا یک دایرکتوری .git/.hg یافت شود، یا به ریشهٔ سیستم‌فایل رسیده باشد.
9.
اگر دایرکتوری کاری فعلی در یک بستهٔ Python باشد، Pylint سلسله‌مراتب بسته‌های Python را به سمت بالا تا زمانی که یک فایل pylintrc بیابد جستجو می‌کند. این به شما امکان می‌دهد استانداردهای کدنویسی را بر پایهٔ هر ماژول مشخص کنید. البته، در صورتی یک دایرکتوری یک بستهٔ Python محسوب می‌شود که شامل یک فایل __init__.py باشد.
10.
فایل مشخص‌شده توسط متغیر محیطی PYLINTRC
11.
اگر یک دایرکتوری خانگی دارید که /root نیست:
1.
فایل .pylintrc در دایرکتوری خانگی شما
2.
فایل .config/pylintrc در دایرکتوری خانگی شما
12.
/etc/pylintrc

گزینهٔ --generate-toml-config یک فایل پیکربندی همراه با توضیحات را بر اساس پیکربندی فعلی در خروجی استاندارد تولید کرده و خارج می‌شود. این شامل موارد زیر است:

  • هر فایل پیکربندی پیدا شده همان‌گونه که در بالا توضیح داده شد
  • گزینه‌هایی که قبل از --generate-toml-config در خط فرمان Pylint آمده‌اند

البته شما همچنین می‌توانید با مقادیر پیش‌فرض شروع کرده و پیکربندی را به‌صورت دستی تنظیم کنید.

سایر گزینه‌های سراسری کاربردی عبارتند از:

فایل‌ها یا دایرکتوری‌هایی که باید نادیده گرفته شوند. آن‌ها باید نام پایه (base name) باشند، نه مسیر کامل.
انتخاب قالب خروجی (text، json، custom).
--msg-template=<template>
تغییر الگوی پیام خروجی متنی.
تولید پیام‌های pylint.
نمایش فهرستی از پیام‌هایی که با پیکربندی داده‌شده فعال و غیرفعال هستند.
تولید مستندات کامل pylint، در قالب reST.

امکان افزایش سرعت اجرای Pylint وجود دارد. اگر رایانه بیش از یک پردازنده (CPU) داشته باشد، کار بررسی تمامی فایل‌ها می‌تواند از طریق زیرپردازه‌های Pylint روی تمامی هسته‌ها تقسیم شود.

این قابلیت از طریق پارامتر خط فرمان -j ارائه می‌شود. اگر عدد ارائه‌شده 0 باشد، تعداد کل پردازنده‌ها به‌طور خودکار تشخیص داده شده و استفاده می‌شود.

مثال:

pylint -j 4 mymodule1.py mymodule2.py mymodule3.py mymodule4.py

این دستور ۴ زیرپردازهٔ موازی Pylint ایجاد می‌کند که در آن هر ماژول مشخص‌شده به‌طور موازی بررسی می‌شود. مشکلات کشف‌شده توسط بررسی‌کننده‌ها بلافاصله نمایش داده نمی‌شوند، بلکه درست پس از اتمام بررسی یک ماژول نشان داده خواهند شد.

شما همچنین می‌توانید موازی‌سازی مدنظر خود را با چند بار اجرای pylint روی زیرمجموعه‌هایی از فایل‌هایتان انجام دهید (مشابه رفتاری که pre-commit با مقدار پیش‌فرض require_serial=false انجام می‌دهد). با این حال آگاه باشید: pylint باید تمام کد شما را به یک‌باره تجزیه و تحلیل کند تا بتواند مقادیر واقعی حاصل از فراخوانی‌ها را به بهترین شکل استنتاج کند. اگر تنها بخشی از فایل‌ها به آن داده شود، ممکن است pylint نوع یک مقدار خاص را نادیده بگیرد و استنتاج ضعیف‌تری برای آن زیرمجموعه ارائه دهد. همچنین ممکن است با تغییر مجموعهٔ فایل‌ها، نتایج به‌طور غیرمنتظره‌ای متفاوت باشد؛ زیرا تقسیم‌بندی جدید می‌تواند استنتاج را تغییر دهد. بنابراین، اگر صحت و قطعی بودن نتایج برای شما مهم است، این کار را انجام ندهید.

برنامهٔ Pylint کدهای خروج کدگذاری‌شده با بیت (bit-encoded) را برمی‌گرداند.

کد خروج مفهوم
0 بدون خطا
1 پیام مهلک (fatal) صادر شده است
2 پیام خطا (error) صادر شده است
4 پیام هشدار (warning) صادر شده است
8 پیام بازسازی کد (refactor) صادر شده است
16 پیام شیوه‌نامه (convention) صادر شده است
32 خطای نحوهٔ استفاده (usage error)

برای مثال، کد خروج 20 به این معنی است که حداقل یک پیام هشدار (4) و حداقل یک پیام شیوه‌نامه (16) وجود داشته و هیچ خطای دیگری رخ نداده است..SS خروجی Pylint

خروجی به صورت پیش‌فرض در stdout نوشته می‌شود. ساده‌ترین راه برای فرستادن خروجی به یک فایل، استفاده از گزینهٔ --output=<filename> است.

قالب پیش‌فرض برای خروجی، متن خام است. می‌توانید با دادن گزینهٔ --output-format=<value> به pylint این را تغییر دهید. مقادیر ممکن عبارتند از:

با ارسال فهرستی از قالب‌ها که با کاما از هم جدا شده‌اند به --output-format، می‌توان چندین قالب خروجی را به طور همزمان استفاده کرد. این خروجی را می‌توان با مشخص کردن نام فایل پس از دونقطه (:) به یک فایل هدایت کرد.

برای نمونه، جهت ذخیرهٔ گزارش json در somefile.json و همزمان چاپ گزارشی رنگی در stdout:

--output-format=json:somefile.json,colorized

می‌توانید شیوهٔ دقیق نمایش اطلاعات را با استفاده از گزینهٔ --msg-template=<format string>; سفارشی‌سازی کنید. format string از نحو جدید قالب‌بندی پایتون https://docs.python.org/2/library/string.html#formatstrings بهره می‌برد و فیلدهای زیر در دسترس هستند:

مسیر نسبی فایل
مسیر مطلق فایل
شمارهٔ خط
شمارهٔ ستون
شمارهٔ خط پایان گره (node)
شمارهٔ ستون پایان گره (node)
نام ماژول
شیء درون ماژول (در صورت وجود)
متن پیام
کد پیام (مثلاً I0011)
نام نمادین پیام (مثلاً locally-disabled)
نشانهٔ تک‌حرفی دسته‌بندی پیام
نام کامل دسته‌بندی پیام

برای نمونه، قالب پیش‌فرض پیشین (قبل از 1.0) را می‌توان با این دستور به دست آورد:

pylint --msg-template='{msg_id}:{line:3d},{column}: {obj}: {msg}'

چند نمونهٔ دیگر:

•
قالب پیش‌فرض:
{path}:{line}:{column}: {msg_id}: {msg} ({symbol})
•
قالب سازگار با Visual Studio (قالب خروجی پیشین 'msvs'):
{path}({line}): [{msg_id}{obj}] {msg}
•
قالب Parseable (برای Emacs و مانند آن، قالب خروجی پیشین 'parseable'):
{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}

گزینهٔ --msg-template تنها با گزارشگرهای متنی قابل ترکیب است (--output-format یا تعیین نشده باشد یا یکی از مقادیر parseable، colorized یا msvs باشد). اگر هر دو گزینهٔ --output-format و --msg-template تعیین شوند، گزینهٔ --msg-template بر قالب خطی پیش‌فرضی که توسط کلاس گزارشگر تعریف شده است، اولویت خواهد داشت.

اگر مقادیر end_line یا end_column برابر با None باشند، توسط TextReporter پیش‌فرض به صورت یک رشتهٔ خالی نمایش داده می‌شوند..SS بخش تحلیل کد منبع (Source code analysis section)

برای هر ماژول python، ابزار Pylint ابتدا چند نویسهٔ '*' و به‌دنبال آن نام ماژول را نمایش می‌دهد. سپس، تعدادی پیام با قالب زیر نمایش داده می‌شود:

MESSAGE_TYPE: LINE_NUM:[OBJECT:] MESSAGE

می‌توانید با استفاده از گزینهٔ --output-format=parseable قالب خروجی دیگری دریافت کنید که بسیار کاربردی است، چرا که توسط اکثر ویرایشگرها و سایر ابزارهای توسعه شناخته می‌شود.

نوع پیام می‌تواند یکی از موارد زیر باشد:

  • پیام‌های اطلاعاتی ([I]nformational) که Pylint صادر می‌کند (در امتیاز تحلیل شما تأثیری ندارند)
  • بازآرایی ([R]efactor) برای نقض معیارهای "روش‌های مناسب" (good practice)
  • قرارداد ([C]onvention) برای نقض استانداردهای کدنویسی
  • هشدار ([W]arning) برای مشکلات شیوه‌ای (stylistic) یا مسائل جزئی برنامه‌نویسی
  • خطا ([E]rror) برای مسائل مهم برنامه‌نویسی (یعنی به احتمال زیاد باگ)
  • خطای مهلک ([F]atal) برای خطاهایی که مانع از ادامهٔ پردازش شده‌اند

گاهی خطی از کد که باعث خطا شده است همراه با یک علامت درج (caret: ^) که به خطا اشاره می‌کند نمایش داده می‌شود. این ویژگی ممکن است در نسخه‌های آیندهٔ Pylint تعمیم یابد.

مثال (برگرفته از اجرای Pylint روی خودش...):

************* Module pylint.checkers.format
W: 50: Too long line (86/80)
W:108: Operator not followed by a space
     print >>sys.stderr, 'Unable to match %r', line
            ^
W:141: Too long line (81/80)
W: 74:searchall: Unreachable code
W:171:FormatChecker.process_tokens: Redefining built-in (type)
W:150:FormatChecker.process_tokens: Too many local variables (20/15)
W:150:FormatChecker.process_tokens: Too many branches (13/12)

به‌دنبال پیام‌های تحلیل، Pylint می‌تواند مجموعه‌ای از گزارش‌ها را نمایش دهد که هر کدام بر جنبهٔ خاصی از پروژه تمرکز دارند؛ مانند تعداد پیام‌ها بر پایهٔ دسته‌بندی، وابستگی‌های ماژول‌ها. این ویژگی‌ها را می‌توان از طریق گزینهٔ --reports=y یا نگارش کوتاه آن -ry فعال کرد.

به‌عنوان مثال، گزارش معیارها خلاصه‌های جمع‌آوری‌شده از اجرای فعلی را نمایش می‌دهد:

  • تعداد ماژول‌های پردازش‌شده
  • برای هر ماژول، درصد خطاها و هشدارها
  • تعداد کل خطاها و هشدارها
  • درصد کلاس‌ها، توابع و ماژول‌های دارای docstring، همراه با مقایسه نسبت به اجرای پیشین
  • درصد کلاس‌ها، توابع و ماژول‌ها با نام‌گذاری صحیح (مطابق با استاندارد کدنویسی)، همراه با مقایسه نسبت به اجرای پیشین
  • فهرستی از وابستگی‌های خارجی یافت‌شده در کد و محل قرارگیری آن‌ها

در نهایت، Pylint یک امتیاز ارزیابی کلی برای کد نمایش می‌دهد که از حداکثر امتیاز ۱۰.۰ محاسبه می‌شود. این خروجی را می‌توان از طریق گزینهٔ --score=n یا فرم خلاصهٔ آن، -sn، غیرفعال کرد.

فرمول ارزیابی را می‌توان با گزینهٔ --evaluation=<python_expression> بازنویسی کرد.

Pylint می‌تواند پیام‌های زیر را صادر کند:

تمام پیام‌ها در دسته‌بندی مهلک (fatal):

پیام صادرشده:

%s: %s

توضیحات:

هنگامی استفاده می‌شود که خطایی غیرمنتظره حین ساخت نمایش Astroid رخ داده باشد. این حالت معمولاً با یک traceback همراه است. لطفاً چنین خطاهایی را گزارش دهید!

جزئیات تکمیلی:

این پیام مربوط به یک مشکل داخلی در pylint است. نیازی به تغییر در کد شما نیست، اما شاید نیاز به تغییر در پیکربندی یا نحوهٔ نصب pylint باشد.

ایجادشده توسط بررسی‌کنندهٔ اصلی https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py.

پیام صادرشده:

error while parsing the configuration: %s

توضیحات:

هنگامی استفاده می‌شود که حین تجزیهٔ یک فایل پیکربندی pylint، استثنایی رخ داده باشد.

جزئیات تکمیلی:

این پیام مربوط به مشکلی در پیکربندی شماست، نه کد شما.

ایجادشده توسط بررسی‌کنندهٔ اصلی https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py.

پیام صادرشده:

%s

توضیحات:

هنگامی استفاده می‌شود که خطایی مانع از تحلیل یک ماژول شده باشد (برای نمونه، عدم توانایی در یافتن آن).

جزئیات تکمیلی:

این پیام مربوط به یک مشکل داخلی در pylint است. نیازی به هیچ تغییری در کد شما نیست.

ایجادشده توسط بررسی‌کنندهٔ اصلی https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py.

پیام صادرشده:

Unable to check methods signature (%s / %s)

توضیحات:

هنگامی استفاده می‌شود که Pylint به دلیلی غیرمنتظره نتوانسته است سازگاری امضای متدها را بررسی کند. لطفاً در صورتی که دلیلی برای آن نیافتید، این مورد را گزارش دهید.

جزئیات تکمیلی:

این پیام مربوط به یک مشکل داخلی در pylint است. نیازی به هیچ تغییری در کد شما نیست.

ایجادشده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

error while code parsing: %s

توضیحات:

هنگامی استفاده می‌شود که حین ساخت نمایش Astroid استثنایی رخ داده باشد که توسط astroid قابل رسیدگی بود.

جزئیات تکمیلی:

این پیام مربوط به یک مشکل داخلی در pylint است. نیازی به هیچ تغییری در کد شما نیست.

ایجادشده توسط بررسی‌کنندهٔ اصلی https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py.

تمام پیام‌های تغییرنام‌یافته در دسته‌بندی مهلک (fatal):.SS old-import-error / F0401

پیام 'old-import-error' تغییر نام داده است. پیام جدید را می‌توانید در این بخش بیابید:

پیام صادرشده:

Unable to import %s

توضیحات:

زمانی به کار می‌رود که pylint نتواند ماژولی را وارد (import) کند.

کد دارای مشکل:

from patlib import Path  # [import-error]

کد صحیح:

from pathlib import Path

جزئیات تکمیلی:

این وضعیت ممکن است زمانی رخ دهد که بسته‌ای را وارد کنید که در محیط شما نصب نشده است، یا اینکه دچار غلط املایی شده باشید.

راه‌حل این است که بسته را از طریق pip/setup.py/wheel نصب نمایید یا غلط تایپی را برطرف سازید.

ایجادشده توسط بررسی‌کننده imports https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/imports.py.

تمام پیام‌های موجود در دسته‌بندی خطا:

پیام صادرشده:

Abstract class %r with abstract methods instantiated

توضیحات:

زمانی استفاده می‌شود که از یک کلاس انتزاعی با فراکلاس `abc.ABCMeta` که دارای متدهای انتزاعی است، نمونه‌سازی (instantiate) شده باشد.

کد دارای مشکل:

import abc
class Animal(abc.ABC):
    @abc.abstractmethod
    def make_sound(self):
        pass
sheep = Animal()  # [abstract-class-instantiated]

کد صحیح:

import abc
class Animal(abc.ABC):
    @abc.abstractmethod
    def make_sound(self):
        pass
class Sheep(Animal):
    def make_sound(self):
        print("bhaaaaa")
sheep = Sheep()

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py..SS access-member-before-definition / E0203

پیام صادرشده:

دسترسی به عضو %r پیش از سطر تعریف آن %s

توضیحات:

زمانی استفاده می‌شود که به یکی از اعضای نمونه پیش از مقداردهی واقعی آن دسترسی پیدا شود.

کد دارای مشکل:

class Unicorn:
    def __init__(self, fluffiness_level):
        if self.fluffiness_level > 9000:  # [access-member-before-definition]
            print("It's OVER-FLUFFYYYY ! *crush glasses*")
        self.fluffiness_level = fluffiness_level

کد صحیح:

class Unicorn:
    def __init__(self, fluffiness_level):
        self.fluffiness_level = fluffiness_level
        if self.fluffiness_level > 9000:
            print("It's OVER-FLUFFYYYY ! *crush glasses*")

ایجادشده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

انتساب به ویژگی %r که در slots کلاس تعریف نشده است

توضیحات:

زمانی استفاده می‌شود که به ویژگی‌ای که در slots کلاس تعریف نشده است، مقداری منتسب شود.

کد دارای مشکل:

class Student:
    __slots__ = ("name",)
    def __init__(self, name, surname):
        self.name = name
        self.surname = surname  # [assigning-non-slot]
        self.setup()
    def setup(self):
        pass

کد صحیح:

class Student:
    __slots__ = ("name", "surname")
    def __init__(self, name, surname):
        self.name = name
        self.surname = surname
        self.setup()
    def setup(self):
        pass

ایجادشده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py..SS assignment-from-no-return / E1111

پیام صادرشده:

انتساب نتیجه فراخوانی یک تابع، در حالی که تابع هیچ مقداری بازنمی‌گرداند

توضیحات:

زمانی استفاده می‌شود که نتیجه فراخوانی یک تابع منتسب شود، اما تابع استنتاج‌شده هیچ مقداری را بازنگرداند.

کد دارای اشکال:

def add(x, y):
    print(x + y)
value = add(10, 10)  # [assignment-from-no-return]

کد تصحیح‌شده:

def add(x, y):
    return x + y
value = add(10, 10)

ایجادشده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.

پیام صادرشده:

انتساب نتیجه فراخوانی یک تابع، در حالی که تابع None بازمی‌گرداند

توضیحات:

زمانی استفاده می‌شود که نتیجه فراخوانی یک تابع منتسب شود، اما تابع استنتاج‌شده چیزی جز None بازنگرداند.

کد دارای اشکال:

def function():
    return None
f = function()  # [assignment-from-none]

کد تصحیح‌شده:

def function():
    return None
f = function() if function() else 1

ایجادشده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py..SS async-context-manager-with-regular-with / E1145

پیام صادرشده:

مدیر زمینه '%s' ناهمگام است و باید با 'async with' استفاده شود.

توضیحات:

زمانی استفاده می‌شود که یک مدیر زمینه ناهمگام به جای 'async with' با یک دستور معمولی 'with' به کار رود.

کد دارای مشکل:

from contextlib import asynccontextmanager
@asynccontextmanager
async def async_context():
    yield
with async_context():  # [async-context-manager-with-regular-with]
    print("This will cause an error at runtime")

کد درست:

import asyncio
from contextlib import asynccontextmanager
@asynccontextmanager
async def async_context():
    yield
async def main():
    async with async_context():
        print("This works correctly")

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.

پیام صادرشده:

عبارت 'await' باید درون یک تابع async به کار رود

توضیحات:

زمانی صادر می‌شود که await خارج از یک تابع async استفاده شود.

کد دارای مشکل:

import asyncio
def main():
    await asyncio.sleep(1)  # [await-outside-async]

کد درست:

import asyncio
async def main():
    await asyncio.sleep(1)

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py..SS bad-configuration-section / E0014

پیام صادرشده:

تنظیم نابجا در بخش پیکربندی سطح بالای '%s' یافت شد : '%s'

توضیحات:

زمانی استفاده می‌شود که تنظیمی در سطح بالای یک پیکربندی toml شناسایی شود که نباید در آنجا باشد.

جزئیات تکمیلی:

این خطا بین pylint 2.12 و pylint 2.14 (پیش از بازسازی ساختار argparse) زمانی رخ می‌داد که با یک نوع مقدار غیرمنتظره در یک پیکربندی toml مواجه می‌شدیم.

ایجادشده توسط بررسی‌کنندهٔ اصلی https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py.

پیام صادرشده:

ترتیب نادرست بندهای except (%s)

توضیحات:

زمانی استفاده می‌شود که بندهای except به ترتیب درست (از خاص‌ترین به عام‌ترین) نباشند. اگر ترتیب را اصلاح نکنید، ممکن است برخی از استثناها توسط خاص‌ترین گرداننده گرفته نشوند.

کد دارای مشکل:

try:
    print(int(input()))
except Exception:
    raise
except TypeError:  # [bad-except-order]
    # This block cannot be reached since TypeError exception
    # is caught by previous exception handler.
    raise

کد درست:

try:
    print(int(input()))
except TypeError:
    raise
except Exception:
    raise

ایجادشده توسط بررسی‌کنندهٔ exceptions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/exceptions.py.

پیام صادرشده:

علت استثنا روی چیزی تنظیم شده است که نه استثنا است و نه None

توضیحات:

زمانی استفاده می‌شود که از نحو "raise ... from ..." استفاده شود، در حالی که علت استثنا نه یک استثنا باشد و نه None.

کد دارای مشکل:

def divide(x, y):
    result = 0
    try:
        result = x / y
    except ZeroDivisionError:
        # +1: [bad-exception-cause]
        raise ValueError(f"Division by zero when dividing {x} by {y} !") from result
    return result

کد درست:

def divide(x, y):
    result = 0
    try:
        result = x / y
    except ZeroDivisionError as exc:
        raise ValueError(f"Division by zero when dividing {x} by {y} !") from exc
    return result

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کنندهٔ exceptions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/exceptions.py..SS bad-format-character / E1300

پیام صادرشده:

Unsupported format character %r (%#02x) at index %d

توضیحات:

هنگامی استفاده می‌شود که یک نویسهٔ قالب‌بندیِ پشتیبانی‌نشده در یک رشتهٔ قالب به کار رفته باشد.

کد دارای مشکل:

print("%s %z" % ("hello", "world"))  # [bad-format-character]

کد درست:

print("%s %s" % ("hello", "world"))

جزئیات بیشتر:

این بررسی در حال حاضر تنها برای قالب‌بندی رشته‌ها به «سبک قدیمی» (old-style) همان‌طور که در مثال‌ها دیده می‌شود، فعال است. برای اطلاعات بیشتر، گزارش شمارۀ #6085 در https://github.com/pylint-dev/pylint/issues/6085 را ببینید.

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کنندهٔ string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py.

پیام صادرشده:

Plugin '%s' is impossible to load, is it installed ? ('%s')

توضیحات:

هنگامی استفاده می‌شود که یک مقدار نامعتبر در 'load-plugins' به کار رفته باشد.

جزئیات بیشتر:

یکی از افزونه‌های pylint شما بارگیری نمی‌شود. نیازی به تغییر در کد شما نیست، اما پیکربندی pylint یا نصب آن با مشکل مواجه است.

برای نمونه، ممکن است یک غلط املایی وجود داشته باشد. پیکربندی زیر:

[MAIN]
load-plugins = pylint.extensions.bad_biultin

باید به این صورت باشد:

[MAIN]
load-plugins = pylint.extensions.bad_builtin

یا افزونه‌ای که اضافه کرده‌اید در محیط شما قابل وارد کردن (importable) نیست.

ایجادشده توسط بررسی‌کنندهٔ main https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py..SS bad-reversed-sequence / E0111

پیام صادر شده:

The first reversed() argument is not a sequence

توضیحات:

زمانی استفاده می‌شود که نخستین آرگومان تابع توکار ()reversed یک دنباله نباشد (__reversed__ یا __getitem__ و __len__ را پیاده‌سازی نکرده باشد)

کد دارای اشکال:

reversed({1, 2, 3, 4})  # [bad-reversed-sequence]

کد صحیح:

reversed([1, 2, 3, 4])

ایجاد شده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py.

پیام صادر شده:

Suspicious argument in %s.%s call

توضیحات:

آرگومان فراخوانی str.{l,r,}strip حاوی یک نویسه تکراری است،

کد دارای اشکال:

hello_world.py:

"Hello World".strip("Hello")  # [bad-str-strip-call]
# >>> ' World'

remove_abc_from_both_side.py:

"abcbc def bacabc".strip("abcbc ")  # [bad-str-strip-call]
# >>> 'def'

کد صحیح:

hello_world.py:

"Hello World".strip("Helo")
# >>> ' World'

remove_abc_from_both_side.py:

"abcbc def bacabc".strip("abc ")
# >>> 'def'

جزئیات تکمیلی:

یک تصور نادرست رایج این است که str.strip('Hello') زیررشته‌ی 'Hello' را از ابتدا و انتهای رشته حذف می‌کند. این‌گونه نیست. برگرفته از مستندات https://docs.python.org/3/library/stdtypes.html?highlight=strip#str.strip:

> آرگومان chars یک پیشوند یا پسوند نیست؛ بلکه تمام ترکیب‌های مقادیر آن حذف می‌شوند

وجود نویسه‌های تکراری در فراخوانی str.strip، گذشته از اینکه هیچ تأثیری بر نتیجه نهایی ندارد، ممکن است نشان‌دهنده این برداشت نادرست باشد.

پیوندهای مرتبط:

ایجاد شده توسط بررسی‌کننده string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py..SS bad-string-format-type / E1307

پیام صادرشده:

آرگومان %r با نوع قالب‌بندی %r مطابقت ندارد

توضیحات:

زمانی استفاده می‌شود که نوع مورد نیاز رشتهٔ قالب‌بندی با نوع آرگومان واقعی سازگار نباشد.

کد دارای مشکل:

print("%d" % "1")  # [bad-string-format-type]

کد صحیح:

print("%d" % 1)

جزئیات بیشتر:

این بررسی در حال حاضر تنها برای قالب‌بندی رشته‌ها به "سبک قدیمی" (old-style) همان‌طور که در مثال‌ها دیده می‌شود، فعال است. برای اطلاعات بیشتر، گزارش #6085 را در https://github.com/pylint-dev/pylint/issues/6163 ببینید.

پیوندهای مرتبط:

ایجاد شده توسط بررسی‌کنندهٔ string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py.

پیام صادرشده:

آرگومان نخست نامعتبر %r به super() داده شده است

توضیحات:

زمانی استفاده می‌شود که آرگومانی غیر از کلاس جاری به عنوان نخستین آرگومان تابع توکار super داده شود.

کد دارای مشکل:

class Animal:
    pass
class Tree:
    pass
class Cat(Animal):
    def __init__(self):
        super(Tree, self).__init__()  # [bad-super-call]
        super(Animal, self).__init__()

کد صحیح:

class Animal:
    pass
class Tree:
    pass
class Cat(Animal):
    def __init__(self):
        super(Animal, self).__init__()

جزئیات بیشتر:

در Python 2.7، تابع super() باید با کلاس خودش و self به عنوان آرگومان فراخوانی می‌شد (super(Cat, self)) که این امر می‌توانست منجر به اشتباه گرفتن کلاس والد و فرزند در کد شود.

در Python 3 روش توصیه‌شده، فراخوانی super() بدون آرگومان است (همچنین ببینید: super-with-arguments).

یک استثنا، فراخوانی super() روی یک کلاس والد غیرمستقیم است. این کار می‌تواند برای به‌دست آوردن متدی غیر از متد پیش‌فرض بازگردانده‌شده توسط mro() استفاده شود.

پیوندهای مرتبط:

ایجاد شده توسط بررسی‌کنندهٔ newstyle https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/newstyle.py..SS bare-name-capture-pattern / E1901

پیام صادرشده:

الگوی گرفتن نام `case %s` باقی الگوها را غیرقابل‌دسترس می‌کند. برای رفع این مشکل از یک نام نقطه‌دار (برای نمونه یک enum) استفاده کنید.

توضیحات:

زمانی صادر می‌شود که یک الگوی ضبط نام (name capture pattern) در دستور match استفاده شده باشد و گزاره‌های case در ادامهٔ آن وجود داشته باشند.

کد دارای مشکل:

red = 0
green = 1
blue = 2
def func(color):
    match color:
        case red:  # [bare-name-capture-pattern]
            print("I see red!")
        case green:  # [bare-name-capture-pattern]
            print("Grass is green")
        case blue:
            print("I'm feeling the blues :(")

کد درست:

from enum import Enum
class Color(Enum):
    RED = 0
    GREEN = 1
    BLUE = 2
def func(color: Color) -> None:
    match color:
        case Color.RED:
            print("I see red!")
        case Color.GREEN:
            print("Grass is green")
        case Color.BLUE:
            print("I'm feeling the blues :(")

پیوندهای مرتبط:

ایجاد شده توسط بررسی‌کننده match_statements https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/match_statements_checker.py.

پیام صادرشده:

حاوی نویسه‌های کنترلی است که می‌توانند اجازه دهند کد مبهم، متفاوت از آنچه نمایش داده می‌شود اجرا گردد

توضیحات:

یونیکدهای دوجهته (bidirectional unicode) معمولاً نویسه‌هایی نمایش‌داده‌نشده هستند که برای نمایش صحیح خطوط راست‌به‌چپ (RTL) (مانند چینی، ژاپنی، عربی، عبری و...) مورد نیازند. بنابراین آیا می‌توانید به این کد اعتماد کنید؟ آیا مطمئن هستید که در تمام ویرایشگرها به‌درستی نمایش داده می‌شود؟ اگر خودتان آن را ننوشته‌اید یا زبانتان راست‌به‌چپ نیست، نویسه‌های ویژه را حذف کنید؛ زیرا می‌توان از آن‌ها برای فریب شما در اجرای کدی استفاده کرد که کاری متفاوت از ظاهرش انجام می‌دهد. اطلاعات بیشتر: https://en.wikipedia.org/wiki/Bidirectional_text https://trojansource.codes

کد دارای مشکل:

# +1: [bidirectional-unicode]
example = "x‏" * 100  #    "‏x" is assigned

کد درست:

example = "x[U+2194]" * 100

ایجاد شده توسط بررسی‌کننده unicode_checker https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/unicode.py..SS broken-collections-callable / E6005

پیام صادرشده:

'collections.abc.Callable' درون Optional و Union در 3.9.0 / 3.9.1 معیوب است (به‌جای آن از 'typing.Callable' استفاده کنید)

توضیحات:

استفاده از ``collections.abc.Callable`` درون Optional و Union در پایتون 3.9.0 و 3.9.1 با مشکل مواجه است. در این موارد به‌جای آن از ``typing.Callable`` استفاده کنید. https://bugs.python.org/issue42965

کد دارای مشکل:

from collections.abc import Callable
from typing import Optional
def func() -> Optional[Callable[[int], None]]:  # [broken-collections-callable]
    ...

کد صحیح:

from typing import Callable, Optional
def func() -> Optional[Callable[[int], None]]: ...

فایل پیکربندی:

[main]
py-version=3.9
load-plugins=pylint.extensions.typing

پیوندهای مرتبط:

نکته:

این پیام توسط بررسی‌کننده اختیاری 'typing' <#pylint-extensions-typing> صادر می‌شود، که نیازمند بارگذاری افزونه pylint.extensions.typing است.

ایجاد شده توسط بررسی‌کننده typing https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/typing.py.

پیام صادرشده:

'NoReturn' درون انواع مرکب در 3.7.0 / 3.7.1 معیوب است

توضیحات:

استفاده از ``typing.NoReturn`` درون انواع مرکب در پایتون 3.7.0 و 3.7.1 با مشکل مواجه است. اگر به درون‌نگری زمان اجرا وابسته نیستید، به‌جای آن از نشانه‌گذاری رشته‌ای استفاده کنید؛ مانند ``Callable[..., 'NoReturn']``. https://bugs.python.org/issue34921

کد دارای مشکل:

from typing import NoReturn, Union
def exploding_apple(apple) -> Union[None, NoReturn]:  # [broken-noreturn]
    print(f"{apple} is about to explode")

کد صحیح:

from typing import NoReturn
def exploding_apple(apple) -> NoReturn:
    print(f"{apple} is about to explode")
    raise Exception("{apple} exploded !")

فایل پیکربندی:

[main]
py-version=3.7
load-plugins=pylint.extensions.typing

نکته:

این پیام توسط بررسی‌کننده اختیاری 'typing' <#pylint-extensions-typing> صادر می‌شود، که نیازمند بارگذاری افزونه pylint.extensions.typing است.

ایجاد شده توسط بررسی‌کننده typing https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/typing.py..SS catching-non-exception / E0712

پیام صادرشده:

گرفتن استثنایی که از Exception ارث‌بری نمی‌کند: %s

توضیحات:

زمانی استفاده می‌شود که کلاسی که از Exception ارث‌بری نمی‌کند، به‌عنوان استثنا در یک بند except به کار رود.

کد دارای مشکل:

class FooError:
    pass
try:
    1 / 0
except FooError:  # [catching-non-exception]
    pass

کد درست:

class FooError(Exception):
    pass
try:
    1 / 0
except FooError:
    pass

ایجادشده توسط بررسی‌کنندهٔ exceptions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/exceptions.py.

پیام صادرشده:

مقدار %r در slots با متغیر کلاس تداخل دارد

توضیحات:

زمانی استفاده می‌شود که مقداری در __slots__ با یک متغیر کلاس، property یا متد تداخل داشته باشد.

کد دارای مشکل:

class Person:
    # +1: [class-variable-slots-conflict, class-variable-slots-conflict, class-variable-slots-conflict]
    __slots__ = ("age", "name", "say_hi")
    name = None
    def __init__(self, age, name):
        self.age = age
        self.name = name
    @property
    def age(self):
        return self.age
    def say_hi(self):
        print(f"Hi, I'm {self.name}.")

کد درست:

class Person:
    __slots__ = ("_age", "name")
    def __init__(self, age, name):
        self._age = age
        self.name = name
    @property
    def age(self):
        return self._age
    def say_hi(self):
        print(f"Hi, I'm {self.name}.")

ایجادشده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py..SS declare-non-slot / E0245

پیام صادرشده:

نام %r در __slots__ وجود ندارد

توضیحات:

هنگامی صادر می‌شود که یک یادداشت نوع (type annotation) در یک کلاس، در فهرست نام‌های موجود در __slots__ وجود نداشته باشد و __slots__ نیز شامل مدخل __dict__ نباشد.

کد دارای مشکل:

class Student:
    __slots__ = ("name",)
    name: str
    surname: str  # [declare-non-slot]

کد صحیح:

class Student:
    __slots__ = ("name", "surname")
    name: str
    surname: str

ایجادشده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

بازگشایی یک دیکشنری در پیمایش بدون فراخوانی .items()

توضیحات:

هنگام تلاش برای پیمایش یک dict بدون فراخوانی .items() صادر می‌شود.

کد دارای مشکل:

data = {"Paris": 2_165_423, "New York City": 8_804_190, "Tokyo": 13_988_129}
for city, population in data:  # [dict-iter-missing-items]
    print(f"{city} has population {population}.")

کد صحیح:

data = {"Paris": 2_165_423, "New York City": 8_804_190, "Tokyo": 13_988_129}
for city, population in data.items():
    print(f"{city} has population {population}.")

ایجادشده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.

پیام صادرشده:

نام آرگومان تکراری %r در تعریف تابع

توضیحات:

نام‌های آرگومان تکراری در تعریف توابع، خطای نحوی هستند.

کد دارای مشکل:

def get_fruits(apple, banana, apple):  # [duplicate-argument-name]
    pass

کد صحیح:

def get_fruits(apple, banana, orange):
    pass

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py..SS duplicate-bases / E0241

پیام صادرشده:

پایه‌های تکراری برای کلاس %r

توضیحات:

استفاده تکراری از کلاس‌های پایه در کلاس‌های مشتق‌شده باعث بروز TypeError می‌شود.

کد دارای مشکل:

class Animal:
    pass
class Cat(Animal, Animal):  # [duplicate-bases]
    pass

کد درست:

class Animal:
    pass
class Bird(Animal):
    pass
class Cat(Animal):
    pass

ایجادشده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

برای رشته قالب‌بندی نگاشت انتظار می‌رفت، نه %s

توضیحات:

زمانی استفاده می‌شود که یک رشته قالب‌بندی دارای مشخص‌کننده‌های تبدیل نام‌دار، به همراه آرگومانی به کار رود که نگاشت (mapping) نیست.

کد دارای مشکل:

print("%(x)d %(y)d" % [1, 2])  # [format-needs-mapping]

کد درست:

print("%(x)d %(y)d" % {"x": 1, "y": 2})

ایجادشده توسط بررسی‌کننده string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py..SS function-redefined / E0102

پیام صادرشده:

%s already defined line %s

توضیحات:

زمانی استفاده می‌شود که یک تابع / کلاس / متد بازتعریف شده باشد.

کد دارای مشکل:

def get_email():
    pass
def get_email():  # [function-redefined]
    pass

کد صحیح:

def get_email():
    pass

ایجادشده توسط بررسی‌کنندهٔ basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py.

پیام صادرشده:

Inconsistent method resolution order for class %r

توضیحات:

زمانی استفاده می‌شود که یک کلاس ترتیب تفکیک متد (MRO) ناسازگاری داشته باشد.

کد دارای مشکل:

class A:
    pass
class B(A):
    pass
class C(A, B):  # [inconsistent-mro]
    pass

کد صحیح:

class A:
    pass
class B(A):
    pass
class C(B):  # or 'B, A' or 'A' but not 'A, B'
    pass

ایجادشده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py..SS inherit-non-class / E0239

پیام صادرشده:

ارث‌بری از %r، که یک کلاس نیست.

توضیحات:

زمانی استفاده می‌شود که یک کلاس از چیزی که کلاس نیست ارث‌بری کند.

کد دارای مشکل:

class Fruit(bool):  # [inherit-non-class]
    pass

کد صحیح:

class Fruit:
    def __bool__(self):
        pass

ایجادشده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

متد __init__ یک مولد (generator) است

توضیحات:

زمانی استفاده می‌شود که متد ویژهٔ کلاس __init__ به دلیل وجود yield در بدنهٔ خود، به یک مولد (generator) تبدیل شود.

کد دارای مشکل:

class Fruit:
    def __init__(self, worms):  # [init-is-generator]
        yield from worms
apple = Fruit(["Fahad", "Anisha", "Tabatha"])

کد صحیح:

class Fruit:
    def __init__(self, worms):
        self.__worms = worms
    def worms(self):
        yield from self.__worms
apple = Fruit(["Fahad", "Anisha", "Tabatha"])
for worm in apple.worms():
    pass

ایجادشده توسط بررسی‌کنندهٔ basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py..SS invalid-all-format / E0605

پیام صادرشده:

قالب نامعتبر برای __all__، باید tuple یا list باشد

توضیحات:

زمانی استفاده می‌شود که __all__ دارای قالبی نامعتبر باشد.

کد دارای مشکل:

__all__ = "CONST"  # [invalid-all-format]
CONST = 42

کد درست:

__all__ = ("CONST",)
CONST = 42

ایجاد شده توسط بررسی‌کننده variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py.

پیام صادرشده:

شیء نامعتبر %r در __all__، باید فقط شامل رشته‌ها باشد

توضیحات:

زمانی استفاده می‌شود که یک شیء نامعتبر (غیررشته‌ای) در __all__ قرار گیرد.

کد دارای مشکل:

__all__ = (
    None,  # [invalid-all-object]
    Fruit,
    Worm,
)
class Fruit:
    pass
class Worm:
    pass

کد درست:

__all__ = ["Fruit", "Worm"]
class Fruit:
    pass
class Worm:
    pass

جزئیات تکمیلی:

از مرجع زبان پایتون – دستور import https://docs.python.org/3/reference/simple_stmts.html#the-import-statement:
"نام‌های عمومی تعریف‌شده توسط یک ماژول با بررسی فضای نام ماژول برای یافتن متغیری به نام __all__ مشخص می‌شوند؛ در صورت تعریف، باید دنباله‌ای از رشته‌ها باشد که نام‌های تعریف‌شده یا واردشده توسط آن ماژول هستند."

پیوندهای مرتبط:

•
PEP 8 – شیوه‌نامه کدنویسی پایتون https://peps.python.org/pep-0008/#module-level-dunder-names

ایجاد شده توسط بررسی‌کننده variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py..SS invalid-bool-returned / E0304

پیام صادرشده:

__bool__ مقدار bool برنمی‌گرداند

توضیحات:

زمانی استفاده می‌شود که یک متد __bool__ مقداری غیر از bool برگرداند

کد دارای مشکل:

class CustomBool:
    """__bool__ returns an int"""
    def __bool__(self):  # [invalid-bool-returned]
        return 1

کد درست:

class CustomBool:
    """__bool__ returns `bool`"""
    def __bool__(self):
        return True

ایجاد شده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/special_methods_checker.py.

پیام صادرشده:

__bytes__ مقدار bytes برنمی‌گرداند

توضیحات:

زمانی استفاده می‌شود که یک متد __bytes__ مقداری غیر از bytes برگرداند

کد دارای مشکل:

class CustomBytes:
    """__bytes__ returns <type 'str'>"""
    def __bytes__(self):  # [invalid-bytes-returned]
        return "123"

کد درست:

class CustomBytes:
    """__bytes__ returns <type 'bytes'>"""
    def __bytes__(self):
        return b"some bytes"

ایجاد شده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/special_methods_checker.py..SS invalid-character-backspace / E2510

پیام صادرشده:

نویسهٔ backspace بدون گریز نامعتبر است، به‌جای آن از "\b" استفاده کنید.

توضیحات:

مکان‌نما را به عقب بازمی‌گرداند، بنابراین نویسهٔ بعد از آن روی نویسهٔ قبلی بازنویسی خواهد شد.

کد دارای مشکل:

STRING = "Invalid character backspace  "  # [invalid-character-backspace]

کد صحیح:

STRING = "Valid character backspace \b"

ایجادشده توسط بررسی‌کنندهٔ unicode_checker https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/unicode.py.

پیام صادرشده:

نویسهٔ carriage-return بدون گریز نامعتبر است، به‌جای آن از "\r" استفاده کنید.

توضیحات:

مکان‌نما را به ابتدای سطر می‌برد، نویسه‌های بعدی ابتدای سطر را بازنویسی خواهند کرد.

کد صحیح:

STRING = "Valid carriage return: \r"

جزئیات تکمیلی:

این پیام به این دلیل وجود دارد که یکی از بررسی‌کننده‌های ما بسیار عمومی است، اما در استفادهٔ عادی هرگز رخ نخواهد داد زیرا یک syntax-error است که مانع از ایجاد بازنمایی کد فایل توسط python ast (و در نتیجه pylint) می‌شود.

ممکن است تنها با ارسال مستقیم یک گرهِ به‌درستی ساخته‌شده به بررسی‌کننده با آن روبرو شوید.

ایجادشده توسط بررسی‌کنندهٔ unicode_checker https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/unicode.py.

پیام صادرشده:

نویسهٔ esc بدون گریز نامعتبر است، به‌جای آن از "\x1B" استفاده کنید.

توضیحات:

معمولاً کدهای گریزی را آغاز می‌کند که امکان کنترل اختیاری ترمینال را فراهم می‌سازند.

کد دارای مشکل:

STRING = "Invalid escape character  "  # [invalid-character-esc]

کد صحیح:

STRING = "Valid escape character \x1b"

ایجادشده توسط بررسی‌کنندهٔ unicode_checker https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/unicode.py..SS invalid-character-nul / E2514

پیام صادرشده:

نویسهٔ nul فرارنشده نامعتبر است، به جای آن از "\0" استفاده کنید.

توضیحات:

عمدتاً پایان ورودی برای پایتون.

جزئیات بیشتر:

نیازی به استفاده از نویسه‌های پایان رشته نیست. اشیاء رشته‌ای طول خود را نگهداری می‌کنند.

پیوندهای مرتبط:

•
Null terminator در پایتون https://stackoverflow.com/a/24410304/2519059

ایجادشده توسط بررسی‌کنندهٔ unicode_checker https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/unicode.py.

پیام صادرشده:

نویسهٔ sub فرارنشده نامعتبر است، به جای آن از "\x1A" استفاده کنید.

توضیحات:

ترکیب کلیدهای Ctrl+Z به عنوان "پایان متن" در ویندوز. برخی برنامه‌ها (مانند type) ادامهٔ فایل را پس از آن نادیده می‌گیرند.

کد مشکل‌دار:

STRING = "Invalid character sub  "  # [invalid-character-sub]

کد درست:

STRING = "Valid character sub x1A"

ایجادشده توسط بررسی‌کنندهٔ unicode_checker https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/unicode.py.

پیام صادرشده:

نویسهٔ zero-width-space (فاصله با پهنای صفر) فرارنشده نامعتبر است، به جای آن از "\u200B" استفاده کنید.

توضیحات:

نویسهٔ فاصلهٔ نامرئی می‌تواند اجرای واقعی کد را پنهان کند.

کد مشکل‌دار:

STRING = "Invalid character zero-width-space ​"  # [invalid-character-zero-width-space]

کد درست:

STRING = "Valid character zero-width-space u200B"

ایجادشده توسط بررسی‌کنندهٔ unicode_checker https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/unicode.py..SS invalid-class-object / E0243

پیام صادرشده:

انتساب نامعتبر به '__class__'. باید یک تعریف کلاس باشد اما '%s' دریافت شد

توضیحات:

زمانی استفاده می‌شود که یک شیء نامعتبر به ویژگی __class__ منتسب شود. تنها یک کلاس مجاز است.

کد دارای مشکل:

class Apple:
    pass
Apple.__class__ = 1  # [invalid-class-object]

کد درست:

class Apple:
    pass
class RedDelicious:
    pass
Apple.__class__ = RedDelicious

ایجاد شده توسط بررسی‌کننده‌ی classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

گسترش کلاس ارث‌بری‌شده‌ی Enum با نام "%s"

توضیحات:

زمانی استفاده می‌شود که یک کلاس برای گسترش یک کلاس ارث‌بری‌شده‌ی Enum تلاش کند. انجام این کار باعث بروز TypeError در زمان اجرا خواهد شد.

کد دارای مشکل:

from enum import Enum
class Color(Enum):
    ORANGE = 1
    CHERRY = 2
class Fruit(Color):  # [invalid-enum-extension]
    APPLE = 3

کد درست:

from enum import Enum
class Color(Enum):
    ORANGE = 1
    CHERRY = 2
class Fruit(Enum):
    ORANGE = 1
    CHERRY = 2
    APPLE = 3

ایجاد شده توسط بررسی‌کننده‌ی classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py..SS invalid-envvar-value / E1507

پیام صادرشده:

%s از آرگومان نوع %s پشتیبانی نمی‌کند

توضیحات:

توابع دستکاری متغیرهای محیطی فقط از آرگومان‌های نوع رشته پشتیبانی می‌کنند. https://docs.python.org/3/library/os.html#os.getenv را ببینید.

کد دارای مشکل:

import os
os.getenv(1)  # [invalid-envvar-value]

کد درست:

import os
os.getenv("1")

ایجادشده توسط بررسی‌کننده stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py.

پیام صادرشده:

استفاده نامعتبر از field()، %s

توضیحات:

مشخص‌کننده dataclasses.field() باید تنها به‌عنوان مقدار یک انتساب درون یک dataclass، یا درون تابع make_dataclass() استفاده شود.

کد دارای مشکل:

from dataclasses import dataclass, field
@dataclass
class C:
    a: float
    b: float
    c: float
    field(init=False)  # [invalid-field-call]
    def __post_init__(self):
        self.c = self.a + self.b
print(field(init=False))  # [invalid-field-call]

کد درست:

from dataclasses import dataclass, field, make_dataclass
C = make_dataclass(
    "C",
    [("x", int), "y", ("z", int, field(default=5))],
    namespace={"add_one": lambda self: self.x + 1},
)
@dataclass
class C:
    a: float
    b: float
    c: float = field(init=False)
    def __post_init__(self):
        self.c = self.a + self.b

ایجادشده توسط بررسی‌کننده dataclass https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/dataclass_checker.py..SS invalid-format-returned / E0311

پیام صادرشده:

__format__ مقدار str برنمی‌گرداند

توضیحات:

زمانی استفاده می‌شود که متد __format__ مقداری غیر از رشته بازگرداند

کد دارای مشکل:

class CustomFormat:
    """__format__ returns <type 'int'>"""
    def __format__(self, format_spec):  # [invalid-format-returned]
        return 1

کد صحیح:

class CustomFormat:
    """__format__ returns <type 'str'>"""
    def __format__(self, format_spec):
        return "hello!"

تولید شده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/special_methods_checker.py.

پیام صادرشده:

__getnewargs_ex__ تاپلی شامل (tuple, dict) برنمی‌گرداند

توضیحات:

زمانی استفاده می‌شود که متد __getnewargs_ex__ مقداری را بازگرداند که به صورت tuple(tuple, dict) نباشد

کد دارای مشکل:

class CustomGetNewArgsEx:
    """__getnewargs_ex__ returns tuple with incorrect arg length"""
    def __getnewargs_ex__(self):  # [invalid-getnewargs-ex-returned]
        return (tuple(1), dict(x="y"), 1)

کد صحیح:

class CustomGetNewArgsEx:
    """__getnewargs_ex__ returns <type 'tuple'>"""
    def __getnewargs_ex__(self):
        return ((1,), {"2": 2})

تولید شده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/special_methods_checker.py..SS invalid-getnewargs-returned / E0312

پیام صادرشده:

__getnewargs__ یک tuple بازنمی‌گرداند

توضیحات:

هنگامی به کار می‌رود که متد __getnewargs__ چیزی غیر از tuple بازگرداند

کد دارای مشکل:

class CustomGetNewArgs:
    """__getnewargs__ returns an integer"""
    def __getnewargs__(self):  # [invalid-getnewargs-returned]
        return 1

کد درست:

class CustomGetNewArgs:
    """__getnewargs__ returns <type 'tuple'>"""
    def __getnewargs__(self):
        return (1, 2)

ایجادشده توسط بررسی‌کنندهٔ classes در https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/special_methods_checker.py.

پیام صادرشده:

__hash__ یک int بازنمی‌گرداند

توضیحات:

هنگامی به کار می‌رود که متد __hash__ چیزی غیر از یک عدد صحیح (integer) بازگرداند

کد دارای مشکل:

class CustomHash:
    """__hash__ returns dict"""
    def __hash__(self):  # [invalid-hash-returned]
        return {}

کد درست:

class CustomHash:
    """__hash__ returns `int`"""
    def __hash__(self):
        return 19

ایجادشده توسط بررسی‌کنندهٔ classes در https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/special_methods_checker.py..SS invalid-index-returned / E0305

پیام صادرشده:

__index__ مقدار int برنمی‌گرداند

توضیحات:

زمانی استفاده می‌شود که متد __index__ مقداری را برگرداند که عدد صحیح نیست

کد دارای مشکل:

class CustomIndex:
    """__index__ returns a dict"""
    def __index__(self):  # [invalid-index-returned]
        return {"19": "19"}

کد صحیح:

class CustomIndex:
    """__index__ returns <type 'int'>"""
    def __index__(self):
        return 19

ایجادشده توسط بازبین classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/special_methods_checker.py.

پیام صادرشده:

__length_hint__ عدد صحیح غیرمنفی برنمی‌گرداند

توضیحات:

زمانی استفاده می‌شود که متد __length_hint__ مقداری را برگرداند که یک عدد صحیح غیرمنفی نیست

کد دارای مشکل:

class CustomLengthHint:
    """__length_hint__ returns non-int"""
    def __length_hint__(self):  # [invalid-length-hint-returned]
        return 3.0

کد صحیح:

class CustomLengthHint:
    """__length_hint__ returns <type 'int'>"""
    def __length_hint__(self):
        return 10

ایجادشده توسط بازبین classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/special_methods_checker.py..SS invalid-length-returned / E0303

پیام صادرشده:

__len__ عدد صحیح غیرمنفی برنمی‌گرداند

توضیحات:

زمانی استفاده می‌شود که یک متد __len__ مقداری را برگرداند که یک عدد صحیح غیرمنفی نیست

کد دارای اشکال:

class FruitBasket:
    def __init__(self, fruits):
        self.fruits = ["Apple", "Banana", "Orange"]
    def __len__(self):  # [invalid-length-returned]
        return -len(self.fruits)

کد صحیح:

class FruitBasket:
    def __init__(self, fruits):
        self.fruits = ["Apple", "Banana", "Orange"]
    def __len__(self):
        return len(self.fruits)

ایجادشده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/special_methods_checker.py.

پیام صادرشده:

`__match_args__` باید یک تاپل از رشته‌ها باشد.

توضیحات:

زمانی صادر می‌شود که `__match_args__` یک تاپل از رشته‌های مورد نیاز برای match نباشد.

کد دارای اشکال:

class Book:
    __match_args__ = ["title", "year"]  # [invalid-match-args-definition]
    def __init__(self, title, year):
        self.title = title
        self.year = year

کد صحیح:

class Book:
    __match_args__ = ("title", "year")
    def __init__(self, title, year):
        self.title = title
        self.year = year

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کنندهٔ match_statements https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/match_statements_checker.py..SS invalid-metaclass / E1139

پیام صادرشده:

متاکلاس نامعتبر %r استفاده شده است

توضیحات:

زمانی صادر می‌شود که تشخیص داده شود یک کلاس از چیزی به عنوان متاکلاس استفاده می‌کند که ممکن است برای استفاده به عنوان متاکلاس نامعتبر باشد.

کد مشکل‌دار:

class Apple(metaclass=int):  # [invalid-metaclass]
    pass

کد درست:

class Plant:
    pass
class Apple(Plant):
    pass

ایجادشده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.

پیام صادرشده:

__repr__ مقدار str برنمی‌گرداند

توضیحات:

زمانی استفاده می‌شود که متد __repr__ چیزی غیر از رشته برگرداند

کد مشکل‌دار:

class CustomRepr:
    """__repr__ returns <type 'int'>"""
    def __repr__(self):  # [invalid-repr-returned]
        return 1

کد درست:

class CustomRepr:
    """__repr__ returns <type 'str'>"""
    def __repr__(self):
        return "apples"

ایجادشده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/special_methods_checker.py..SS invalid-sequence-index / E1126

پیام صادرشده:

نمایهٔ دنباله یک int،‏ slice یا نمونه‌ای با __index__ نیست

توضیحات:

زمانی استفاده می‌شود که یک نوع دنباله با نوعی نامعتبر نمایه‌گذاری شود. انواع معتبر عبارتند از intها،‏ sliceها و اشیایی با متد __index__.

کد دارای مشکل:

fruits = ["apple", "banana", "orange"]
print(fruits["apple"])  # [invalid-sequence-index]

کد صحیح:

fruits = ["apple", "banana", "orange"]
print(fruits[0])

جزئیات بیشتر:

مراقب استفاده از [True] یا [False] به عنوان نمایهٔ دنباله باشید، زیرا True و False به ترتیب به صورت 1 و 0 ارزیابی می‌شوند و بدون ایجاد خطا، عنصر دوم و اول لیست را برمی‌گردانند.

ایجادشده توسط بررسی‌کنندهٔ typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.

پیام صادرشده:

نمایهٔ برش یک int،‏ None یا نمونه‌ای با __index__ نیست

توضیحات:

زمانی استفاده می‌شود که نمایهٔ برش یک عدد صحیح، None یا شیئی با متد __index__ نباشد.

کد دارای مشکل:

LETTERS = ["a", "b", "c", "d"]
FIRST_THREE = LETTERS[:"3"]  # [invalid-slice-index]

کد صحیح:

LETTERS = ["a", "b", "c", "d"]
FIRST_THREE = LETTERS[:3]

ایجادشده توسط بررسی‌کنندهٔ typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.

پیام صادرشده:

گام برش نمی‌تواند 0 باشد

توضیحات:

زمانی استفاده می‌شود که گام برش 0 باشد و شیء، متد سفارشی __getitem__ را پیاده‌سازی نکرده باشد.

کد دارای مشکل:

LETTERS = ["a", "b", "c", "d"]
LETTERS[::0]  # [invalid-slice-step]

کد صحیح:

LETTERS = ["a", "b", "c", "d"]
LETTERS[::2]

ایجادشده توسط بررسی‌کنندهٔ typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py..SS invalid-slots / E0238

پیام صادرشده:

Invalid __slots__ object

توضیحات:

هنگامی استفاده می‌شود که یک __slots__ نامعتبر در کلاس یافت شود. تنها یک رشته، یک شیء تکرارپذیر یا یک دنباله مجاز است.

کد دارای اشکال:

class Person:  # [invalid-slots]
    __slots__ = 42

کد درست:

class Person:
    __slots__ = ("name", "age")

ایجاد شده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

Invalid object %r in __slots__, must contain only non empty strings

توضیحات:

هنگامی استفاده می‌شود که یک شیء نامعتبر (غیررشته‌ای) در __slots__ قرار گیرد.

کد دارای اشکال:

class Person:
    __slots__ = ("name", 3)  # [invalid-slots-object]

کد درست:

class Person:
    __slots__ = ("name", "surname")

پیوندهای مرتبط:

•
مستندات برای __slots__ https://docs.python.org/3/reference/datamodel.html#slots

ایجاد شده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

Starred assignment target must be in a list or tuple

توضیحات:

هنگامی صادر می‌شود که یک عبارت ستاره‌دار به‌عنوان مقصد انتساب ستاره‌دار استفاده شود.

کد دارای اشکال:

*fruit = ["apple", "banana", "orange"]  # [invalid-star-assignment-target]

کد درست:

fruit = ["apple", "banana", "orange"]

ایجاد شده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py..SS invalid-str-returned / E0307

پیام صادرشده:

__str__ مقدار str بازنمی‌گرداند

توضیحات:

هنگامی به کار می‌رود که متد __str__ چیزی غیر از یک رشته را بازگرداند.

کد دارای اشکال:

class CustomStr:
    """__str__ returns int"""
    def __str__(self):  # [invalid-str-returned]
        return 1

کد درست:

class CustomStr:
    """__str__ returns <type 'str'>"""
    def __str__(self):
        return "oranges"

ایجادشده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/special_methods_checker.py.

پیام صادرشده:

%s

توضیحات:

هنگامی صادر می‌شود که یک عملوند یکانی روی شیئی به کار رود که از این نوع عملیات پشتیبانی نمی‌کند.

کد دارای اشکال:

cherries = 10
eaten_cherries = int
cherries = -eaten_cherries  # [invalid-unary-operand-type]

کد درست:

cherries = 10
eaten_cherries = 2
cherries -= eaten_cherries

ایجادشده توسط بررسی‌کنندهٔ typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.

پیام صادرشده:

UTF-16 و UTF-32 با نسخه‌های پیشین سازگار نیستند. به‌جای آن‌ها از UTF-8 استفاده کنید

توضیحات:

برای سازگاری، به‌جای UTF-16/UTF-32 از UTF-8 استفاده کنید. همچنین برای پیشینهٔ این موضوع به https://bugs.python.org/issue1503789 مراجعه کنید. و برای برخی از مشکلات احتمالی، برای نمونه هنگام استفاده از UTF-16، https://softwareengineering.stackexchange.com/questions/102205 را ببینید.

جزئیات تکمیلی:

این پیام یک جای‌نگه‌دار برای مشکلی احتمالی در آینده در رابطه با کدک‌های یونیکد است.

ایجادشده توسط بررسی‌کنندهٔ unicode_checker https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/unicode.py..SS logging-format-truncated / E1201

پیام صادرشده:

رشته قالب‌بندی لاگ‌گیری در میانه مشخص‌کننده تبدیل پایان می‌یابد

توضیحات:

زمانی استفاده می‌شود که رشته قالب دستور لاگ‌گیری پیش از پایان مشخص‌کننده تبدیل خاتمه یابد.

کد مشکل‌دار:

import logging
import sys
logging.warning("Python version: %", sys.version)  # [logging-format-truncated]

کد صحیح:

import logging
import sys
logging.warning("Python version: %s", sys.version)

ایجاد شده توسط بررسی‌کننده logging https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/logging.py.

پیام صادرشده:

آرگومان‌های ناکافی برای رشته قالب‌بندی لاگ‌گیری

توضیحات:

زمانی استفاده می‌شود که به رشته قالب‌بندی لاگ‌گیری، آرگومان‌های بسیار کمی اختصاص داده شود.

کد مشکل‌دار:

import logging
try:
    function()
except Exception as e:
    logging.error("%s error occurred: %s", e)  # [logging-too-few-args]
    raise

کد صحیح:

import logging
try:
    function()
except Exception as e:
    logging.error("%s error occurred: %s", type(e), e)
    raise

ایجاد شده توسط بررسی‌کننده logging https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/logging.py..SS logging-too-many-args / E1205

پیام صادرشده:

آرگومان‌های بیش از حد برای رشته قالب‌بندی لاگ‌گیری

توضیحات:

زمانی استفاده می‌شود که به یک رشته قالب‌بندی لاگ‌گیری، بیش از حد آرگومان داده شود.

کد دارای مشکل:

import logging
try:
    function()
except Exception as e:
    logging.error("Error occurred: %s", type(e), e)  # [logging-too-many-args]
    raise

کد درست:

import logging
try:
    function()
except Exception as e:
    logging.error("%s error occurred: %s", type(e), e)
    raise

ایجادشده توسط بررسی‌کننده logging https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/logging.py.

پیام صادرشده:

نویسه قالب‌بندی لاگ‌گیری پشتیبانی‌نشده %r (%#02x) در اندیس %d

توضیحات:

زمانی استفاده می‌شود که یک نویسه قالب‌بندی پشتیبانی‌نشده در رشته قالب‌بندی دستور لاگ‌گیری به کار رود.

کد دارای مشکل:

import logging
logging.info("%s %y !", "Hello", "World")  # [logging-unsupported-format]

کد درست:

import logging
logging.info("%s %s !", "Hello", "World")

ایجادشده توسط بررسی‌کننده logging https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/logging.py..SS method-hidden / E0202

پیام صادرشده:

صفت تعریف‌شده در %s خط %s این متد را پنهان می‌کند

توضیحات:

زمانی استفاده می‌شود که یک کلاس متدی را تعریف کند که توسط یک صفت نمونه از یک کلاس والد یا تنظیم‌شده توسط کد بیرونی پنهان شده باشد.

کد دارای مشکل:

class Fruit:
    def __init__(self, vitamins):
        self.vitamins = vitamins
    def vitamins(self):  # [method-hidden]
        pass

کد درست:

class Fruit:
    def __init__(self, vitamins):
        self.vitamins = vitamins
    def antioxidants(self):
        pass

ایجاد شده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

دستور raise درون یک بند except قرار ندارد

توضیحات:

زمانی استفاده می‌شود که یک raise بدون آرگومان (bare raise) درون یک بند except استفاده نشده باشد. این کار خطایی تولید می‌کند، زیرا هیچ استثنای فعالی برای پرتاب مجدد وجود ندارد. یک استثنا در این قاعده، یک raise بدون آرگومان درون یک بند finally است که تا زمانی که استثنایی درون بلوک try ایجاد شده باشد ممکن است کار کند، اما با این وجود نوعی بوی بد کد (code smell) به شمار می‌رود و نباید به آن اتکا کرد.

کد دارای مشکل:

def validate_positive(x):
    if x <= 0:
        raise  # [misplaced-bare-raise]

کد درست:

def validate_positive(x):
    if x <= 0:
        raise ValueError(f"{x} is not positive")

ایجاد شده توسط بررسی‌کننده exceptions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/exceptions.py..SS misplaced-format-function / E0119

پیام صادرشده:

تابع format روی str فراخوانی نشده است

توضیحات:

زمانی صادر می‌شود که تابع format روی یک شیء str فراخوانی نشود؛ مانند انجام print("value: {}").format(123) به‌جای print("value: {}".format(123)). ممکن است این چیزی نباشد که کاربر قصد انجام آن را داشته است.

کد دارای مشکل:

print("Value: {}").format("Car")  # [misplaced-format-function]

کد درست:

print("Value: {}".format("Car"))

ایجادشده توسط بررسی‌کنندهٔ basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py.

پیام صادرشده:

کلید %r در دیکشنری رشتهٔ قالب وجود ندارد

توضیحات:

زمانی استفاده می‌شود که یک رشتهٔ قالب با مشخص‌کننده‌های تبدیل نام‌گذاری‌شده، همراه با دیکشنری‌ای به‌کار رود که شامل تمام کلیدهای مورد نیاز آن رشتهٔ قالب نیست.

کد دارای مشکل:

# +1: [missing-format-string-key]
fruit_prices = """
Apple: %(apple_price)d ¤
Orange: %(orange_price)d ¤
""" % {
    "apple_price": 42
}

کد درست:

fruit_prices = """
Apple: %(apple_price)d ¤
Orange: %(orange_price)d ¤
""" % {
    "apple_price": 42,
    "orange_price": 87,
}

ایجادشده توسط بررسی‌کنندهٔ string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py.

پیام صادرشده:

آرگومان کلیدواژه‌ای اجباری %r در فراخوانی %s وجود ندارد

توضیحات:

زمانی استفاده می‌شود که در فراخوانی یک تابع، یک آرگومان فقط-کلیدواژه‌ای (keyword-only) اجباری ارسال نشود.

کد دارای مشکل:

def target(pos, *, keyword):
    return pos + keyword
def not_forwarding_kwargs(*args, **kwargs):
    target(*args)  # [missing-kwoa]

کد درست:

def target(pos, *, keyword):
    return pos + keyword
def not_forwarding_kwargs(*args, **kwargs):
    target(*args, **kwargs)

ایجادشده توسط بررسی‌کنندهٔ typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py..SS mixed-format-string / E1302

پیام صادرشده:

ترکیب مشخص‌کننده‌های تبدیل نام‌دار و بدون نام در رشته قالب‌بندی

توضیحات:

هنگامی استفاده می‌شود که یک رشته قالب‌بندی، هم شامل مشخص‌کننده‌های تبدیل نام‌دار (مانند '%(foo)d') و هم بدون نام (مانند '%d') باشد. همچنین زمانی استفاده می‌شود که یک مشخص‌کننده تبدیل نام‌دار شامل * برای حداقل عرض فیلد و/یا دقت باشد.

کد دارای مشکل:

print("x=%(x)d, y=%d" % (0, 1))  # [mixed-format-string]

کد صحیح:

only_named.py:

print("x=%(x)d, y=%(y)d" % {"x": 0, "y": 1})

only_ordered.py:

print("x=%d, y=%d" % (0, 1))

ایجاد شده توسط بررسی‌کننده string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py.

پیام صادرشده:

دیکشنری در حال پیمایش '%s' در داخل بدنه حلقه for در حال تغییر است؛ در عوض روی رونوشتی از آن پیمایش کنید.

توضیحات:

هنگامی صادر می‌شود که مواردی به یک dict در حال پیمایش اضافه یا از آن حذف شوند. انجام این کار باعث ایجاد خطای RuntimeError می‌شود.

کد دارای مشکل:

fruits = {"apple": 1, "orange": 2, "mango": 3}
i = 0
for fruit in fruits:
    fruits["apple"] = i  # [modified-iterating-dict]
    i += 1

کد صحیح:

fruits = {"apple": 1, "orange": 2, "mango": 3}
i = 0
for fruit in fruits.copy():
    fruits["apple"] = i
    i += 1

ایجاد شده توسط بررسی‌کننده modified_iteration https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/modified_iterating_checker.py..SS modified-iterating-set / E4703

پیام صادرشده:

مجموعهٔ در حال پیمایش '%s' در بدنهٔ حلقهٔ for تغییر داده می‌شود، به‌جای آن روی یک رونوشت از آن پیمایش کنید.

توضیحات:

زمانی صادر می‌شود که مواردی به یک مجموعهٔ در حال پیمایش اضافه یا از آن حذف شوند. انجام این کار باعث ایجاد یک RuntimeError می‌شود.

کد دارای مشکل:

fruits = {"apple", "orange", "mango"}
for fruit in fruits:
    fruits.add(fruit + "yum")  # [modified-iterating-set]

کد درست:

fruits = {"apple", "orange", "mango"}
for fruit in fruits.copy():
    fruits.add(fruit + "yum")

ایجاد شده توسط بازبین modified_iteration https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/modified_iterating_checker.py.

پیام صادرشده:

چندین زیرالگو برای صفت %s

توضیحات:

زمانی صادر می‌شود که بیش از یک زیرالگو برای یک صفت مشخص در یک الگوی کلاس وجود داشته باشد.

کد دارای مشکل:

class Book:
    __match_args__ = ("title", "year")
    def __init__(self, title, year):
        self.title = title
        self.year = year
def func(item: Book):
    match item:
        case Book("abc", title="abc"):  # [multiple-class-sub-patterns]
            ...
        case Book(year=2000, year=2001):  # [multiple-class-sub-patterns]
            ...

کد درست:

class Book:
    __match_args__ = ("title", "year")
    def __init__(self, title, year):
        self.title = title
        self.year = year
def func(item: Book):
    match item:
        case Book(title="abc"):
            ...
        case Book(year=2000):
            ...

پیوندهای مرتبط:

ایجاد شده توسط بازبین match_statements https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/match_statements_checker.py..SS no-member / E1101

پیام صادرشده:

%s %r has no %r member%s

توضیحات:

زمانی استفاده می‌شود که به یک عضو ناموجود از یک متغیر دسترسی پیدا شود.

کد دارای مشکل:

from pathlib import Path
directories = Path("".").mothers  # [no-member]
class Cat:
    def meow(self):
        print(""Meow")
Cat().roar()  # [no-member]

کد تصحیح‌شده:

from pathlib import Path
directories = Path("".").parents
class Cat:
    def meow(self):
        print(""Meow")
Cat().meow()

جزئیات بیشتر:

اگر با خطای ناخوشایند no-member مواجه شده‌اید، این احتمال وجود دارد که یکی از موارد زیر رخ داده باشد:

  • ابزار pylint یک باگ در کد شما پیدا کرده است
  • شما pylint را بدون نصب وابستگی‌ها در محیط اجرایی آن اجرا می‌کنید
  • بررسی کد مستلزم تحلیل یک ماژول اکستنشن C توسط pylint است و از انجام آن خودداری می‌کند
  • ابزار pylint کدهای تولیدشده به‌صورت پویا را درک نمی‌کند

تحلیل ماژول‌های اکستنشن C به‌صورت پیش‌فرض پشتیبانی نمی‌شود، به‌ویژه از آنجا که pylint راهی برای استخراج شیء AST از ماژول اکستنشن ندارد.

اما pylint در واقع سازوکاری دارد که در صورت تمایل به تحلیل اکستنشن‌های C می‌توانید از آن استفاده کنید. pylint پرچمی با نام extension-pkg-allow-list (سابقاً extension-pkg-whitelist) دارد که از طریق آن می‌توانید به آن اعلام کنید که ماژول مربوطه را وارد (import) کرده و از آن ماژول واردشده یک AST بسازد:

$ pylint --extension-pkg-allow-list=your_c_extension

توجه داشته باشید که استفاده از این پرچم بدین معناست که اکستنشن‌ها درون مفسر فعال پایتون بارگذاری می‌شوند و ممکن است کدهای دلخواهی را اجرا کنند که شاید شما تمایلی به آن نداشته باشید. به همین دلیل است که بارگذاری اکستنشن‌های C به‌صورت پیش‌فرض غیرفعال است. در صورتی که نمی‌خواهید دردسر مشخص کردن مداوم ماژول‌های اکستنشن C را با این پرچم متحمل شوید، می‌توانید گزینهٔ unsafe-load-any-extension را در فایل پیکربندی خود فعال کنید؛ این کار باعث ساخت اشیاء AST از تمام اکستنشن‌های C می‌شود که pylint با آن‌ها مواجه می‌گردد:

$ pylint --unsafe-load-any-extension=y

همچنین از آنجا که pylint برای صفاتی که در اکستنشن‌های C یافت نمی‌شوند خطای جداگانه‌ای تحت عنوان c-extension-no-member صادر می‌کند، می‌توانید این خطا را برای پروژهٔ خود غیرفعال نمایید.

اگر چیزی به‌صورت پویا تولید شود، pylint قادر به فهم کد کتابخانهٔ شما (چه اکستنشن C باشد و چه نباشد) نخواهد بود. در این حالت می‌توانید صفات تولیدشده را با گزینهٔ generated-members مشخص کنید. برای مثال اگر cv2.LINE_AA و sphinx.generated_member موارد مثبت کاذب برای no-member ایجاد می‌کنند، می‌توانید این دستور را اجرا کنید:

$ pylint --generated-member=cv2.LINE_AA,sphinx.generated_member

ایجادشده توسط بررسی‌کنندهٔ typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py..SS no-method-argument / E0211

پیام صادرشده:

Method %r has no argument

توضیحات:

زمانی استفاده می‌شود که متدی که باید نمونه مقید (bound instance) را به عنوان نخستین آرگومان داشته باشد، هیچ آرگومانی برای آن تعریف نشده باشد.

کد دارای اشکال:

class Person:
    def print_greeting():  # [no-method-argument]
        print("hello")

کد درست:

class Person:
    def print_greeting(self):
        print("hello")

ایجادشده توسط بازبین classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

No name %r in module %r

توضیحات:

زمانی استفاده می‌شود که نامی در یک ماژول پیدا نشود.

کد دارای اشکال:

from os import pizza  # [no-name-in-module]

کد درست:

from os import path

ایجادشده توسط بازبین variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py.

پیام صادرشده:

Method %r should have "self" as first argument

توضیحات:

زمانی استفاده می‌شود که یک متد آرگومانی غیر از "self" را به عنوان نخستین آرگومان خود داشته باشد. این مورد یک خطا در نظر گرفته می‌شود زیرا این قرارداد به قدری رایج است که نباید آن را زیر پا بگذارید!

کد دارای اشکال:

class Fruit:
    def __init__(this, name):  # [no-self-argument]
        this.name = name

کد درست:

class Fruit:
    def __init__(self, name):
        self.name = name

ایجادشده توسط بازبین classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py..SS no-value-for-parameter / E1120

پیام صادرشده:

هیچ مقداری برای آرگومان %s در فراخوانی %s وجود ندارد

توضیحات:

زمانی استفاده می‌شود که در فراخوانی یک تابع، آرگومان‌های بسیار کمی ارسال شود.

کد دارای مشکل:

def add(x, y):
    return x + y
add(1)  # [no-value-for-parameter]

کد درست:

def add(x, y):
    return x + y
add(1, 2)

ایجادشده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.

پیام صادرشده:

__iter__ یک غیرتکرارکننده بازمی‌گرداند

توضیحات:

زمانی استفاده می‌شود که یک متد __iter__ چیزی را بازگرداند که تکرارپذیر نیست (یعنی فاقد متد `__next__` است)

کد دارای مشکل:

import random
class GenericAstrology:
    def __init__(self, signs, predictions):
        self.signs = signs
        self.predictions = predictions
    def __iter__(self):  # [non-iterator-returned]
        self.index = 0
        self.number_of_prediction = len(self.predictions)
        return self
SIGNS = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra"]
PREDICTIONS = ["good things", "bad thing", "existential dread"]
for sign, prediction in GenericAstrology(SIGNS, PREDICTIONS):
    print(f"{sign} : {prediction} today")

کد درست:

import random
class GenericAstrology:
    def __init__(self, signs, predictions):
        self.signs = signs
        self.predictions = predictions
    def __iter__(self):
        self.index = 0
        self.number_of_prediction = len(self.predictions)
        return self
    def __next__(self):
        if self.index == len(self.signs):
            raise StopIteration
        self.index += 1
        prediction_index = random.randint(0, self.number_of_prediction - 1)
        return self.signs[self.index - 1], self.predictions[prediction_index]
SIGNS = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra"]
PREDICTIONS = ["good things", "bad thing", "existential dread"]
for sign, prediction in GenericAstrology(SIGNS, PREDICTIONS):
    print(f"{sign} : {prediction} today")

ایجادشده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/special_methods_checker.py..SS nonexistent-operator / E0107

پیام صادرشده:

استفاده از عملگر ناموجود %s

توضیحات:

زمانی استفاده می‌شود که تلاش کنید از عملگرهای پیش‌افزایش یا پیش‌کاهش به سبک C (-- و ++) که در Python وجود ندارند، استفاده کنید.

کد دارای مشکل:

i = 0
while i <= 10:
    print(i)
    ++i  # [nonexistent-operator]

کد صحیح:

i = 0
while i <= 10:
    print(i)
    i += 1

ایجاد شده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py.

پیام صادرشده:

نام %r هم nonlocal و هم global است

توضیحات:

زمانی صادر می‌شود که یک نام، هم nonlocal و هم global باشد.

کد دارای مشکل:

NUMBER = 42
def update_number(number):  # [nonlocal-and-global]
    global NUMBER
    nonlocal NUMBER
    NUMBER = number
    print(f"New global number is: {NUMBER}")
update_number(24)

کد صحیح:

NUMBER = 42
def update_number(number):
    global NUMBER
    NUMBER = number
    print(f"New global number is: {NUMBER}")
update_number(24)

ایجاد شده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py..SS nonlocal-without-binding / E0117

پیام صادرشده:

nonlocal name %s found without binding

توضیحات:

زمانی صادر می‌شود که یک متغیر nonlocal هیچ نام متصل‌شده‌ای در دامنه‌های والد نداشته باشد

کد دارای مشکل:

class Fruit:
    def get_color(self):
        nonlocal colors  # [nonlocal-without-binding]

کد درست:

class Fruit:
    colors = ["red", "green"]
    def get_color(self):
        nonlocal colors

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py.

پیام صادرشده:

Non-mapping value %s is used in a mapping context

توضیحات:

زمانی استفاده می‌شود که یک مقدار غیرنگاشت در جایی که نگاشت انتظار می‌رود، به کار رود

کد دارای مشکل:

def print_colors(**colors):
    print(colors)
print_colors(**list("red", "black"))  # [not-a-mapping]

کد درست:

def print_colors(**colors):
    print(colors)
print_colors(**dict(red=1, black=2))

ایجادشده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py..SS not-an-iterable / E1133

پیام صادرشده:

مقدار غیرقابل‌پیمایش %s در یک بافت پیمایشی استفاده شده است

توضیحات:

زمانی استفاده می‌شود که یک مقدار غیرقابل‌پیمایش در جایی که انتظار یک شیء قابل‌پیمایش می‌رود به کار گرفته شود

کد دارای مشکل:

for i in 10:  # [not-an-iterable]
    pass

کد درست:

for i in "10":
    pass

ایجاد شده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.

پیام صادرشده:

مدیر زمینه ناهمگام '%s' متدهای __aenter__ و __aexit__ را پیاده‌سازی نکرده است.

توضیحات:

زمانی استفاده می‌شود که یک مدیر زمینه ناهمگام با شیئی به کار رود که پروتکل مدیریت زمینه ناهمگام را پیاده‌سازی نکرده است.

کد دارای مشکل:

class ContextManager:
    def __enter__(self):
        pass
    def __exit__(self, *exc):
        pass
async def foo():
    async with ContextManager():  # [not-async-context-manager]
        pass

کد درست:

class AsyncContextManager:
    def __aenter__(self):
        pass
    def __aexit__(self, *exc):
        pass
async def foo():
    async with AsyncContextManager():
        pass

جزئیات بیشتر:

مدیر زمینه ناهمگام متدهای __aenter__ و __aexit__ را پیاده‌سازی نکرده است. این پیام هنگام استفاده از Python < 3.5 صادر نمی‌شود.

ایجاد شده توسط بررسی‌کننده async https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/async_checker.py..SS not-callable / E1102

پیام صادرشده:

%s قابل فراخوانی نیست

توضیحات:

زمانی استفاده می‌شود که شیء فراخوانی‌شده، به عنوان یک شیء غیرقابل فراخوانی استنتاج شده باشد.

کد دارای مشکل:

NUMBER = 42
print(NUMBER())  # [not-callable]

کد درست:

NUMBER = 42
print(NUMBER)

ایجادشده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.

پیام صادرشده:

مدیر زمینه '%s' متدهای __enter__ و __exit__ را پیاده‌سازی نکرده است.

توضیحات:

زمانی استفاده می‌شود که یک نمونه در دستور with پروتکل مدیر زمینه (__enter__/__exit__) را پیاده‌سازی نکرده باشد.

کد دارای مشکل:

class MyContextManager:
    def __enter__(self):
        pass
with MyContextManager() as c:  # [not-context-manager]
    pass

کد درست:

class MyContextManager:
    def __enter__(self):
        pass
    def __exit__(self, *exc):
        pass
with MyContextManager() as c:
    pass

ایجادشده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py..SS not-in-loop / E0103

پیام صادرشده:

%r به درستی درون حلقه قرار نگرفته است

توضیحات:

زمانی استفاده می‌شود که کلیدواژه‌های break یا continue بیرون از یک حلقه استفاده شده باشند.

کد دارای مشکل:

def print_even_numbers():
    for i in range(100):
        if i % 2 == 0:
            print(i)
    else:
        continue  # [not-in-loop]

کد صحیح:

def print_even_numbers():
    for i in range(100):
        if i % 2:
            continue
        print(i)

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py.

پیام صادرشده:

NotImplemented برانگیخته شده است - باید NotImplementedError برانگیخته شود

توضیحات:

زمانی استفاده می‌شود که به جای NotImplementedError، خودِ NotImplemented برانگیخته شود.

کد دارای مشکل:

class Worm:
    def bore(self):
        raise NotImplemented  # [notimplemented-raised]

کد صحیح:

class Worm:
    def bore(self):
        raise NotImplementedError

ایجادشده توسط بررسی‌کننده exceptions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/exceptions.py.

پیام صادرشده:

`%s()` برخی آرگومان‌های فقط-موقعیتی را به صورت آرگومان‌های کلیدواژه‌ای دریافت کرد: %s

توضیحات:

زمانی صادر می‌شود که آرگومان‌های فقط-موقعیتی (positional-only) به صورت آرگومان‌های کلیدواژه‌ای ارسال شده باشند. کلیدواژه‌ها را برای آرگومان‌های مربوطه در فراخوانی تابع حذف کنید.

کد دارای مشکل:

def cube(n, /):
    """Takes in a number n, returns the cube of n"""
    return n**3
cube(n=2)  # [positional-only-arguments-expected]

کد صحیح:

def cube(n, /):
    """Takes in a number n, returns the cube of n"""
    return n**3
cube(2)

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کننده method_args https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/method_args.py..SS possibly-used-before-assignment / E0606

پیام صادرشده:

استفادهٔ احتمالی از متغیر %r پیش از انتساب

توضیحات:

زمانی صادر می‌شود که به یک متغیر محلی پیش از انتساب مقدار به آن در هر دو شاخهٔ ساختار if/else دسترسی پیدا شود.

کد دارای مشکل:

def check_lunchbox(items: list[str]):
    if not items:
        empty = True
    print(empty)  # [possibly-used-before-assignment]

کد درست:

def check_lunchbox(items: list[str]):
    empty = False
    if not items:
        empty = True
    print(empty)

جزئیات بیشتر:

می‌توانید از assert_never برای مشخص کردن انتخاب‌های جامع (exhaustive) استفاده کنید:

from typing import assert_never
def handle_date_suffix(suffix):
    if suffix == "d":
        ...
    elif suffix == "m":
        ...
    elif suffix == "y":
        ...
    else:
        assert_never(suffix)
if suffix in "dmy":
    handle_date_suffix(suffix)

یا به جای assert_never()، می‌توانید تابعی با حاشیه‌نویسی بازگشتی Never یا NoReturn را فراخوانی کنید. برخلاف حالت معمول که pylint طبق طراحی خود حاشیه‌نویسی‌های نوع را نادیده می‌گیرد و تحلیل ایستای خودش را انجام می‌دهد، در اینجا pylint با این حاشیه‌نویسی‌های خاص مانند یک کامنت غیرفعال‌سازی رفتار می‌کند.

در حال حاضر pylint تکرار همان شرط را مانند این مجاز می‌داند، حتی با وجود اینکه این کار باعث نادیده ماندن برخی از موارد خطا می‌شود، چرا که pylint کدهای میانی را ارزیابی نمی‌کند:

if guarded():
    var = 1
# what if code here affects the result of guarded()?
if guarded():
    print(var)

اما این استثنا محدود به تکرار دقیقاً همان شرط است. این مورد هشدار صادر می‌کند:

if guarded():
    var = 1
if guarded() or other_condition:
    print(var)  # [possibly-used-before-assignment]

اگر این رفتار برایتان عجیب است، در نظر داشته باشید که pylint به عنوان یک ابزار تحلیل ایستا، نمی‌داند که آیا guarded() قطعی (deterministic) است یا با یک پایگاه‌داده ارتباط برقرار می‌کند. برای متغیرها (برای مثال guarded در برابر guarded())، این موضوع کمتر مسئله‌ساز است؛ بنابراین در این حالت، possibly-used-before-assignment بیشتر به عنوان یک ترجیح سبکی برای آینده‌نگری (future-proofing) عمل می‌کند تا این‌که ذاتاً یک خطا باشد.

ایجادشده توسط بررسی‌کنندهٔ variables در https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py..SS potential-index-error / E0643

پیام صادرشده:

نمایهٔ نامعتبر برای طول شیء تکرارپذیر

توضیحات:

زمانی صادر می‌شود که نمایهٔ استفاده‌شده روی یک شیء تکرارپذیر، فراتر از طول آن شیء باشد.

کد دارای مشکل:

print([1, 2, 3][3])  # [potential-index-error]

کد درست:

print([1, 2, 3][2])

ایجادشده توسط بررسی‌کنندهٔ variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py.

پیام صادرشده:

پرتاب %s در حالی که تنها کلاس‌ها یا نمونه‌ها مجاز هستند

توضیحات:

زمانی استفاده می‌شود که چیزی پرتاب شود که نه کلاس است و نه نمونه (یعنی یک `TypeError` رخ خواهد داد).

کد دارای مشکل:

class FasterThanTheSpeedOfLightError(ZeroDivisionError):
    def __init__(self):
        super().__init__("You can't go faster than the speed of light !")
def calculate_speed(distance: float, time: float) -> float:
    try:
        return distance / time
    except ZeroDivisionError as e:
        raise None  # [raising-bad-type]

کد درست:

class FasterThanTheSpeedOfLightError(ZeroDivisionError):
    def __init__(self):
        super().__init__("You can't go faster than the speed of light !")
def calculate_speed(distance: float, time: float) -> float:
    try:
        return distance / time
    except ZeroDivisionError as e:
        raise FasterThanTheSpeedOfLightError() from e

ایجادشده توسط بررسی‌کنندهٔ exceptions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/exceptions.py..SS raising-non-exception / E0710

پیام صادرشده:

برانگیختن کلاسی که از BaseException ارث‌بری نمی‌کند

توضیحات:

زمانی استفاده می‌شود که کلاسی برانگیخته شود که از BaseException ارث‌بری نمی‌کند.

کد دارای مشکل:

raise str  # [raising-non-exception]

کد درست:

raise Exception("Goodbye world !")

ایجادشده توسط بررسی‌کنندهٔ exceptions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/exceptions.py.

پیام صادرشده:

آرگومان %r بر پایهٔ موقعیت و کلیدواژه در فراخوانی %s ارسال شده است

توضیحات:

زمانی استفاده می‌شود که فراخوانی یک تابع منجر به انتساب چندین مقدار به یک پارامتر تابع شود؛ یک مقدار از طریق آرگومان موقعیتی و مقداری دیگر از طریق آرگومان کلیدواژه‌ای.

کد دارای مشکل:

def square(x):
    return x * x
square(5, x=4)  # [redundant-keyword-arg]

کد درست:

only_arg.py:

def square(x):
    return x * x
square(5)

only_kwarg.py:

def square(x):
    return x * x
square(x=4)

ایجادشده توسط بررسی‌کنندهٔ typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py..SS relative-beyond-top-level / E0402

پیام صادرشده:

تلاش برای واردسازی نسبی فراتر از بستهٔ سطح‌بالا

توضیحات:

زمانی استفاده می‌شود که یک واردسازی نسبی تلاش کند به سطوحی بیش از حد مجاز در بستهٔ جاری دسترسی یابد.

کد مشکل‌دار:

from ................antigravity import NGField  # [relative-beyond-top-level]

کد درست:

absolute_import.py:

from physic.antigravity import NGField

fix_the_relative_import.py:

# Right number of dots in the import: you needed 15 dots, not 16, duh.
# from ...............antigravity import NGField

جزئیات بیشتر:

از نظر تاریخی، واردسازی‌های مطلق (absolute imports) به‌شدت ترجیح داده می‌شدند. واردسازی‌های نسبی به شما امکان می‌دهند بسته‌ها را بدون تغییر هیچ کدی بازسازمان‌دهی کنید، اما امروزه ابزارهای بازآفرینی کد (refactoring) و IDEها به شما اجازه می‌دهند در صورت صریح/مطلق بودن واردسازی‌ها، در هر صورت این کار را تقریباً بدون هیچ هزینه‌ای انجام دهید. بنابراین، همچنان واردسازی‌های مطلق اغلب نسبت به موارد نسبی ترجیح داده می‌شوند.

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کنندهٔ imports https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/imports.py.

پیام صادرشده:

دریافت چندین مقدار برای آرگومان کلیدواژه‌ای %r در فراخوانی تابع

توضیحات:

زمانی صادر می‌شود که یک فراخوانی تابع چندین مقدار برای یک آرگومان کلیدواژه‌ای دریافت کند.

کد مشکل‌دار:

def func(a, b, c):
    return a, b, c
func(1, 2, c=3, **{"c": 4})  # [repeated-keyword]
func(1, 2, **{"c": 3}, **{"c": 4})  # [repeated-keyword]

کد درست:

def func(a, b, c):
    return a, b, c
func(1, 2, c=3)

ایجادشده توسط بررسی‌کنندهٔ typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py..SS return-arg-in-generator / E0106

پیام صادرشده:

دستور return همراه با آرگومان درون generator

توضیحات:

زمانی استفاده می‌شود که یک عبارت "return" همراه با آرگومان در یک تابع یا متد مولد (generator) یافت شود (برای مثال به همراه چند عبارت "yield").

کد درست:

def yield_numbers():
    for number in range(10):
        yield number
        return "I am now allowed!"  # This was not allowed in Python 3.3 and earlier.

جزئیات بیشتر:

این پیامی است که برای python > 3.3 صادر نخواهد شد. این پیام قبلاً برای کدهایی مانند زیر صادر می‌شد:

def interrogate_until_you_find_jack(pirates):
    for pirate in pirates:
        if pirate == "Captain Jack Sparrow":
            return "Arrr! We've found our captain!"
        yield pirate

که اکنون معتبر بوده و معادل حالت مورد انتظار پیشین است:

def interrogate_until_you_find_jack(pirates):
    for pirate in pirates:
        if pirate == "Captain Jack Sparrow":
            raise StopIteration("Arrr! We've found our captain!")
        yield pirate

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کنندهٔ basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py.

پیام صادرشده:

دستور return صریح در __init__

توضیحات:

زمانی استفاده می‌شود که متد خاص کلاس، یعنی __init__، دارای یک مقدار بازگشتی صریح باشد.

کد دارای مشکل:

class Sum:
    def __init__(self, a, b):  # [return-in-init]
        return a + b

کد درست:

class Sum:
    def __init__(self, a, b) -> None:
        self.result = a + b

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کنندهٔ basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py..SS return-outside-function / E0104

پیام صادرشده:

بازگشت خارج از تابع

توضیحات:

هنگامی استفاده می‌شود که یک دستور "return" در خارج از یک تابع یا متد پیدا شود.

کد دارای مشکل:

return 42  # [return-outside-function]

کد درست:

def get_the_answer():
    return 42

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py.

پیام صادرشده:

دکوراتور singledispatch نباید با متدها استفاده شود، به جای آن از singledispatchmethod استفاده کنید.

توضیحات:

دکوراتور singledispatch باید توابع را تزیین کند و نه متدهای کلاس یا نمونه را. برای چنین مواردی از singledispatchmethod استفاده کنید.

کد دارای مشکل:

from functools import singledispatch
class Board:
    @singledispatch  # [singledispatch-method]
    def convert_position(self, position):
        pass
    @convert_position.register  # [singledispatch-method]
    def _(self, position: str) -> tuple:
        position_a, position_b = position.split(",")
        return (int(position_a), int(position_b))
    @convert_position.register  # [singledispatch-method]
    def _(self, position: tuple) -> str:
        return f"{position[0]},{position[1]}"

کد درست:

from functools import singledispatch
@singledispatch
def convert_position(position):
    print(position)
@convert_position.register
def _(position: str) -> tuple:
    position_a, position_b = position.split(",")
    return (int(position_a), int(position_b))
@convert_position.register
def _(position: tuple) -> str:
    return f"{position[0]},{position[1]}"

ایجادشده توسط بررسی‌کننده stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py..SS singledispatchmethod-function / E1520

پیام صادرشده:

دکوراتور singledispatchmethod نباید برای توابع استفاده شود؛ به‌جای آن از singledispatch استفاده کنید.

توضیحات:

singledispatchmethod باید متدهای کلاس یا نمونه را تزیین کند و نه توابع را. در این موارد از singledispatch استفاده کنید.

کد مشکل‌دار:

from functools import singledispatchmethod
@singledispatchmethod  # [singledispatchmethod-function]
def convert_position(position):
    print(position)
@convert_position.register  # [singledispatchmethod-function]
def _(position: str) -> tuple:
    position_a, position_b = position.split(",")
    return (int(position_a), int(position_b))
@convert_position.register  # [singledispatchmethod-function]
def _(position: tuple) -> str:
    return f"{position[0]},{position[1]}"

کد درست:

from functools import singledispatchmethod
class Board:
    @singledispatchmethod
    def convert_position(cls, position):
        pass
    @singledispatchmethod
    @classmethod
    def _(cls, position: str) -> tuple:
        position_a, position_b = position.split(",")
        return (int(position_a), int(position_b))
    @singledispatchmethod
    @classmethod
    def _(cls, position: tuple) -> str:
        return f"{position[0]},{position[1]}"

ایجادشده توسط بازبین stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py.

پیام صادرشده:

عبارت ستاره‌دار فقط می‌تواند در مقصد انتساب استفاده شود

توضیحات:

هنگامی صادر می‌شود که یک عبارت ستاره‌دار در مقصد انتساب استفاده نشده باشد.

کد مشکل‌دار:

stars = *["Sirius", "Arcturus", "Vega"]  # [star-needs-assignment-target]

کد درست:

sirius, *arcturus_and_vega = ["Sirius", "Arcturus", "Vega"]

ایجادشده توسط بازبین basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py..SS syntax-error / E0001

پیام صادرشده:

%s

توضیحات:

زمانی استفاده می‌شود که یک خطای نحوی برای یک پودمان رخ دهد.

کد دارای مشکل:

fruit_stock = {
    'apple': 42,
    'orange': 21  # [syntax-error]
    'banana': 12
}

کد درست:

fruit_stock = {"apple": 42, "orange": 21, "banana": 12}

جزئیات تکمیلی:

پودمان توکار ast در python در صورت وجود یک خطای نحوی نمی‌تواند کد شما را تجزیه کند، بنابراین در صورت بروز خطای نحوی، سایر پیام‌ها اصلاً در دسترس نخواهند بود.

پیوندهای مرتبط:

•
چرا pylint نمی‌تواند از یک خطای نحوی بازیابی شود؟ https://stackoverflow.com/a/78419051/2519059

ایجاد شده توسط بازبین main https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py.

پیام صادرشده:

آرگومان‌های کافی برای رشتهٔ قالب‌بندی وجود ندارد (Not enough arguments for format string)

توضیحات:

زمانی استفاده می‌شود که به یک رشتهٔ قالب‌بندی که از مشخص‌کننده‌های تبدیل بدون نام استفاده می‌کند، آرگومان‌های بسیار کمی داده شود.

کد دارای مشکل:

print("Today is {0}, so tomorrow will be {1}".format("Monday"))  # [too-few-format-args]

کد درست:

print("Today is {0}, so tomorrow will be {1}".format("Monday", "Tuesday"))

پیوندهای مرتبط:

ایجاد شده توسط بازبین string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py..SS too-many-format-args / E1305

پیام صادرشده:

آرگومان‌های بیش از حد برای رشته قالب‌بندی

توضیحات:

زمانی استفاده می‌شود که به یک رشته قالب‌بندی که از مشخص‌کننده‌های تبدیل بدون نام استفاده می‌کند، آرگومان‌های بیش از حد داده شود.

کد دارای اشکال:

# +1: [too-many-format-args]
print("Today is {0}, so tomorrow will be {1}".format("Monday", "Tuesday", "Wednesday"))

کد درست:

print("Today is {0}, so tomorrow will be {1}".format("Monday", "Tuesday"))

پیوندهای مرتبط:

ایجاد شده توسط بررسی‌کننده string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py.

پیام صادرشده:

آرگومان‌های مکانی بیش از حد برای فراخوانی %s

توضیحات:

زمانی استفاده می‌شود که در فراخوانی یک تابع، آرگومان‌های مکانی بیش از حد ارسال شود.

کد دارای اشکال:

class Fruit:
    def __init__(self, color):
        self.color = color
apple = Fruit("red", "apple", [1, 2, 3])  # [too-many-function-args]

کد درست:

class Fruit:
    def __init__(self, color, name):
        self.color = color
        self.name = name
apple = Fruit("red", "apple")

ایجاد شده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py..SS too-many-positional-sub-patterns / E1903

پیام صادرشده:

%s انتظار %d زیرالگوی موقعیتی دارد (%d داده شده است)

توضیحات:

هنگامی صادر می‌شود که تعداد زیرالگوهای موقعیتی از تعداد زیرالگوهای مجاز مشخص‌شده در `__match_args__` فراتر رود.

کد دارای مشکل:

class Book:
    __match_args__ = ("title", "year")
    def __init__(self, title, year, author):
        self.title = title
        self.year = year
        self.author = author
def func(item: Book):
    match item:
        case Book("title", 2000, "author"):  # [too-many-positional-sub-patterns]
            ...

کد درست:

class Book:
    __match_args__ = ("title", "year")
    def __init__(self, title, year, author):
        self.title = title
        self.year = year
        self.author = author
def func(item: Book):
    match item:
        case Book("title", 2000, author="author"):
            ...

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کنندهٔ match_statements https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/match_statements_checker.py.

پیام صادرشده:

بیش از یک عبارت ستاره‌دار در انتساب

توضیحات:

هنگامی صادر می‌شود که بیش از یک عبارت ستاره‌دار (`*x`) در یک انتساب وجود داشته باشد. این یک SyntaxError است.

کد دارای مشکل:

*stars, *constellations = ["Sirius", "Arcturus", "Vega"]  # [too-many-star-expressions]

کد درست:

*sirius_and_arcturus, vega = ["Sirius", "Arcturus", "Vega"]

ایجادشده توسط بررسی‌کنندهٔ basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py..SS truncated-format-string / E1301

پیام صادرشده:

رشته قالب‌بندی در میانه مشخص‌کننده تبدیل پایان می‌یابد

توضیحات:

زمانی استفاده می‌شود که یک رشته قالب‌بندی پیش از پایان یک مشخص‌کننده تبدیل خاتمه یابد.

کد دارای مشکل:

PARG_2 = 1
print("strange format %2" % PARG_2)  # [truncated-format-string]

کد درست:

PARG_2 = 1
print(f"strange format {PARG_2}")

ایجادشده توسط بررسی‌کننده string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py.

پیام صادرشده:

نام متغیر تعریف‌نشده %r در __all__

توضیحات:

زمانی استفاده می‌شود که در __all__ به یک نام متغیر تعریف‌نشده ارجاع داده شود.

کد دارای مشکل:

__all__ = ["get_fruit_colour"]  # [undefined-all-variable]
def get_fruit_color():
    pass

کد درست:

__all__ = ["get_fruit_color"]
def get_fruit_color():
    pass

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کننده variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py..SS undefined-variable / E0602

پیام صادرشده:

متغیر تعریف‌نشده %r

توضیحات:

زمانی استفاده می‌شود که به یک متغیر تعریف‌نشده دسترسی پیدا شود.

کد دارای مشکل:

print(number + 2)  # [undefined-variable]

کد صحیح:

number = 3
print(number + 2)

ایجادشده توسط بررسی‌کننده variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py.

پیام صادرشده:

آرگومان کلیدواژه‌ای غیرمنتظره %r در فراخوانی %s

توضیحات:

زمانی استفاده می‌شود که در فراخوانی یک تابع، آرگومان کلیدواژه‌ای ارسال شود که با هیچ‌یک از نام‌های پارامتر تابع مطابقت ندارد.

کد دارای مشکل:

def print_coordinates(x=0, y=0):
    print(f"{x=}, {y=}")
print_coordinates(x=1, y=2, z=3)  # [unexpected-keyword-arg]

کد صحیح:

def print_coordinates(x=0, y=0):
    print(f"{x=}, {y=}")
print_coordinates(x=1, y=2)

ایجادشده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.

پیام صادرشده:

متد ویژه %r انتظار %s پارامتر(ها) را دارد، %d %s داده شده است

توضیحات:

زمانی صادر می‌شود که یک متد ویژه با تعداد نامعتبری از پارامترها تعریف شده باشد. اگر تعداد آن‌ها بسیار کم یا بسیار زیاد باشد، ممکن است اصلاً کار نکند.

کد دارای مشکل:

class ContextManager:
    def __enter__(self, context):  # [unexpected-special-method-signature]
        pass
    def __exit__(self, type):  # [unexpected-special-method-signature]
        pass

کد صحیح:

class ContextManager:
    def __enter__(self):
        pass
    def __exit__(self, type, value, traceback):
        pass

ایجادشده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/special_methods_checker.py..SS unhashable-member / E1143

پیام صادرشده:

'%s' هش‌پذیر نیست و نمی‌تواند به عنوان یک %s در یک %s به کار رود

توضیحات:

زمانی صادر می‌شود که یک کلید dict یا عضو set هش‌پذیر نباشد (یعنی متد __hash__ را تعریف نکرده باشد).

کد دارای مشکل:

# Print the number of apples:
print({"apple": 42}[["apple"]])  # [unhashable-member]

کد صحیح:

# Print the number of apples:
print({"apple": 42}["apple"])

ایجاد شده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.

پیام صادرشده:

تلاش برای بازگشایی یک غیردنباله%s

توضیحات:

زمانی استفاده می‌شود که چیزی که یک دنباله نیست، در یک انتساب بازگشایی (unpack) به کار رود

کد دارای مشکل:

a, b, c = 1  # [unpacking-non-sequence]

کد صحیح:

a, b, c = 1, 2, 3

ایجاد شده توسط بررسی‌کننده variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py.

پیام صادرشده:

گزینه فایل ناشناخته %r

توضیحات:

زمانی استفاده می‌شود که با یک گزینه درون‌خطی ناشناخته مواجه شویم.

کد دارای مشکل:

# +1: [unrecognized-inline-option]
# pylint:applesoranges=1

کد صحیح:

# pylint: enable=too-many-public-methods

ایجاد شده توسط بررسی‌کننده main https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py..SS unrecognized-option / E0015

پیام صادرشده:

گزینه ناشناخته یافت شد: %s

توضیحات:

هنگامی استفاده می‌شود که گزینه‌ای تشخیص داده شود که برای برنامه ناشناخته است.

جزئیات تکمیلی:

یکی از گزینه‌های شما ناشناخته است. نیازی به ایجاد تغییر در کد شما نیست، اما پیکربندی pylint یا نحوه فراخوانی pylint باید اصلاح شود.

برای نمونه، این پیام هنگام اجرای pylint به صورت pylint --unknown-option=yes test.py صادر می‌شود. یا ممکن است pylint را با پیکربندی toml زیر اجرا کرده باشید:

[tool.pylint]
jars = "10"

در حالی که باید از مورد زیر استفاده شود:

[tool.pylint]
jobs = "10"

این هشدار در pylint 2.14 اضافه شد؛ پیش از آن، گزینه‌های نادرست در سکوت و بدون خطا نادیده گرفته می‌شدند.

ایجاد شده توسط بازبین main https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py.

پیام صادرشده:

مقدار '%s' قابل اندیس‌گذاری نیست

توضیحات:

هنگامی صادر می‌شود که یک مقدار اندیس‌گذاری‌شده از قابلیت اندیس‌گذاری پشتیبانی نکند (یعنی متد __getitem__ یا برای یک کلاس متد __class_getitem__ را تعریف نکرده باشد).

کد دارای مشکل:

class Fruit:
    pass
Fruit()[1]  # [unsubscriptable-object]

کد صحیح:

class Fruit:
    def __init__(self):
        self.colors = ["red", "orange", "yellow"]
    def __getitem__(self, idx):
        return self.colors[idx]
Fruit()[1]

ایجاد شده توسط بازبین typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py..SS unsupported-assignment-operation / E1137

پیام صادرشده:

%r does not support item assignment

توضیحات:

زمانی صادر می‌شود که یک شیء از انتساب آیتم پشتیبانی نکند (یعنی متد __setitem__ را تعریف نکرده باشد).

کد مشکل‌دار:

def pick_fruits(fruits):
    for fruit in fruits:
        print(fruit)
pick_fruits(["apple"])[0] = "orange"  # [unsupported-assignment-operation]

کد درست:

def pick_fruits(fruits):
    for fruit in fruits:
        print(fruit)
    return []
pick_fruits(["apple"])[0] = "orange"

ایجاد شده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.

پیام صادرشده:

%s

توضیحات:

زمانی صادر می‌شود که یک عملیات حسابی دودویی بین دو عملوند پشتیبانی نشود.

کد مشکل‌دار:

drink = "water" | None  # [unsupported-binary-operation]
result = [] | None  # [unsupported-binary-operation]

کد درست:

masked = 0b111111 & 0b001100
result = 0xAEFF | 0x0B99

فایل پیکربندی:

[main]
py-version=3.9

ایجاد شده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py..SS unsupported-delete-operation / E1138

پیام صادرشده:

%r does not support item deletion

توضیحات:

زمانی صادر می‌شود که یک شیء از حذف آیتم پشتیبانی نکند (یعنی متد __delitem__ را تعریف نکرده باشد).

کد دارای مشکل:

FRUITS = ("apple", "orange", "berry")
del FRUITS[0]  # [unsupported-delete-operation]

کد صحیح:

FRUITS = ["apple", "orange", "berry"]
del FRUITS[0]

ایجادشده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.

پیام صادرشده:

Value '%s' doesn't support membership test

توضیحات:

زمانی صادر می‌شود که یک نمونه در عبارت آزمون عضویت، پروتکل عضویت (__contains__/__iter__/__getitem__) را پیاده‌سازی نکرده باشد.

کد دارای مشکل:

class Fruit:
    pass
apple = "apple" in Fruit()  # [unsupported-membership-test]

کد صحیح:

class Fruit:
    FRUITS = ["apple", "orange"]
    def __contains__(self, name):
        return name in self.FRUITS
apple = "apple" in Fruit()

ایجادشده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py..SS used-before-assignment / E0601

پیام صادرشده:

استفاده از متغیر %r پیش از انتساب

توضیحات:

زمانی صادر می‌شود که به یک متغیر محلی پیش از انتساب آن دسترسی پیدا شود. هنگام ارزیابی بلوک‌های except/finally مرتبط، فرض می‌شود که انتساب‌های درون بلوک‌های try رخ نداده‌اند. همچنین هنگام ارزیابی دستورهای خارج از بلوک، فرض بر این است که انتساب‌های درون بلوک‌های except انجام نگرفته‌اند، مگر زمانی که بلوک try مرتبط شامل دستور return باشد.

کد دارای مشکل:

print(hello)  # [used-before-assignment]
hello = "Hello World !"

کد صحیح:

hello = "Hello World !"
print(hello)

ایجاد شده توسط بررسی‌کننده variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py.

پیام صادرشده:

نام %r پیش از اعلان global استفاده شده است

توضیحات:

زمانی صادر می‌شود که یک نام پیش از اعلان global استفاده شود، که از Python 3.6 به بعد منجر به خطا می‌شود.

کد دارای مشکل:

TOMATO = "black cherry"
def update_tomato():
    print(TOMATO)  # [used-prior-global-declaration]
    global TOMATO
    TOMATO = "cherry tomato"

کد صحیح:

TOMATO = "black cherry"
def update_tomato():
    global TOMATO
    TOMATO = "moneymaker"

ایجاد شده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py.

پیام صادرشده:

yield درون تابع async

توضیحات:

زمانی استفاده می‌شود که یک دستور `yield` یا `yield from` درون یک تابع async یافت شود.

کد دارای مشکل:

async def foo():
    yield from [1, 2, 3]  # [yield-inside-async-function]

کد صحیح:

async def foo():
    def _inner_foo():
        yield from [1, 2, 3]
async def foo():
    yield 42

جزئیات بیشتر:

این پیام هنگام استفاده از Python < 3.5 نمی‌تواند صادر شود.

پیوندهای مرتبط:

ایجاد شده توسط بررسی‌کننده async https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/async_checker.py..SS yield-outside-function / E0105

پیام صادرشده:

دستور yield خارج از تابع

توضیحات:

زمانی استفاده می‌شود که یک دستور "yield" خارج از یک تابع یا متد یافت شود.

کد دارای مشکل:

for i in range(10):
    yield i  # [yield-outside-function]

کد درست:

def one_to_ten():
    for i in range(10):
        yield i

ایجادشده توسط بررسی‌کنندهٔ basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py.

تمام پیام‌های تغییرنام‌یافته در دسته‌بندی خطا:

پیام 'bad-context-manager' تغییر نام یافته است. پیام جدید را می‌توان در این نشانی یافت:

پیام 'bad-exception-context' تغییر نام یافته است. پیام جدید را می‌توان در این نشانی یافت:

پیام 'bad-option-value' تغییر نام یافته است. پیام جدید را می‌توان در این نشانی یافت:

پیام صادرشده:

مقدار گزینهٔ بی‌استفاده برای '%s'، %s

توضیحات:

زمانی استفاده می‌شود که با مقداری برای گزینه‌ای که اکنون از pylint حذف شده است، برخورد شود.

کد دارای مشکل:

"""'bad-continuation' was removed from pylint in https://github.com/pylint-dev/pylint/pull/3571"""
# pylint: disable=bad-continuation  # [useless-option-value]

کد درست:

"""'bad-continuation' was removed from pylint in https://github.com/pylint-dev/pylint/pull/3571"""

جزئیات بیشتر:

اگر نمی‌خواهید پیکربندی خود را از پیام‌های قدیمی پاک‌سازی کنید، می‌توانید این بررسی را غیرفعال کنید.

ایجادشده توسط بررسی‌کنندهٔ main https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py..SS unknown-option-value / W0012

پیام صادرشده:

مقدار ناشناختهٔ گزینه برای '%s'، یک پیام معتبر pylint انتظار می‌رفت اما '%s' دریافت شد

توضیحات:

زمانی استفاده می‌شود که با یک مقدار ناشناخته برای یک گزینه مواجه شود.

کد دارای مشکل:

# pylint: disable=missnig-docstring  # [unknown-option-value]

کد صحیح:

# pylint: disable=missing-docstring

ایجادشده توسط وارسی‌کنندهٔ main https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py.

نام 'maybe-no-member' تغییر یافته است. پیام جدید را می‌توان در اینجا یافت:

نام 'old-non-iterator-returned-2' تغییر یافته است. پیام جدید را می‌توان در اینجا یافت:

نام 'old-unbalanced-tuple-unpacking' تغییر یافته است. پیام جدید را می‌توان در اینجا یافت:

پیام صادرشده:

احتمال بازگشایی ناتراز تاپل با دنبالهٔ %s: سمت چپ دارای %d برچسب%s، سمت راست دارای %d مقدار%s است

توضیحات:

زمانی استفاده می‌شود که یک بازگشایی ناتراز تاپل در انتساب وجود داشته باشد

کد دارای مشکل:

fruits = ("orange", "apple", "strawberry", "peer")
orange, apple, strawberry = fruits  # [unbalanced-tuple-unpacking]

کد صحیح:

fruits = ("orange", "apple", "strawberry", "peer")
orange, apple, *remaining_fruits = fruits

پیوندهای مرتبط:

•
PEP 3132 - Extended Iterable Unpacking https://peps.python.org/pep-3132

ایجادشده توسط وارسی‌کنندهٔ variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py..SS unhashable-dict-key / E1140

'unhashable-dict-key' تغییر نام یافته است. پیام جدید را می‌توان در اینجا یافت:

تمام پیام‌ها در دسته‌بندی هشدار:

پیام صادرشده:

متد %r در کلاس %r انتزاعی است اما در کلاس فرزند %r بازنویسی نشده است

توضیحات:

زمانی استفاده می‌شود که یک متد انتزاعی (یعنی raise NotImplementedError) در کلاس عینی (concrete) بازنویسی نشده باشد.

کد دارای مشکل:

abstract_method.py:

import abc
class WildAnimal:
    @abc.abstractmethod
    def make_sound(self):
        pass
class Panther(WildAnimal):  # [abstract-method]
    pass

function_raising_not_implemented_error.py:

class Pet:
    def make_sound(self):
        raise NotImplementedError
class Cat(Pet):  # [abstract-method]
    pass

کد صحیح:

abstract_method.py:

import abc
class WildAnimal:
    @abc.abstractmethod
    def make_sound(self):
        pass
class Panther(WildAnimal):
    def make_sound(self):
        print("MEEEOW")

function_raising_not_implemented_error.py:

class Pet:
    def make_sound(self):
        raise NotImplementedError
class Cat(Pet):
    def make_sound(self):
        print("Meeeow")

ایجادشده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py..SS anomalous-backslash-in-string / W1401

پیام صادرشده:

بک‌اسلش غیرعادی در رشته: '%s'. ممکن است ثابت رشته فاقد پیشوند r باشد.

توضیحات:

هنگامی استفاده می‌شود که یک بک‌اسلش در یک رشتهٔ لیترال وجود داشته باشد اما به عنوان یک نویسهٔ گریز عمل نکند.

کد دارای مشکل:

string = "\z"  # [syntax-error]

کد صحیح:

double_escape.py:

string = "\\z"

existing_escape_sequence.py:

string = "\t"

r_prefix.py:

string = r"\z"

جزئیات بیشتر:

\z همانند \\z است زیرا هیچ توالی گریزی برای z وجود ندارد. اما این موضوع برای خوانندهٔ کد مشخص نیست.

تنها دلیلی که نشان داده شده این مورد منجر به syntax-error می‌شود این است که CI مربوط به pylint اکنون بر روی Python 3.12 اجرا می‌شود، جایی که این حالت واقعاً یک SyntaxError صادر می‌کند. امیدواریم در آینده این ناهمخوانی را در مستندات برطرف کنیم.

پیوندهای مرتبط:

ایجاد شده توسط بررسی‌کنندهٔ string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py.

پیام صادرشده:

توالی گریز یونیکد غیرعادی در رشتهٔ بایتی: '%s'. ممکن است ثابت رشته فاقد پیشوند r یا u باشد.

توضیحات:

هنگامی استفاده می‌شود که یک گریز مانند u در یک رشتهٔ بایتی دیده شود در حالی که هیچ اثری در آن ندارد.

کد دارای مشکل:

print(b"\u%b" % b"0394")  # [syntax-error]

کد صحیح:

print(b"\\u%b" % b"0394")

ایجاد شده توسط بررسی‌کنندهٔ string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py..SS arguments-differ / W0221

پیام صادرشده:

%s %s %r method

توضیحات:

زمانی استفاده می‌شود که یک متد تعداد متفاوتی آرگومان نسبت به رابط پیاده‌سازی‌شده یا متد بازنویسی‌شده داشته باشد. آرگومان‌های اضافی دارای مقدار پیش‌فرض نادیده گرفته می‌شوند.

کد دارای مشکل:

class Drink:
    def mix(self, fluid_one, fluid_two):
        return fluid_one + fluid_two
class Cocktail(Drink):
    def mix(self, fluid_one, fluid_two, alcoholic_fluid):  # [arguments-differ]
        return fluid_one + fluid_two + alcoholic_fluid

کد صحیح:

add_option_in_base_class.py:

"""
Here we assume that drink and cocktail are the same thing and should actually
inherit from each over. We also assume that 'Drink' are 'Cocktail' without
alcohol (we added the alcohol option in the base class).
This permit to not have to modify the cocktails calls downstream but the case where
an alcohol is mixed in a soft drink will need to be handled.
"""
class Drink:
    def mix(self, fluid_one, fluid_two, alcoholic_fluid=None):
        # if alcoholic_fluid is not None:
        #     raise Exception(f"This soft drink has {alcoholic_fluid} in it !")
        return fluid_one + fluid_two
class Cocktail(Drink):
    def mix(self, fluid_one, fluid_two, alcoholic_fluid):
        return fluid_one + fluid_two + alcoholic_fluid

default_value.py:

"""
Here we assume that drink and cocktail are the same thing and should actually
inherit from each over. We also assume that any Cocktail can be treated like
a Drink (if you add beer to it).
This permit to not have to modify the calls downstream and causes the least
amount of disturbance at the cost of making cocktails beer-based implicitly.
"""
class Drink:
    def mix(self, fluid_one, fluid_two):
        return fluid_one + fluid_two
class Cocktail(Drink):
    def mix(self, fluid_one, fluid_two, alcoholic_fluid="Beer"):
        return fluid_one + fluid_two + alcoholic_fluid

no_inheritance.py:

"""
Here we assume that 'Drink' and 'Cocktail' are different things and should
not be treated together like if they were the same thing.
This will force some downstream changes and force the API user to make a
conscious decision about the alcoholic content of its drink when using the
API. For example, it's impossible to create a mojito with beer without
explicitly wanting to, or to add an alcohol to a soft-drink.
"""
class Drink:
    def mix(self, fluid_one, fluid_two):
        return fluid_one + fluid_two
class Cocktail:
    def mix(self, fluid_one, fluid_two, alcoholic_fluid):
        return fluid_one + fluid_two + alcoholic_fluid

جزئیات بیشتر:

argument-differ نشان‌دهنده مشکلی در رابطه با «اصل جایگزینی لیسکوف» (Liskov Substitution Principle) است. این بدان معناست که کد مورد نظر یک اصل مهم طراحی را نقض می‌کند که راه‌حل واحدی ندارد. توصیه می‌کنیم برای یافتن بهترین راه‌حل متناسب با مورد خود، در اینترنت جستجو کنید.

برای ارائه چند نمونه از راه‌حل‌های بالقوه:

  • افزودن آرگومان به کلاس والد
  • حذف کامل توارث
  • افزودن آرگومان‌های پیش‌فرض به کلاس فرزند

پیوندهای مرتبط:

•
اصل جایگزینی لیسکوف (Liskov Substitution Principle) https://en.wikipedia.org/wiki/Liskov_substitution_principle

ایجادشده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py..SS arguments-out-of-order / W1114

پیام صادرشده:

Positional arguments appear to be out of order

توضیحات:

زمانی صادر می‌شود که نام‌های آرگومان فراخواننده کاملاً با نام‌های پارامتر در امضای تابع مطابقت دارند اما ترتیبی یکسان ندارند.

کد دارای مشکل:

def function_3_args(first_argument, second_argument, third_argument):
    """Three arguments function"""
    return first_argument, second_argument, third_argument
def args_out_of_order():
    first_argument = 1
    second_argument = 2
    third_argument = 3
    function_3_args(  # [arguments-out-of-order]
        first_argument, third_argument, second_argument
    )

کد صحیح:

def function_3_args(first_argument, second_argument, third_argument):
    """Three arguments function"""
    return first_argument, second_argument, third_argument
def args_out_of_order():
    first_argument = 1
    second_argument = 2
    third_argument = 3
    function_3_args(first_argument, second_argument, third_argument)

ایجادشده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.

پیام صادرشده:

%s %s %r method

توضیحات:

زمانی استفاده می‌شود که یک پارامتر متد نامی متفاوت با رابط پیاده‌سازی‌شده یا متد بازنویسی‌شده داشته باشد.

کد دارای مشکل:

class Fruit:
    def brew(self, ingredient_name: str):
        print(f"Brewing a {type(self)} with {ingredient_name}")
class Apple(Fruit): ...
class Orange(Fruit):
    def brew(self, flavor: str):  # [arguments-renamed]
        print(f"Brewing an orange with {flavor}")
for fruit, ingredient_name in [[Orange(), "thyme"], [Apple(), "cinnamon"]]:
    fruit.brew(ingredient_name=ingredient_name)

کد صحیح:

class Fruit:
    def brew(self, ingredient_name: str):
        print(f"Brewing a {type(self)} with {ingredient_name}")
class Apple(Fruit): ...
class Orange(Fruit):
    def brew(self, ingredient_name: str):
        print(f"Brewing an orange with {ingredient_name}")
for fruit, ingredient_name in [[Orange(), "thyme"], [Apple(), "cinnamon"]]:
    fruit.brew(ingredient_name=ingredient_name)

ایجادشده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py..SS assert-on-string-literal / W0129

پیام صادرشده:

دستور assert یک لیترال رشته‌ای را به عنوان نخستین آرگومان خود دارد. این assert به‌صورت %s با شکست مواجه خواهد شد.

توضیحات:

هنگامی استفاده می‌شود که یک دستور assert یک لیترال رشته‌ای را به عنوان نخستین آرگومان خود داشته باشد، که باعث می‌شود assert همیشه برقرار باشد.

کد دارای اشکال:

def test_division():
    a = 9 / 3
    assert "No ZeroDivisionError were raised"  # [assert-on-string-literal]

کد درست:

def test_division():
    a = 9 / 3
    assert a == 3

جزئیات بیشتر:

اعمال مستقیم assert روی یک لیترال رشته‌ای همواره برقرار خواهد بود. راهکار این است که چیزی را بیازمایید که امکان شکست خوردن آن وجود داشته باشد، یا اصلاً از assert استفاده نکنید.

برای assertionهای unittest، پیام مشابه redundant-unittest-assert / W1503 <#redundant-unittest-assert> وجود دارد.

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کننده‌ی basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py.

پیام صادرشده:

دستور assert روی یک تاپل غیرخالی فراخوانی شده است. آیا منظورتان 'assert x,y' بود؟

توضیحات:

فراخوانی assert روی یک تاپل، در صورتی که تاپل خالی نباشد همواره به true ارزیابی می‌شود، و اگر خالی باشد همواره به false ارزیابی خواهد شد.

کد دارای اشکال:

assert (1, None)  # [assert-on-tuple]

کد درست:

x, y = (1, None)
assert x
assert y

جزئیات بیشتر:

اعمال مستقیم assert روی یک تاپل غیرخالی همواره برقرار خواهد بود. راهکار این است که
چیزی را بیازمایید که امکان شکست خوردن آن وجود داشته باشد، یا اصلاً از assert استفاده نکنید.

برای assertionهای unittest، پیام مشابه redundant-unittest-assert / W1503 <#redundant-unittest-assert> وجود دارد.

ایجادشده توسط بررسی‌کننده‌ی basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py..SS attribute-defined-outside-init / W0201

پیام صادرشده:

صفت %r خارج از __init__ تعریف شده است

توضیحات:

زمانی استفاده می‌شود که یک صفت نمونه خارج از متد __init__ تعریف شده باشد.

کد مشکل‌دار:

class Student:
    def register(self):
        self.is_registered = True  # [attribute-defined-outside-init]

کد صحیح:

class Student:
    def __init__(self):
        self.is_registered = False
    def register(self):
        self.is_registered = True

ایجادشده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

از تابع توکار %s استفاده شده است

توضیحات:

زمانی استفاده می‌شود که یک تابع توکار غیرمجاز به کار رفته باشد (گزینهٔ bad-function را ببینید). توابع غیرمجاز معمول مواردی همچون map یا filter هستند که پایتون امروزه جایگزین تمیزتری مانند list comprehension برای آن‌ها ارائه می‌دهد.

کد مشکل‌دار:

numbers = list(map(lambda x: 2 * x, [1, 2, 3]))  # [bad-builtin]
print(numbers)

کد صحیح:

numbers = [2 * x for x in [1, 2, 3]]
print(numbers)

فایل پیکربندی:

[MAIN]
load-plugins = pylint.extensions.bad_builtin

نکته:

این پیام توسط بررسی‌کنندهٔ اختیاری 'deprecated_builtins' <#pylint-extensions-bad-builtin> صادر می‌شود، که نیازمند بارگذاری افزونهٔ pylint.extensions.bad_builtin است.

ایجادشده توسط بررسی‌کنندهٔ deprecated_builtins https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/bad_builtin.py..SS bad-chained-comparison / W3601

پیام صادرشده:

مقایسه زنجیره‌ای مشکوک %s-بخشی با استفاده از عملگرهای ناسازگار از نظر معنایی (%s)

توضیحات:

زمانی استفاده می‌شود که یک مقایسه زنجیره‌ای وجود دارد که در آن یک عبارت، بخشی از دو مقایسه متعلق به گروه‌های معنایی متفاوت است ("<" معنای یکسانی با "is" ندارد، زنجیره‌سازی آن‌ها در "0 < x is None" احتمالاً یک اشتباه است).

کد مشکل‌دار:

parrot.py:

shop = {
    # animal: (specie, descriptions)
    "parrot": ("Norvegian blue", ("restin'", "remarkable", "beautiful plumage")),
}
if "parrot" in shop is "restin'":  # [bad-chained-comparison]
    print("Hellooooo, Pooolllllyyy ! WAAAAKEEY, WAKKEEEY !")

xor.py:

def xor_check(*, left=None, right=None):
    if left is None != right is None:  # [bad-chained-comparison]
        raise ValueError(
            "Either both left= and right= need to be provided or none should."
        )

کد صحیح:

parrot.py:

shop = {
    # animal: (specie, descriptions)
    "parrot": ("Norvegian blue", ("restin'", "remarkable", "beautiful plumage")),
}
if "parrot" in shop and "restin'" in shop["parrot"][1]:
    print("Hellooooo, Pooolllllyyy ! WAAAAKEEY, WAKKEEEY !")

xor.py:

def xor_check(*, left=None, right=None):
    if (left is None) != (right is None):
        raise ValueError(
            "Either both left= and right= need to be provided or none should."
        )

پیوندهای مرتبط:

•
زنجیره‌سازی مقایسه‌ها (Comparison Chaining) https://docs.python.org/3/reference/expressions.html#comparisons

ایجاد شده توسط بازبین bad-chained-comparison https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/bad_chained_comparison.py..SS bad-dunder-name / W3201

پیام صادرشده:

نام متد dunder نامعتبر است یا دارای غلط املایی است %s.

توضیحات:

زمانی استفاده می‌شود که یک متد dunder دارای غلط املایی باشد یا با نامی خارج از فهرست از پیش تعریف‌شدهٔ نام‌های dunder تعریف شده باشد.

کد دارای مشکل:

class Apples:
    def _init_(self):  # [bad-dunder-name]
        pass
    def __hello__(self):  # [bad-dunder-name]
        print("hello")

کد صحیح:

class Apples:
    def __init__(self):
        pass
    def hello(self):
        print("hello")

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.dunder

نکته:

این پیام توسط بررسی‌کنندهٔ اختیاری 'dunder' <#pylint-extensions-dunder> صادر می‌شود که مستلزم بارگذاری افزونهٔ pylint.extensions.dunder است.

ایجاد شده توسط بررسی‌کنندهٔ dunder https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/dunder.py.

پیام صادرشده:

رشتهٔ قالب‌بندی نامعتبر

توضیحات:

زمانی استفاده می‌شود که یک رشتهٔ قالب‌بندی PEP 3101 نامعتبر باشد.

کد دارای مشکل:

print("{a[0] + a[1]}".format(a=[0, 1]))  # [bad-format-string]

کد صحیح:

print("{a[0]} + {a[1]}".format(a=[0, 1]))

پیوندهای مرتبط:

ایجاد شده توسط بررسی‌کنندهٔ string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py..SS bad-format-string-key / W1300

پیام صادرشده:

کلید دیکشنری رشتهٔ قالب‌بندی باید یک رشته باشد، نه %s

توضیحات:

زمانی استفاده می‌شود که یک رشتهٔ قالب‌بندی با مشخص‌کننده‌های تبدیل نام‌گذاری‌شده، به همراه دیکشنری‌ای به کار رود که همهٔ کلیدهای آن رشته نیستند.

کد دارای مشکل:

print("%(one)d" % {"one": 1, 2: 2})  # [bad-format-string-key]

کد درست:

print("%(one)d, %(two)d" % {"one": 1, "two": 2})

جزئیات بیشتر:

این بررسی تنها برای قالب‌بندی رشته به سبک قدیمی با استفاده از عملگر '%' کار می‌کند.

این بررسی تنها در صورتی کار می‌کند که دیکشنری حاوی مقادیر برای قالب‌بندی به‌صورت درون‌خطی (inline) تعریف شده باشد. ارسال یک متغیر این بررسی را فعال نخواهد کرد، زیرا ممکن است از کلیدهای دیگر در این دیکشنری در زمینه‌های دیگری استفاده شده باشد، در حالی که یک دیکشنری تعریف‌شده به‌صورت درون‌خطی مشخصاً تنها برای نگه‌داشتن مقادیری در نظر گرفته شده است که باید قالب‌بندی شوند.

ایجادشده توسط بررسی‌کنندهٔ string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py.

پیام صادرشده:

دندانه‌گذاری نادرست. %s %s یافت شد، مورد انتظار %s

توضیحات:

زمانی استفاده می‌شود که تعداد غیرمنتظره‌ای از فاصله‌ها یا تب‌های دندانه‌گذاری یافت شود.

کد دارای مشکل:

if input():
   print('yes')  # [bad-indentation]

کد درست:

if input():
    print("yes")

جزئیات بیشتر:

از گزینهٔ --indent-string می‌توان برای تنظیم واحد دندانه‌گذاری برای این بررسی استفاده کرد.

ایجادشده توسط بررسی‌کنندهٔ format https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/format.py..SS bad-open-mode / W1501

پیام صادرشده:

"%s" حالت معتبری برای open نیست.

توضیحات:

پایتون از حالت‌های r، w، a[، x] همراه با گزینه‌های b، + و U (تنها با r) پشتیبانی می‌کند. صفحه https://docs.python.org/3/library/functions.html#open را ببینید.

کد دارای مشکل:

def open_and_get_content(file_path):
    with open(file_path, "rwx") as file:  # [bad-open-mode]
        return file.read()

کد درست:

def open_and_get_content(file_path):
    with open(file_path, "r") as file:
        return file.read()

ایجادشده توسط بررسی‌کننده stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py.

پیام صادرشده:

متد ایستا با %r به‌عنوان نخستین آرگومان

توضیحات:

زمانی استفاده می‌شود که یک متد ایستا دارای "self" یا مقداری مشخص‌شده در گزینه valid-classmethod-first-arg یا گزینه valid-metaclass-classmethod-first-arg به‌عنوان نخستین آرگومان باشد.

کد دارای مشکل:

class Wolf:
    @staticmethod
    def eat(self):  # [bad-staticmethod-argument]
        pass

کد درست:

class Wolf:
    @staticmethod
    def eat(sheep):
        pass

ایجادشده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

threading.Thread به تابع target نیاز دارد

توضیحات:

این هشدار زمانی صادر می‌شود که از کلاس threading.Thread بدون ارسال تابع target به‌صورت یک kwarg یا به‌عنوان آرگومان دوم نمونه‌سازی شود. به‌طور پیش‌فرض، پارامتر نخست پارامتر group است، نه پارامتر target.

کد دارای مشکل:

import threading
def thread_target(n):
    print(n**2)
thread = threading.Thread(lambda: None)  # [bad-thread-instantiation]
thread.start()

کد درست:

import threading
def thread_target(n):
    print(n**2)
thread = threading.Thread(target=thread_target, args=(10,))
thread.start()

ایجادشده توسط بررسی‌کننده stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py..SS bare-except / W0702

پیام صادرشده:

هیچ نوع استثنایی مشخص نشده است

توضیحات:

یک عبارت ``except:`` خالی، استثناهای ``SystemExit`` و ``KeyboardInterrupt`` را نیز می‌گیرد که این امر متوقف کردن برنامه با ``Control-C`` را دشوارتر ساخته و می‌تواند مشکلات دیگر را پنهان کند. اگر می‌خواهید تمام استثناهایی را بگیرید که نشان‌دهنده خطاهای برنامه هستند، از ``except Exception:`` استفاده کنید (عبارت except خالی معادل ``except BaseException:`` است).

کد دارای مشکل:

try:
    import platform_specific_module
except:  # [bare-except]
    platform_specific_module = None

کد درست:

try:
    import platform_specific_module
except ImportError:
    platform_specific_module = None

جزئیات بیشتر:

یک قاعده سرانگشتی خوب این است که استفاده از عبارت‌های ‘except’ خالی را به دو حالت محدود کنید: - اگر گرداننده استثنا، گزارش ردیابی (traceback) را چاپ یا ثبت (log) کند؛ حداقل کاربر متوجه خواهد شد که خطایی رخ داده است. - اگر کد نیاز به انجام عملیات پاک‌سازی داشته باشد، اما سپس با raise اجازه دهد استثنا به سمت بالا منتشر شود. بلوک try...finally می‌تواند روش بهتری برای مدیریت این حالت باشد.

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کننده exceptions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/exceptions.py.

پیام صادرشده:

استثنای موردنظر برای گرفتن، نتیجه یک عملیات باینری "%s" است

توضیحات:

زمانی استفاده می‌شود که استثنای موردنظر برای گرفتن به صورت "except A or B:" باشد. اگر قصد گرفتن چند استثنا را دارید، آن را به شکل "except (A, B):" بازنویسی کنید.

کد دارای مشکل:

try:
    1 / 0
except ZeroDivisionError or ValueError:  # [binary-op-exception]
    pass

کد درست:

try:
    1 / 0
except (ZeroDivisionError, ValueError):
    pass

ایجادشده توسط بررسی‌کننده exceptions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/exceptions.py..SS boolean-datetime / W1502

پیام صادرشده:

استفاده از datetime.time در بافت بولی (boolean).

توضیحات:

استفاده از datetime.time در یک بافت بولی می‌تواند باعث پنهان شدن باگ‌های ظریفی شود، به‌ویژه زمانی که زمان مشخص‌شده با نیمه‌شب UTC مطابقت دارد. این رفتار در Python 3.5 اصلاح شد. برای ارجاع، https://bugs.python.org/issue13936 را ببینید.

کد دارای مشکل:

import datetime
if datetime.time():  # [boolean-datetime]
    print("It is time.")
if datetime.datetime.now().time():  # [boolean-datetime]
    print("Now or never.")

کد صحیح:

import datetime
time_now_utc = datetime.datetime.now(tz=datetime.UTC).time()
if time_now_utc > datetime.time(6, 0):
    print("Daytime!")
if time_now_utc < datetime.time(6, 0):
    print("Nighttime!")

فایل پیکربندی:

[main]
py-version=3.4

پیوندهای مرتبط:

•
ردیاب باگ‌های Python https://bugs.python.org/issue13936

ایجاد شده توسط بررسی‌کننده stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py.

پیام صادرشده:

استفاده از 'break' درون بند 'finally' توصیه نمی‌شود

توضیحات:

زمانی صادر می‌شود که کلیدواژه `break` درون یک بند finally پیدا شود. این مورد از Python 3.14 به بعد یک SyntaxWarning ایجاد خواهد کرد.

کد دارای مشکل:

while True:
    try:
        pass
    finally:
        break  # [break-in-finally]

کد صحیح:

while True:
    try:
        pass
    except ValueError:
        pass
    else:
        break

پیوندهای مرتبط:

ایجاد شده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py..SS broad-exception-caught / W0718

پیام صادرشده:

گرفتن استثنای بیش از حد عمومی %s

توضیحات:

اگر از یک عبارت ساده‌ی ``except Exception:`` استفاده کنید، ممکن است در نهایت استثناهایی غیر از مواردی که انتظار دارید را بگیرید. این کار می‌تواند با پنهان کردن خطاهای نامرتبط، اشکال‌ها (باگ‌ها) را مخفی کرده و عیب‌یابی برنامه‌ها را دشوارتر کند.

کد دارای مشکل:

try:
    import platform_specific_module
except Exception:  # [broad-exception-caught]
    platform_specific_module = None

کد درست:

try:
    import platform_specific_module
except ImportError:
    platform_specific_module = None

جزئیات بیشتر:

برای نمونه، اگر در حال تلاش برای وارد کردن یک کتابخانه با وابستگی‌های سیستمی موردنیاز باشید و به‌جای خطاهای واردسازی تنها، همه‌چیز را بگیرید، پیام خطایی را که می‌گوید کد شما در صورت نصب وابستگی‌های سیستمی می‌توانست اجرا شود، از دست خواهید داد.

پیوندهای مرتبط:

•
آیا همیشه باید نوع استثنا را در عبارات 'except' مشخص کنم؟ https://stackoverflow.com/a/14797508/2519059

ایجادشده توسط ارزیاب exceptions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/exceptions.py.

پیام صادرشده:

پرتاب استثنای بیش از حد عمومی: %s

توضیحات:

پرتاب استثناهایی که بیش از حد کلی هستند شما را مجبور می‌کند که استثناها را نیز به‌صورت کلی بگیرید. این امر شما را وادار به استفاده از یک عبارت ساده‌ی ``except Exception:`` خواهد کرد. سپس ممکن است در نهایت استثناهایی به‌جز موارد مورد انتظار را بگیرید. این وضعیت می‌تواند خطاها را پنهان کرده و هنگام پنهان ماندن خطاهای غیرمرتبط، عیب‌یابی برنامه‌ها را سخت‌تر کند.

کد دارای مشکل:

def small_apple(apple, length):
    if len(apple) < length:
        raise Exception("Apple is too small!")  # [broad-exception-raised]
    print(f"{apple} is proper size.")

کد درست:

def small_apple(apple, length):
    if len(apple) < length:
        raise ValueError("Apple is too small!")
    print(f"{apple} is proper size.")

پیوندهای مرتبط:

•
توصیه‌های برنامه‌نویسی در PEP8 https://peps.python.org/pep-0008/#programming-recommendations

ایجادشده توسط ارزیاب exceptions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/exceptions.py..SS cell-var-from-loop / W0640

پیام صادرشده:

متغیر سلولی %s در حلقه تعریف شده است

توضیحات:

متغیری که در یک بستار (closure) به کار رفته، درون یک حلقه تعریف شده است. این امر باعث می‌شود که تمام بستارها از همان مقدار یکسان برای متغیر محصورشده (closed-over) استفاده کنند.

کد دارای مشکل:

def teacher_greeting(names):
    greetings = []
    for name in names:
        def greet():
            # do something
            print(f"Hello, {name}!")  # [cell-var-from-loop]
        if name.isalpha():
            greetings.append(greet)
    for greet in greetings:
        # the "name" variable is evaluated when the function is called here,
        # which is the last value it had in the loop - "Not-A-Name"
        greet()
teacher_greeting(["Graham", "John", "Terry", "Eric", "Terry", "Michael"])
# "Hello, Michael!"
# "Hello, Michael!"
# "Hello, Michael!"
# "Hello, Michael!"
# "Hello, Michael!"

کد صحیح:

functools.partial.py:

import functools
def teacher_greeting(names):
    greetings = []
    for name in names:
        if name.isalpha():
            # "name" is evaluated when the partial is created here, so this
            # does not do lazy evaluation
            greetings.append(functools.partial(print, f"Hello, {name}!"))
    for greet in greetings:
        # `partial`s are called like functions, but you've already passed the
        # arguments to them
        greet()
teacher_greeting(["Graham", "John", "Terry", "Eric", "Terry", "Michael"])
# "Hello, Graham!"
# "Hello, John!"
# "Hello, Eric!"
# "Hello, Terry!"
# "Hello, Michael!"

new_function.py:

def teacher_greeting(names):
    def greet(name):
        # do something
        print(f"Hello, {name}!")
    for name in names:
        if name.isalpha():
            # we're passing the value of "name" to the function here
            greet(name)
teacher_greeting(["Graham", "John", "Terry", "Eric", "Terry", "Michael"])
# "Hello, Graham!"
# "Hello, John!"
# "Hello, Eric!"
# "Hello, Terry!"
# "Hello, Michael!"

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کنندهٔ variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py..SS comparison-with-callable / W0143

پیام صادرشده:

مقایسه با یک callable، آیا پرانتزها را از قلم انداخته‌اید؟

توضیحات:

این پیام زمانی صادر می‌شود که pylint تشخیص دهد مقایسه‌ای با یک شیء قابل فراخوانی (callable) انجام شده است؛ امری که ممکن است نشان‌دهنده از قلم افتادن پرانتزها و در نتیجه بروز رفتار ناخواسته باشد.

کد دارای مشکل:

def function_returning_a_fruit() -> str:
    return "orange"
def is_an_orange(fruit: str = "apple"):
    # apple == <function function_returning_a_fruit at 0x7f343ff0a1f0>
    return fruit == function_returning_a_fruit  # [comparison-with-callable]

کد درست:

def function_returning_a_fruit() -> str:
    return "orange"
def is_an_orange(fruit: str = "apple"):
    # apple == orange
    return fruit == function_returning_a_fruit()

ایجاد شده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/comparison_checker.py.

پیام صادرشده:

آمدن یک مدیر زمینه (context manager) دیگر پس از "as" شبیه یک تاپل به نظر می‌رسد.

توضیحات:

زمانی صادر می‌شود که یکی از بخش‌های دستور `with` چندین مقدار بازگرداند و انتساب نام با `as` را تنها برای بخشی از آن مقادیر به کار ببرد، مانند with ctx() as a, b. این وضعیت می‌تواند گمراه‌کننده باشد، زیرا مشخص نیست که آیا مدیر زمینه یک تاپل برمی‌گرداند یا آن گره فاقد انتساب نام، خود یک مدیر زمینه دیگر است.

کد دارای مشکل:

with open("file.txt", "w") as fh1, fh2:  # [confusing-with-statement]
    pass

کد درست:

with open("file.txt", "w", encoding="utf8") as fh1:
    with open("file.txt", "w", encoding="utf8") as fh2:
        pass

ایجاد شده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py..SS consider-ternary-expression / W0160

پیام صادرشده:

بازنویسی به‌صورت یک عبارت سه‌تایی را مد نظر قرار دهید

توضیحات:

چندین دستور انتساب که در بلوک‌های if/else پخش شده‌اند را می‌توان با یک انتساب واحد و یک عبارت سه‌تایی (ternary expression) بازنویسی کرد

کد دارای مشکل:

x, y = input(), input()
if x >= y:  # [consider-ternary-expression]
    maximum = x
else:
    maximum = y

کد درست:

x, y = input(), input()
maximum = x if x >= y else y

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.consider_ternary_expression

نکته:

این پیام توسط بررسی‌کنندهٔ اختیاری 'consider_ternary_expression' <#pylint-extensions-consider-ternary-expression> صادر می‌شود، که نیازمند بارگذاری افزونهٔ pylint.extensions.consider_ternary_expression است.

ایجادشده توسط بررسی‌کنندهٔ consider_ternary_expression https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/consider_ternary_expression.py.

پیام صادرشده:

از زمینهٔ استفاده‌شده در تابع %r خارج نخواهد شد.

توضیحات:

هنگامی استفاده می‌شود که یک contextmanager درون یک تابع مولد (generator function) استفاده شده باشد و پاک‌سازی مدیریت نشده باشد.

کد دارای مشکل:

import contextlib
@contextlib.contextmanager
def cm():
    contextvar = "acquired context"
    print("cm enter")
    yield contextvar
    print("cm exit")
def genfunc_with_cm():
    with cm() as context:  # [contextmanager-generator-missing-cleanup]
        yield context * 2

کد درست:

import contextlib
@contextlib.contextmanager
def good_cm_except():
    contextvar = "acquired context"
    print("good cm enter")
    try:
        yield contextvar
    except GeneratorExit:
        print("good cm exit")
def genfunc_with_cm():
    with good_cm_except() as context:
        yield context * 2
def genfunc_with_discard():
    with good_cm_except():
        yield "discarded"
@contextlib.contextmanager
def good_cm_yield_none():
    print("good cm enter")
    yield
    print("good cm exit")
def genfunc_with_none_yield():
    with good_cm_yield_none() as var:
        print(var)
        yield "constant yield"
@contextlib.contextmanager
def good_cm_finally():
    contextvar = "acquired context"
    print("good cm enter")
    try:
        yield contextvar
    finally:
        print("good cm exit")
def good_cm_finally_genfunc():
    with good_cm_finally() as context:
        yield context * 2
@contextlib.contextmanager
def good_cm_no_cleanup():
    contextvar = "acquired context"
    print("cm enter")
    yield contextvar
def good_cm_no_cleanup_genfunc():
    with good_cm_no_cleanup() as context:
        yield context * 2

جزئیات بیشتر:

نمونه‌سازی و استفاده از یک contextmanager در داخل یک تابع مولد (generator function) در صورتی که این انتظار وجود داشته باشد که زمینه (context) فقط برای تابع مولد در دسترس باشد، می‌تواند به رفتارهای غیرمنتظره منجر شود. در صورتی که مولد بسته یا تخریب نشود، مدیر زمینه به همان صورت معلق باقی می‌ماند.

این پیام به‌جای تابع contextmanager به تابع مولد هشدار می‌دهد، زیرا روش‌های استفاده از یک contextmanager بسیار متنوع است. یک contextmanager می‌تواند به‌عنوان یک دکوراتور استفاده شود (که بلافاصله متدهای __enter__/__exit__ روی آن اعمال می‌شوند) و استفاده از as ... یا دور انداختن مقدار بازگشتی نیز بیانگر این است که آیا زمینه به پاک‌سازی نیاز دارد یا خیر. بنابراین برای این پیام، هشدار دادن به فراخوانندهٔ contextmanager اهمیت دارد.

این بررسی در صورتی که دستور yield درون یک بلوک if-else بدون پاک‌سازی سفارشی استفاده شود، می‌تواند موارد مثبت کاذب (false positive) ایجاد کند. برای این موارد از pylint: disable استفاده کنید.

from contextlib import contextmanager
@contextmanager
def good_cm_no_cleanup():
    contextvar = "acquired context"
    print("cm enter")
    if some_condition:
        yield contextvar
    else:
        yield contextvar
def good_cm_no_cleanup_genfunc():
    # pylint: disable-next=contextmanager-generator-missing-cleanup
    with good_cm_no_cleanup() as context:
        yield context * 2
پیوندهای مرتبط:

ایجاد شده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/function_checker.py.

پیام صادرشده:

استفاده از 'continue' در بند 'finally' توصیه نمی‌شود

توضیحات:

هنگامی صادر می‌شود که کلیدواژه `continue` درون یک بند finally یافت شود. این مورد از Python 3.14 به بعد، یک SyntaxWarning ایجاد خواهد کرد.

کد مشکل‌دار:

while True:
    try:
        pass
    finally:
        continue  # [continue-in-finally]

کد درست:

while True:
    try:
        pass
    except ValueError:
        pass
    else:
        continue

پیوندهای مرتبط:

ایجاد شده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py.

پیام صادرشده:

مقدار پیش‌فرض خطرناک %s به عنوان آرگومان

توضیحات:

زمانی استفاده می‌شود که یک مقدار تغییرپذیر مانند لیست یا دیکشنری در مقدار پیش‌فرض یک آرگومان شناسایی شود.

کد مشکل‌دار:

def whats_on_the_telly(penguin=[]):  # [dangerous-default-value]
    penguin.append("property of the zoo")
    return penguin

کد درست:

def whats_on_the_telly(penguin=None):
    if penguin is None:
        penguin = []
    penguin.append("property of the zoo")
    return penguin

جزئیات بیشتر:

با یک مقدار پیش‌فرض تغییرپذیر، با هر بار فراخوانی مقدار پیش‌فرض تغییر می‌یابد، یعنی:

whats_on_the_telly() # ["property of the zoo"]
whats_on_the_telly() # ["property of the zoo", "property of the zoo"]
whats_on_the_telly() # ["property of the zoo", "property of the zoo", "property of the zoo"]

ایجاد شده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py..SS deprecated-argument / W4903

پیام صادرشده:

استفاده از آرگومان منسوخ‌شده %s در متد %s()

توضیحات:

این آرگومان به‌عنوان منسوخ‌شده علامت‌گذاری شده است و در آینده حذف خواهد شد.

کد دارای مشکل:

int(x=1)  # [deprecated-argument]

کد درست:

int(1)

فایل پیکربندی:

جزئیات بیشتر:

جایگزین واقعی باید به‌صورت موردی و با مطالعهٔ هشدار منسوخ‌شدن یا یادداشت‌های انتشار بررسی شود.

ایجادشده توسط بررسی‌کنندهٔ stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py.

پیام صادرشده:

استفاده از صفت منسوخ‌شده %r

توضیحات:

این صفت به‌عنوان منسوخ‌شده علامت‌گذاری شده است و در آینده حذف خواهد شد.

کد دارای مشکل:

from configparser import ParsingError
err = ParsingError("filename")
source = err.filename  # [deprecated-attribute]

کد درست:

from configparser import ParsingError
err = ParsingError("filename")
source = err.source

جزئیات بیشتر:

جایگزین واقعی باید به‌صورت موردی و با مطالعهٔ هشدار منسوخ‌شدن یا یادداشت‌های انتشار بررسی شود.

ایجادشده توسط بررسی‌کنندهٔ stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py..SS deprecated-class / W4904

پیام صادرشده:

استفاده از کلاس منسوخ‌شدهٔ %s از ماژول %s

توضیحات:

این کلاس به عنوان منسوخ‌شده علامت‌گذاری شده است و در آینده حذف خواهد شد.

کد دارای مشکل:

from collections import Iterable  # [deprecated-class]

کد درست:

from collections.abc import Iterable

جزئیات بیشتر:

جایگزین مناسب باید به صورت موردی و با مطالعهٔ هشدار منسوخ‌شدن یا یادداشت‌های انتشار بررسی شود.

ایجاد شده توسط بررسی‌کنندهٔ stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py.

پیام صادرشده:

استفاده از دکوراتور منسوخ‌شدهٔ %s()

توضیحات:

این دکوراتور به عنوان منسوخ‌شده علامت‌گذاری شده است و در آینده حذف خواهد شد.

کد دارای مشکل:

import abc
class Animal:
    @abc.abstractclassmethod  # [deprecated-decorator]
    def breath(cls):
        pass

کد درست:

import abc
class Animal:
    @abc.classmethod
    @abc.abstractmethod
    def breath(cls):
        pass

فایل پیکربندی:

[main]
py-version = 3.3

جزئیات بیشتر:

جایگزین مناسب باید به صورت موردی و با مطالعهٔ هشدار منسوخ‌شدن یا یادداشت‌های انتشار بررسی شود.

ایجاد شده توسط بررسی‌کنندهٔ stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py..SS deprecated-method / W4902

پیام صادرشده:

استفاده از متد منسوخ‌شده %s()

توضیحات:

این متد به عنوان منسوخ‌شده علامت‌گذاری شده است و در آینده حذف خواهد شد.

کد دارای مشکل:

import logging
logging.warn("I'm coming, world !")  # [deprecated-method]

کد صحیح:

import logging
logging.warning("I'm coming, world !")

جزئیات تکمیلی:

جایگزین واقعی باید به‌صورت موردی و با خواندن هشدار منسوخ‌شدن یا یادداشت‌های انتشار بررسی شود.

ایجادشده توسط بررسی‌کننده stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py.

پیام صادرشده:

ماژول منسوخ‌شده %r

توضیحات:

ماژولی که به عنوان منسوخ‌شده علامت‌گذاری شده است، درون‌ریزی شده است.

کد دارای مشکل:

import distutils  # [deprecated-module]
import whatever_you_want  # [deprecated-module]

کد صحیح:

import setuptools
import whatever_replacement_you_want

فایل پیکربندی:

[main]
py-version=3.7
deprecated-modules=whatever_you_want

جزئیات تکمیلی:

جایگزین واقعی باید به‌صورت موردی و با خواندن هشدار منسوخ‌شدن یا یادداشت‌های انتشار بررسی شود.

ایجادشده توسط بررسی‌کننده imports https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/imports.py..SS deprecated-typing-alias / W6001

پیام صادرشده:

'%s' منسوخ شده است، به جای آن از '%s' استفاده کنید

توضیحات:

هنگامی صادر می‌شود که از یک نام مستعار منسوخ‌شده برای typing استفاده شود.

کد دارای مشکل:

import typing
item_to_number_of_item: typing.Dict[str, int]  # [deprecated-typing-alias]

کد درست:

item_to_number_of_item: dict[str, int]

فایل پیکربندی:

[main]
load-plugins = pylint.extensions.typing

نکته:

این پیام توسط بررسی‌کننده اختیاری 'typing' <#pylint-extensions-typing> صادر می‌شود که نیازمند بارگذاری افزونه pylint.extensions.typing است.

ایجادشده توسط بررسی‌کننده typing https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/typing.py.

پیام صادرشده:

مغایرت "%s" در مستندسازی پارامتر

توضیحات:

لطفاً نام‌های پارامتر را در اعلان‌ها بررسی کنید.

کد دارای مشکل:

def add(x, y):  # [differing-param-doc]
    """Add two numbers.
    :param int x: x value.
    :param int z: z value.
    """
    return x + y

کد درست:

def add(x, y):
    """Add two numbers.
    :param int x: x value.
    :param int y: y value.
    """
    return x + y

فایل پیکربندی:

[MAIN]
load-plugins = pylint.extensions.docparams

نکته:

این پیام توسط بررسی‌کننده اختیاری 'parameter_documentation' <#pylint-extensions-docparams> صادر می‌شود که نیازمند بارگذاری افزونه pylint.extensions.docparams است.

ایجادشده توسط بررسی‌کننده parameter_documentation https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py..SS differing-type-doc / W9018

پیام صادرشده:

تفاوت "%s" در مستندسازی نوع پارامتر

توضیحات:

لطفاً نام پارامترها را در اعلان‌های نوع بررسی کنید.

کد دارای مشکل:

def add(x: int, y: int):  # [differing-type-doc]
    """Add two numbers.
    :param int xy: x value.
    :param str y: y value.
    """
    return x + y

کد صحیح:

def add(x, y):
    """Add two numbers.
    :param int x: x value.
    :param int y: y value.
    """
    return x + y

فایل پیکربندی:

[MAIN]
load-plugins = pylint.extensions.docparams

نکته:

این پیام توسط بررسی‌کنندهٔ اختیاری 'parameter_documentation' <#pylint-extensions-docparams> صادر می‌شود که نیازمند بارگذاری افزونهٔ pylint.extensions.docparams است.

ایجادشده توسط بررسی‌کنندهٔ parameter_documentation https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py.

پیام صادرشده:

گرفتن نوع استثنای %s که پیش‌تر گرفته شده است

توضیحات:

هنگامی استفاده می‌شود که یک except نوعی را دریافت کند که پیش‌تر توسط یک گردانندهٔ قبلی گرفته شده است.

کد دارای مشکل:

try:
    1 / 0
except ZeroDivisionError:
    pass
except ZeroDivisionError:  # [duplicate-except]
    pass

کد صحیح:

try:
    1 / 0
except ZeroDivisionError:
    pass

ایجادشده توسط بررسی‌کنندهٔ exceptions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/exceptions.py..SS duplicate-key / W0109

پیام صادرشده:

کلید تکراری %r در دیکشنری

توضیحات:

هنگامی استفاده می‌شود که یک عبارت دیکشنری، یک کلید یکسان را چندین بار مقید کند.

کد مشکل‌دار:

test_score = {"Mathematics": 85, "Biology": 90, "Mathematics": 75}  # [duplicate-key]

کد درست:

test_score = {"Mathematics": 85, "Biology": 90, "History": 75}

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py.

پیام صادرشده:

آرگومان تکراری قالب‌بندی رشته %r، ارسال به عنوان آرگومان نام‌دار را مد نظر قرار دهید

توضیحات:

هنگامی استفاده می‌شود که تشخیص دهیم در یک قالب‌بندی رشته، به‌جای استفاده از آرگومان‌های نام‌دار رشته، یک آرگومان تکرار شده است

کد مشکل‌دار:

# pylint: disable=missing-docstring, consider-using-f-string
SEE = "see 👀"
SEA = "sea 🌊"
# +1: [duplicate-string-formatting-argument,duplicate-string-formatting-argument]
CONST = """
A sailor went to {}, {}, {}
To {} what he could {}, {}, {}
But all that he could {}, {}, {}
Was the bottom of the deep blue {}, {}, {}!
""".format(
    SEA,
    SEA,
    SEA,
    SEE,
    SEE,
    SEE,
    SEE,
    SEE,
    SEE,
    SEE,
    SEA,
    SEA,
    SEA,
)

کد درست:

# pylint: disable=missing-docstring, consider-using-f-string
SEE = "see 👀"
SEA = "sea 🌊"
CONST = """
A sailor went to {sea}, {sea}, {sea}
To {see} what he could {see}, {see}, {see}
But all that he could {see}, {see}, {see}
Was the bottom of the deep blue {sea}, {sea}, {sea}!
""".format(
    sea=SEA, see=SEE
)

ایجادشده توسط بررسی‌کننده string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py..SS duplicate-value / W0130

پیام صادرشده:

مقدار تکراری %r در مجموعه

توضیحات:

این پیام زمانی صادر می‌شود که یک مجموعه دارای مقداری یکسان، دو بار یا بیشتر باشد.

کد دارای مشکل:

incorrect_set = {"value1", 23, 5, "value1"}  # [duplicate-value]

کد صحیح:

correct_set = {"value1", 23, 5}

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py.

پیام صادرشده:

پیاده‌سازی __eq__ بدون پیاده‌سازی هم‌زمان __hash__

توضیحات:

زمانی استفاده می‌شود که یک کلاس __eq__ را پیاده‌سازی کند اما __hash__ را خیر. در صورتی که اشیاء __eq__ را پیاده‌سازی کنند، مقدار پیش‌فرض پیاده‌سازی __hash__ آن‌ها برابر با None قرار می‌گیرد.

کد دارای مشکل:

class Fruit:  # [eq-without-hash]
    def __init__(self) -> None:
        self.name = "apple"
    def __eq__(self, other: object) -> bool:
        return isinstance(other, Fruit) and other.name == self.name

کد صحیح:

class Fruit:
    def __init__(self) -> None:
        self.name = "apple"
    def __eq__(self, other: object) -> bool:
        return isinstance(other, Fruit) and other.name == self.name
    def __hash__(self) -> int:
        return hash(self.name)

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.eq_without_hash,

نکته:

این پیام توسط بررسی‌کننده اختیاری 'eq-without-hash' <#pylint-extensions-eq-without-hash> صادر می‌شود که مستلزم بارگذاری افزونهٔ pylint.extensions.eq_without_hash است.

ایجادشده توسط بررسی‌کننده eq-without-hash https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/eq_without_hash.py..SS eval-used / W0123

پیام صادرشده:

Use of eval

توضیحات:

هنگامی که از تابع "eval" استفاده می‌شود، برای جلوگیری از به‌کارگیری آن صادر می‌شود. برای ارزیابی امن رشته‌های حاوی عبارات پایتون از منابع غیرقابل‌اعتماد، استفاده از `ast.literal_eval` را مد نظر قرار دهید.

کد دارای مشکل:

eval("[1, 2, 3]")  # [eval-used]

کد صحیح:

from ast import literal_eval
literal_eval("[1, 2, 3]")

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py.

پیام صادرشده:

Use of exec

توضیحات:

هنگامی که دستور 'exec' به کار می‌رود صادر می‌شود. استفاده از این تابع برای ورودی‌های کاربر خطرناک است و به‌طور کلی نیز از کد واقعی کُندتر عمل می‌کند. این بدان معنا نیست که هرگز نباید از آن استفاده کنید، بلکه باید ابتدا راهکارهای جایگزین را بررسی کرده و توابع در دسترس را محدود نمایید.

کد دارای مشکل:

username = "Ada"
code_to_execute = f"""input('Enter code to be executed please, {username}: ')"""
program = exec(code_to_execute)  # [exec-used]
exec(program)  # [exec-used]

کد صحیح:

def get_user_code(name):
    return input(f"Enter code to be executed please, {name}: ")
username = "Ada"
# If the globals dictionary does not contain a value for the key __builtins__,
# all builtins are allowed. You need to be explicit about it being disallowed.
allowed_globals = {"__builtins__": {}}
allowed_locals = {}
# pylint: disable-next=exec-used
exec(get_user_code(username), allowed_globals, allowed_locals)

جزئیات بیشتر:

متدها و متغیرهای دردسترسِ استفاده‌شده در exec() ممکن است یک رخنهٔ امنیتی ایجاد کنند. می‌توانید با ارسال پارامترهای اختیاریِ globals و locals (دیکشنری‌ها) به متد exec()، استفاده از این متغیرها و متدها را محدود کنید.

با این حال، در صورتی که توابعی مانند __import__ یا open مجاز باشند، استفاده از exec() همچنان ناامن است. برای نمونه، فراخوانی زیر را در نظر بگیرید که فایلی را روی سیستم کاربر می‌نویسد و سپس کدی را اجرا می‌کند که توسط پارامترهای allowed_globals یا allowed_locals مهار نشده است:

import textwrap
def forbid_print(*args):
    raise ValueError("This is raised when a print is used")
allowed_globals = {
    "__builtins__": {
        "__import__": __builtins__.__import__,
        "open": __builtins__.open,
        "print": forbid_print,
    }
}
exec(
    textwrap.dedent(
        """
    import textwrap
    with open("nefarious.py", "w") as f:
        f.write(textwrap.dedent('''
            def connive():
                print("Here's some code as nefarious as imaginable")
        '''))
    import nefarious
    nefarious.connive()  # This will NOT raise a ValueError
    """
    ),
    allowed_globals,
)

در این حالت، import صرفاً برای خوانایی مثال به کار رفته است اما می‌تواند توابع خطرناکی را وارد کند:

  • subprocess.run('echo "print(\"Hello, World!\")" > nefarious.py'
  • pathlib.Path("nefarious.py").write_file("print(\"Hello, World!\")")
  • os.system('echo "print(\"Hello, World!\")" > nefarious.py')
  • logging.basicConfig(filename='nefarious.py'); logging.error('print("Hello, World!")')
  • و غیره.

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py..SS expression-not-assigned / W0106

پیام صادرشده:

عبارت "%s" به هیچ چیزی انتساب نیافته است

توضیحات:

زمانی استفاده می‌شود که عبارتی که فراخوانی تابع نیست، به هیچ چیزی تخصیص داده نشده باشد. احتمالاً منظور چیز دیگری بوده است.

کد دارای مشکل:

str(42) == "42"  # [expression-not-assigned]

کد درست:

are_equal: bool = str(42) == "42"

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py.

پیام صادرشده:

استفاده از یک f-string که فاقد هرگونه متغیر درون‌یابی‌شده است

توضیحات:

هنگامی استفاده می‌شود که یک f-string بدون هیچ متغیر درون‌یابی‌شده‌ای شناسایی شود، که در این صورت می‌تواند یک رشتهٔ عادی یا یک اشکال در کد باشد.

کد دارای مشکل:

x = 1
y = 2
print(f"x + y = x + y")  # [f-string-without-interpolation]

کد درست:

x = 1
y = 2
print(f"{x} + {y} = {x + y}")

ایجادشده توسط بررسی‌کننده string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py.

پیام صادرشده:

%s

توضیحات:

هنگامی استفاده می‌شود که یادداشت هشداری مانند FIXME یا XXX شناسایی شود.

کد دارای مشکل:

# TODO: We should fix this at some point  # [fixme]

کد درست:

bug_tracker.py:

# The issue was added to the bug tracker: no longer need the comment

fixed.py:

# The issue was fixed: no longer need the comment

no_fix.py:

# We no longer want to fix this: no longer need the comment

جزئیات بیشتر:

می‌توانید از عبارت‌های باقاعده و گزینهٔ notes-rgx برای ایجاد محدودیت‌هایی برای این پیام استفاده کنید. برای مشاهدهٔ چند مثال، موضوع https://github.com/pylint-dev/pylint/issues/2874 را ببینید.

ایجادشده توسط بررسی‌کننده miscellaneous https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/misc.py..SS forgotten-debug-statement / W1515

پیام صادرشده:

باقی گذاشتن توابعی که نقطه توقف ایجاد می‌کنند در کد عملیاتی توصیه نمی‌شود

توضیحات:

فراخوانی‌های breakpoint()، sys.breakpointhook() و pdb.set_trace() باید از کدی که فعالانه اشکال‌زدایی نمی‌شود حذف شوند.

کد دارای مشکل:

import pdb
def find_the_treasure(clues):
    for clue in clues:
        pdb.set_trace()  # [forgotten-debug-statement]
        if "treasure" in clue:
            return True
    return False
treasure_hunt = [
    "Dead Man's Chest",
    "X marks the spot",
    "The treasure is buried near the palm tree",
]
find_the_treasure(treasure_hunt)

کد صحیح:

def find_the_treasure(clues):
    for clue in clues:
        if "treasure" in clue:
            return True
    return False
treasure_hunt = [
    "Dead Man's Chest",
    "X marks the spot",
    "The treasure is buried near the palm tree",
]
find_the_treasure(treasure_hunt)

ایجاد شده توسط بررسی‌کننده stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py.

پیام صادرشده:

رشته قالب‌بندی شامل هر دو حالت شماره‌گذاری خودکار فیلدها و تعیین دستی فیلد است

توضیحات:

هنگامی استفاده می‌شود که یک رشته قالب‌بندی بر اساس PEP 3101 هم شامل شماره‌گذاری خودکار فیلد (مانند '{}') و هم تعیین دستی فیلد (مانند '{0}') باشد.

کد دارای مشکل:

print("{} {1}".format("hello", "world"))  # [format-combined-specification]

کد صحیح:

index_formatting.py:

print("{0} {1}".format("hello", "world"))

order_formatting.py:

print("{} {}".format("hello", "world"))

ایجاد شده توسط بررسی‌کننده string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py..SS format-string-without-interpolation / W1310

پیام صادرشده:

استفاده از قالب‌بندی برای رشته‌ای که فاقد هرگونه متغیر درون‌یابی‌شده است

توضیحات:

هنگامی استفاده می‌شود که رشته‌ای فاقد هرگونه متغیر درون‌یابی شناسایی شود؛ در این صورت می‌تواند یک رشته معمولی بدون قالب‌بندی یا یک باگ در کد باشد.

کد دارای ایراد:

print("number".format(1))  # [format-string-without-interpolation]

کد صحیح:

print("number: {}".format(1))

ایجادشده توسط بررسی‌کننده string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py.

پیام صادرشده:

استفاده از دستور global در سطح ماژول

توضیحات:

هنگامی استفاده می‌شود که از دستور "global" در سطح ماژول استفاده کنید، زیرا این کار هیچ تأثیری ندارد.

کد دارای ایراد:

price = 25
global price  # [global-at-module-level]

کد صحیح:

price = 25

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کننده variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py.

پیام صادرشده:

استفاده از دستور global

توضیحات:

هنگامی استفاده می‌شود که از دستور "global" برای به‌روزرسانی یک متغیر سراسری استفاده کنید. Pylint استفاده از آن را توصیه نمی‌کند. البته این بدان معنا نیست که نمی‌توانید از آن استفاده کنید!

کد دارای ایراد:

var = 1
def foo():
    global var  # [global-statement]
    var = 10
    print(var)
foo()
print(var)

کد صحیح:

var = 1
def foo():
    print(var)
    return 10
var = foo()
print(var)

ایجادشده توسط بررسی‌کننده variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py..SS global-variable-not-assigned / W0602

پیام صادرشده:

استفاده از global برای %r اما هیچ انتسابی انجام نشده است

توضیحات:

هنگامی که متغیری تعریف‌شده در دامنه سراسری در یک دامنه درونی تغییر داده می‌شود، کلمه کلیدی 'global' در دامنه درونی تنها در صورتی مورد نیاز است که عملیات انتساب در آن دامنه درونی انجام شده باشد.

کد مشکل‌دار:

TOMATO = "black cherry"
def update_tomato():
    global TOMATO  # [global-variable-not-assigned]
    print(TOMATO)

کد صحیح:

TOMATO = "black cherry"
def update_tomato():
    global TOMATO
    TOMATO = "moneymaker"

ایجادشده توسط بررسی‌کننده variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py.

پیام صادرشده:

متغیر سراسری %r در سطح ماژول تعریف نشده است

توضیحات:

زمانی استفاده می‌شود که متغیری از طریق دستور "global" تعریف شده باشد اما متغیر در دامنه ماژول تعریف نشده باشد.

کد مشکل‌دار:

def update_tomato():
    global TOMATO  # [global-variable-undefined]
    TOMATO = "moneymaker"

کد صحیح:

TOMATO = "black cherry"
def update_tomato():
    global TOMATO
    TOMATO = "moneymaker"

ایجادشده توسط بررسی‌کننده variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py..SS implicit-flag-alias / W0213

پیام صادرشده:

عضو پرچم %(overlap)s جایگاه‌های بیتی مشترکی با %(sources)s دارد

توضیحات:

زمانی استفاده می‌شود که چندین مقدار عدد صحیحِ تعریف‌شده درون یک کلاس enum.IntFlag دارای یک موقعیت بیتی مشترک باشند.

کد دارای مشکل:

from enum import IntFlag
class FilePermissions(IntFlag):
    READ = 1
    WRITE = 2
    EXECUTE = 3  # [implicit-flag-alias]

کد درست:

from enum import IntFlag
class FilePermissions(IntFlag):
    READ = 1
    WRITE = 2
    EXECUTE = 4

ایجادشده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

الحاق ضمنی رشته در %s یافت شد

توضیحات:

لیترال‌های رشته‌ای به‌طور ضمنی در تعریف لیترال یک پیمایش‌پذیر الحاق شده‌اند: شاید یک ویرگول جا افتاده است؟

کد دارای مشکل:

list.py:

x = ["a" "b"]  # [implicit-str-concat]

open.py:

with open("hello.txt" "r") as f:  # [implicit-str-concat]
    print(f.read())

کد درست:

list.py:

x = ["a", "b"]

open.py:

with open("hello.txt", "r") as f:
    print(f.read())

جزئیات بیشتر:

به‌طور پیش‌فرض، تشخیص الحاق ضمنی رشته در شکست خطوط غیرفعال است. بنابراین کد زیر این قاعده را فعال نخواهد کرد:

SEQ = ('a', 'b'
            'c')

به‌منظور تشخیص این حالت، باید check-str-concat-over-line-jumps را فعال کنید:

[STRING_CONSTANT]
check-str-concat-over-line-jumps = true

با این حال، ایراد این تنظیم این است که برای پارامترهای رشته‌ای که در چند سطر در فراخوانی توابع ارسال می‌شوند، مثبت کاذب ایجاد خواهد کرد:

warnings.warn(
    "rotate() is deprecated and will be removed in a future release. "
    "Use the rotation() context manager instead.",
    DeprecationWarning,
    stacklevel=3,
)

اگر الحاق مورد نظر را با پرانتز مشخص کنید، هیچ پیامی صادر نخواهد شد:

warnings.warn(
    (
        "rotate() is deprecated and will be removed in a future release. "
        "Use the rotation() context manager instead."
    ),
    DeprecationWarning,
    stacklevel=3,
)

ایجادشده توسط بررسی‌کنندهٔ string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py..SS import-self / W0406

پیام صادرشده:

ماژول خود را وارد (import) می‌کند

توضیحات:

زمانی استفاده می‌شود که یک ماژول خود را import می‌کند.

جزئیات بیشتر:

فرض کنید فایلی به نام my_file.py دارید. خطای import-self در کد زیر صادر خواهد شد:

from my_file import a_function  # [import-self]
def a_function():
    pass

راهکار این است که import حذف شود:

def a_function():
    pass

ایجادشده توسط بررسی‌کننده imports https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/imports.py.

پیام صادرشده:

جداکننده نقل‌قول %s با سایر بخش‌های فایل ناسازگار است

توضیحات:

جداکننده‌های نقل‌قول در سرتاسر یک ماژول به‌طور یکدست استفاده نشده‌اند (با در نظر گرفتن مواردی جهت جلوگیری از escape کردن‌های غیرضروری).

کد دارای اشکال:

import datetime
print('Current year: ', datetime.date.today().strftime("%Y")) # [inconsistent-quotes]

کد صحیح:

import datetime
print("Current year: ", datetime.date.today().strftime("%Y"))

فایل پیکربندی:

[main]
check-quote-consistency=yes

ایجادشده توسط بررسی‌کننده string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py..SS invalid-envvar-default / W1508

پیام صادرشده:

نوع پیش‌فرض %s برابر %s است. str یا None مورد انتظار بود.

توضیحات:

توابع دستکاری متغیرهای محیطی مقادیر None یا str را بازمی‌گردانند. ارسال هر مقداری به جز این‌ها به عنوان پیش‌فرض ممکن است باعث بروز باگ شود. ببینید: https://docs.python.org/3/library/os.html#os.getenv.

کد مشکل‌دار:

import os
env = os.getenv("SECRET_KEY", 1)  # [invalid-envvar-default]

کد صحیح:

import os
env = os.getenv("SECRET_KEY", "1")

ایجادشده توسط بررسی‌کننده stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py.

پیام صادرشده:

استفاده از کلید جستجوی نامعتبر %r در مشخص‌کننده قالب %r

توضیحات:

هنگامی استفاده می‌شود که یک رشته قالب‌بندی PEP 3101 از یک مشخص‌کننده جستجو ({a[1]}) استفاده کند، اما آرگومان ارسال‌شده برای قالب‌بندی فاقد آن کلید باشد یا آن کلید را به عنوان یک صفت نداشته باشد.

کد مشکل‌دار:

not_enough_fruits = ["apple"]
print('The second fruit is a {fruits[1]}'.format(fruits=not_enough_fruits))  # [invalid-format-index]

کد صحیح:

enough_fruits = ["apple", "banana"]
print("The second fruit is a {fruits[1]}".format(fruits=enough_fruits))

ایجادشده توسط بررسی‌کننده string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py.

پیام صادرشده:

انتظار می‌رفت متد %r به صورت %r باشد، اما در عوض %r یافت شد

توضیحات:

هنگامی استفاده می‌شود که تشخیص داده شود یک متد به شیوه‌ای بازنویسی شده است که با کلاس پایه خود همخوانی ندارد، که می‌تواند منجر به باگ‌های بالقوه در زمان اجرا شود.

کد مشکل‌دار:

class Fruit:
    async def bore(self, insect):
        insect.eat(self)
class Apple(Fruit):
    def bore(self, insect):  # [invalid-overridden-method]
        insect.eat(self)

کد صحیح:

class Fruit:
    async def bore(self, insect):
        insect.eat(self)
class Apple(Fruit):
    async def bore(self, insect):
        insect.eat(self)

ایجادشده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py..SS isinstance-second-argument-not-valid-type / W1116

پیام صادرشده:

آرگومان دوم isinstance یک نوع نیست

توضیحات:

هنگامی صادر می‌شود که آرگومان دوم یک فراخوانی isinstance یک نوع (type) نباشد.

کد دارای مشکل:

isinstance("apples and oranges", hex)  # [isinstance-second-argument-not-valid-type]

کد درست:

isinstance("apples and oranges", str)

ایجادشده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.

پیام صادرشده:

آرگومان کلیدواژه‌ای پیش از فهرست آرگومان‌های مکانی متغیر در تعریف تابع %s

توضیحات:

هنگام تعریف یک آرگومان کلیدواژه‌ای پیش از آرگومان‌های مکانی متغیر، در صورتی که تابع یا متد با آرگومان‌های کلیدواژه‌ای فراخوانی شود، ممکن است چندین مقدار برای پارامتر مذکور ارسال شود.

کد دارای مشکل:

def func(x=None, *args):  # [keyword-arg-before-vararg]
    return [x, *args]

کد درست:

def func(*args, x=None):
    return [*args, x]

ایجادشده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.

پیام صادرشده:

مقدار %r در %r گنجانده خواهد شد، زیرا پارامتری فقط-مکانی با همین نام از قبل وجود دارد

توضیحات:

هنگامی صادر می‌شود که تابعی با یک آرگومان کلیدواژه‌ای هم‌نام با یک پارامتر فقط-مکانی فراخوانی شود و تابع دارای یک دیکشنری از پارامترهای متغیر کلیدواژه‌ای باشد.

کد دارای مشکل:

def print_name(name="Sarah", /, **kwds):
    print(name)
print_name(name="Jacob")  # [kwarg-superseded-by-positional-arg]
# Will print "Sarah"

کد درست:

def print_name(name="Sarah", /, **kwds):
    print(name)
print_name("Jacob")
# Will print "Jacob"

ایجادشده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py..SS logging-format-interpolation / W1202

پیام صادرشده:

از قالب‌بندی %s در توابع logging استفاده کنید

توضیحات:

زمانی استفاده می‌شود که یک عبارت logging به شکل فراخوانی "logging.<logging method>(format_string.format(format_args...))" باشد. به‌جای آن از نوع دیگری از قالب‌بندی رشته استفاده کنید. می‌توانید از قالب‌بندی % استفاده کنید اما با ارسال پارامترها به‌عنوان آرگومان، درون‌یابی را به تابع logging واگذار نمایید. اگر logging-fstring-interpolation غیرفعال باشد، می‌توانید از قالب‌بندی fstring استفاده کنید. اگر logging-not-lazy غیرفعال باشد، می‌توانید طبق روال معمول از قالب‌بندی % استفاده کنید.

کد دارای مشکل:

import logging
import sys
# +1: [logging-format-interpolation]
logging.error("Python version: {}".format(sys.version))

کد درست:

import logging
import sys
logging.error("Python version: %s", sys.version)

جزئیات بیشتر:

یک گزینهٔ معقول دیگر استفاده از f-string است. اگر قصد انجام این کار را دارید، باید logging-format-interpolation را فعال و logging-fstring-interpolation را غیرفعال کنید.

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کنندهٔ logging https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/logging.py.

پیام صادرشده:

از قالب‌بندی %s در توابع logging استفاده کنید

توضیحات:

زمانی استفاده می‌شود که یک عبارت logging به شکل فراخوانی "logging.<logging method>(f"...")" باشد. به‌جای آن از نوع دیگری از قالب‌بندی رشته استفاده کنید. می‌توانید از قالب‌بندی % استفاده کنید اما با ارسال پارامترها به‌عنوان آرگومان، درون‌یابی را به تابع logging واگذار نمایید. اگر logging-format-interpolation غیرفعال باشد، می‌توانید از str.format استفاده کنید. اگر logging-not-lazy غیرفعال باشد، می‌توانید طبق روال معمول از قالب‌بندی % استفاده کنید.

کد دارای مشکل:

import logging
import sys
logging.error(f"Python version: {sys.version}")  # [logging-fstring-interpolation]

کد درست:

import logging
import sys
logging.error("Python version: %s", sys.version)

جزئیات بیشتر:

این پیام امکان مجاز دانستن f-string در logging را فراهم می‌کند در حالی که همچنان در صورت وقوع logging-format-interpolation هشدار می‌دهد.

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کنندهٔ logging https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/logging.py..SS logging-not-lazy / W1201

پیام صادرشده:

از قالب‌بندی %s در توابع logging استفاده کنید

توضیحات:

زمانی استفاده می‌شود که یک عبارت logging فراخوانی‌ای به شکل "logging.<logging method>(format_string % (format_args...))" داشته باشد. به‌جای آن از نوع دیگری از قالب‌بندی رشته استفاده کنید. می‌توانید از قالب‌بندی % استفاده کنید اما با ارسال پارامترها به‌عنوان آرگومان، درون‌یابی (interpolation) را به تابع logging بسپارید. اگر logging-fstring-interpolation غیرفعال باشد می‌توانید از قالب‌بندی fstring استفاده کنید. اگر logging-format-interpolation غیرفعال باشد می‌توانید از str.format استفاده کنید.

کد دارای اشکال:

import logging
try:
    function()
except Exception as e:
    logging.error("Error occurred: %s" % e)  # [logging-not-lazy]
    raise

کد درست:

import logging
try:
    function()
except Exception as e:
    logging.error("Error occurred: %s", e)
    raise

جزئیات بیشتر:

گزینهٔ معقول دیگر استفاده از f-string است. اگر قصد انجام این کار را دارید، باید logging-not-lazy را فعال و logging-fstring-interpolation را غیرفعال کنید.

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کنندهٔ logging https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/logging.py.

پیام صادرشده:

دستور %s در بلوک finally ممکن است استثنا را ببلعد

توضیحات:

زمانی استفاده می‌شود که یک دستور break یا return درون بند finally از یک بلوک try...finally یافت شود: استثناهای رخ‌داده در بند try به‌جای برانگیخته شدن مجدد (re-raised)، در سکوت بلعیده و نادیده گرفته خواهند شد.

کد دارای اشکال:

class FasterThanTheSpeedOfLightError(ZeroDivisionError):
    def __init__(self):
        super().__init__("You can't go faster than the speed of light !")
def calculate_speed(distance: float, time: float) -> float:
    try:
        return distance / time
    except ZeroDivisionError as e:
        raise FasterThanTheSpeedOfLightError() from e
    finally:
        return 299792458  # [lost-exception]

کد درست:

class FasterThanTheSpeedOfLightError(ZeroDivisionError):
    def __init__(self):
        super().__init__("You can't go faster than the speed of light !")
def calculate_speed(distance: float, time: float) -> float:
    try:
        return distance / time
    except ZeroDivisionError as e:
        raise FasterThanTheSpeedOfLightError() from e

ایجادشده توسط بررسی‌کنندهٔ basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py..SS method-cache-max-size-none / W1518

پیام صادرشده:

عبارت 'lru_cache(maxsize=None)' یا 'cache' تمام آرگومان‌های متد، از جمله 'self' را تا ابد زنده نگه می‌دارد

توضیحات:

با استفاده از دکوراتور lru_cache یا cache روی یک متد، آرگومان 'self' به تابع پیوند خورده و در نتیجه هرگز زباله‌روبی (garbage collected) نخواهد شد. مگر اینکه نمونه شیء شما هرگز نیازی به بازیافت حافظه نداشته باشد (تک‌نمونه یا singleton)، توصیه می‌شود کد را بازنویسی کرده تا از این الگو پرهیز شود یا یک maxsize به حافظه پنهان (cache) بیفزایید. مقدار پیش‌فرض برای maxsize برابر 128 است.

کد دارای مشکل:

import functools
class Fibonnaci:
    def __init__(self):
        self.result = []
    @functools.lru_cache(maxsize=None)  # [method-cache-max-size-none]
    def fibonacci(self, n):
        if n in {0, 1}:
            self.result.append(n)
        self.result.append(self.fibonacci(n - 1) + self.fibonacci(n - 2))

کد صحیح:

import functools
@functools.cache
def cached_fibonacci(n):
    if n in {0, 1}:
        return n
    return cached_fibonacci(n - 1) + cached_fibonacci(n - 2)
class Fibonnaci:
    def __init__(self):
        self.result = []
    def fibonacci(self, n):
        self.result.append(cached_fibonacci(n))

ایجاد شده توسط بررسی‌کننده stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py.

پیام صادرشده:

واردسازی __future__ نخستین عبارت غیر docstring نیست

توضیحات:

پایتون 2.5 و بالاتر نیازمند این است که واردسازی __future__ نخستین دستور غیر docstring در ماژول باشد.

کد دارای مشکل:

import sys
from __future__ import print_function  # [misplaced-future]

کد صحیح:

from __future__ import print_function
import sys

جزئیات بیشتر:

یک عبارت raise خالی آخرین استثنای فعال در حوزه (scope) جاری را مجدداً برمی‌انگیزد (re-raise). اگر دستور raise درون یک بلوک except یا finally نباشد، به‌جای آن یک RuntimeError صادر خواهد شد.

ایجاد شده توسط بررسی‌کننده imports https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/imports.py..SS missing-any-param-doc / W9021

پیام صادرشده:

نبود هرگونه مستندات در "%s"

توضیحات:

لطفاً مستندات پارامتر و/یا نوع را اضافه کنید.

کد دارای مشکل:

def puppies(head, tail):  # [missing-any-param-doc]
    """Print puppy's details."""
    print(head, tail)

کد درست:

def puppies(head: str, tail: str):
    """Print puppy's details.
    :param head: description of the head of the dog
    :param tail: description of the tail of the dog
    """
    print(head, tail)

فایل پیکربندی:

[main]
load-plugins = pylint.extensions.docparams
accept-no-param-doc = false

نکته:

این پیام توسط بررسی‌کننده اختیاری 'parameter_documentation' <#pylint-extensions-docparams> صادر می‌شود که نیازمند بارگذاری افزونه pylint.extensions.docparams است.

ایجادشده توسط بررسی‌کننده parameter_documentation https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py.

پیام صادرشده:

نبود آرگومان کلیدواژه‌ای %r برای رشته قالب‌بندی

توضیحات:

زمانی استفاده می‌شود که یک رشته قالب‌بندی PEP 3101 که از فیلدهای نام‌گذاری‌شده استفاده می‌کند، یک یا چند کلیدواژه لازم را دریافت نکند.

کد دارای مشکل:

print("My name is {first} {last}".format(first="John"))  # [missing-format-argument-key]

کد درست:

print("My name is {first} {last}".format(first="John", last="Wick"))

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کننده string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py..SS missing-format-attribute / W1306

پیام صادرشده:

ویژگی قالب‌بندی %r در مشخص‌کننده قالب %r وجود ندارد

توضیحات:

زمانی استفاده می‌شود که یک رشته قالب‌بندی PEP 3101 از یک مشخص‌کننده ویژگی ({0.length}) استفاده کند، اما آرگومان ارسال‌شده برای قالب‌بندی فاقد آن ویژگی باشد.

کد دارای مشکل:

print("{0.real}".format("1"))  # [missing-format-attribute]

کد صحیح:

print("{0.real}".format(1))

ایجادشده توسط بررسی‌کننده string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py.

پیام صادرشده:

"%s" در مستندات پارامتر وجود ندارد

توضیحات:

لطفاً اعلان پارامترها را برای همه پارامترها اضافه کنید.

کد دارای مشکل:

def integer_sum(a: int, b):  # [missing-param-doc]
    """Returns sum of two integers
    :param a: first integer
    """
    return a + b

کد صحیح:

def integer_sum(a: int, b: int):
    """Returns sum of two integers
    :param a: first integer
    :param b: second integer
    """
    return a + b

فایل پیکربندی:

[MAIN]
load-plugins = pylint.extensions.docparams

نکته:

این پیام توسط بررسی‌کننده اختیاری 'parameter_documentation' <#pylint-extensions-docparams> صادر می‌شود که نیازمند بارگذاری افزونه pylint.extensions.docparams است.

ایجادشده توسط بررسی‌کننده parameter_documentation https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py..SS missing-parentheses-for-call-in-test / W0126

پیام صادرشده:

استفاده از یک عبارت شرطی با فراخوانی احتمالاً اشتباه تابع یا متد به دلیل نبود پرانتز

توضیحات:

زمانی صادر می‌شود که به نظر برسد یک عبارت شرطی (If یا if سه‌تایی) به دلیل نبود پرانتز تابعی را به اشتباه فراخوانی می‌کند

کد دارای مشکل:

import random
def is_it_a_good_day():
    return random.choice([True, False])
if is_it_a_good_day:  # [missing-parentheses-for-call-in-test]
    print("Today is a good day!")

کد صحیح:

import random
def is_it_a_good_day():
    return random.choice([True, False])
if is_it_a_good_day():
    print("Today is a good day!")

ایجاد شده توسط بررسی‌کنندهٔ basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py.

پیام صادرشده:

"%s" به عنوان پرتاب‌شده مستند نشده است

توضیحات:

لطفاً استثناها را برای تمام انواع استثناهای پرتاب‌شده مستندسازی کنید.

کد دارای مشکل:

def integer_sum(a: int, b: int):  # [missing-raises-doc]
    """Returns sum of two integers
    :param a: first integer
    :param b: second integer
    """
    if not (isinstance(a, int) and isinstance(b, int)):
        raise ValueError("Function supports only integer parameters.")
    return a + b

کد صحیح:

def integer_sum(a: int, b: int):
    """Returns sum of two integers
    :param a: first integer
    :param b: second integer
    :raises ValueError: One of the parameters is not an integer.
    """
    if not (isinstance(a, int) and isinstance(b, int)):
        raise ValueError("Function supports only integer parameters.")
    return a + b

فایل پیکربندی:

[MAIN]
load-plugins = pylint.extensions.docparams
[BASIC]
accept-no-raise-doc = no

نکته:

این پیام توسط بررسی‌کنندهٔ اختیاری 'parameter_documentation' <#pylint-extensions-docparams> صادر می‌شود، که نیازمند بارگذاری افزونهٔ pylint.extensions.docparams است.

ایجاد شده توسط بررسی‌کنندهٔ parameter_documentation https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py..SS missing-return-doc / W9011

پیام صادرشده:

Missing return documentation (مستندات مقدار بازگشتی وجود ندارد)

توضیحات:

لطفاً مستنداتی دربارهٔ آنچه این متد بازمی‌گرداند اضافه کنید.

کد دارای مشکل:

def integer_sum(a: int, b: int):  # [missing-return-doc]
    """Returns sum of two integers
    :param a: first integer
    :param b: second integer
    """
    return a + b

کد درست:

def integer_sum(a: int, b: int) -> int:
    """Returns sum of two integers
    :param a: first integer
    :param b: second integer
    :return: sum of parameters a and b
    """
    return a + b

فایل پیکربندی:

[main]
load-plugins=pylint.extensions.docparams
[Parameter_documentation]
accept-no-return-doc=no

جزئیات بیشتر:

این پیام تنها زمانی صادر می‌شود که پارامتر accept-no-return-doc روی no تنظیم شده باشد.

نکته:

این پیام توسط بررسی‌کنندهٔ اختیاری 'parameter_documentation' <#pylint-extensions-docparams> صادر می‌شود که نیازمند بارگذاری افزونهٔ pylint.extensions.docparams است.

ایجادشده توسط بررسی‌کنندهٔ parameter_documentation https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py.

پیام صادرشده:

Missing return type documentation (مستندات نوع مقدار بازگشتی وجود ندارد)

توضیحات:

لطفاً نوع مقدار بازگشتی این متد را مستند کنید.

کد دارای مشکل:

def integer_sum(a: int, b: int):  # [missing-return-type-doc]
    """Returns sum of two integers
    :param a: first integer
    :param b: second integer
    :return: sum of parameters a and b
    """
    return a + b

کد درست:

def integer_sum(a: int, b: int) -> int:
    """Returns sum of two integers
    :param a: first integer
    :param b: second integer
    :return: sum of parameters a and b
    """
    return a + b

فایل پیکربندی:

[main]
load-plugins=pylint.extensions.docparams
[Parameter_documentation]
accept-no-return-doc=no

جزئیات بیشتر:

این پیام تنها زمانی صادر می‌شود که پارامتر accept-no-return-doc روی no تنظیم شده باشد.

نکته:

این پیام توسط بررسی‌کنندهٔ اختیاری 'parameter_documentation' <#pylint-extensions-docparams> صادر می‌شود که نیازمند بارگذاری افزونهٔ pylint.extensions.docparams است.

ایجادشده توسط بررسی‌کنندهٔ parameter_documentation https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py..SS missing-timeout / W3101

پیام صادرشده:

نبود آرگومان timeout برای متد '%s' می‌تواند باعث قفل شدن نامحدود برنامه شما شود

توضیحات:

زمانی استفاده می‌شود که یک متد برای جلوگیری از انتظار طولانی‌مدت به پارامتر 'timeout' نیاز دارد. اگر هیچ مهلت زمانی به‌طور صریح مشخص نشود، مقدار پیش‌فرض استفاده خواهد شد. به عنوان مثال برای 'requests'، برنامه هرگز با اتمام مهلت زمانی مواجه نمی‌شود (یعنی به‌طور نامحدود قفل می‌کند).

کد دارای مشکل:

import requests
requests.post("http://localhost")  # [missing-timeout]

کد صحیح:

import requests
requests.post("http://localhost", timeout=10)

جزئیات بیشتر:

می‌توانید متدهای جدیدی را که باید دارای یک آرگومان تعریف‌شدهٔ `timeout باشند، به‌صورت نام‌های واجد شرایط (qualified names) در گزینهٔ timeout-methods اضافه کنید؛ به عنوان مثال:

  • requests.api.get
  • requests.api.head
  • requests.api.options
  • requests.api.patch
  • requests.api.post
  • requests.api.put
  • requests.api.request

ایجاد شده توسط بازرس method_args https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/method_args.py.

پیام صادرشده:

"%s" در مستندات نوع پارامتر وجود ندارد

توضیحات:

لطفاً تعریف نوع پارامتر را برای همهٔ پارامترها اضافه کنید.

کد دارای مشکل:

def integer_sum(a: int, b):  # [missing-type-doc]
    """Returns sum of two integers
    :param a: first integer
    :param b: second integer
    """
    return a + b

کد صحیح:

def integer_sum(a: int, b: int):
    """Returns sum of two integers
    :param a: first integer
    :param b: second integer
    """
    return a + b

فایل پیکربندی:

[MAIN]
load-plugins = pylint.extensions.docparams

نکته:

این پیام توسط بازرس اختیاری 'parameter_documentation' <#pylint-extensions-docparams> صادر می‌شود که به بارگذاری افزونهٔ pylint.extensions.docparams نیاز دارد.

ایجاد شده توسط بازرس parameter_documentation https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py..SS missing-yield-doc / W9013

پیام صادرشده:

مستندات yield وجود ندارد

توضیحات:

لطفاً مستنداتی درباره آنچه این مولد (generator) با yield تولید می‌کند اضافه کنید.

کد دارای اشکال:

def even_number_under(n: int):  # [missing-yield-doc]
    """Prints even numbers smaller than n.
    Args:
        n: Upper limit of even numbers.
    """
    for i in range(n):
        if i % 2 == 1:
            continue
        yield i

کد اصلاح‌شده:

from typing import Iterator
def even_number_under(n: int) -> Iterator[int]:
    """Prints even numbers smaller than n.
    Args:
        n: Upper limit of even numbers.
    Yields:
        even numbers
    """
    for i in range(n):
        if i % 2 == 1:
            continue
        yield i

فایل پیکربندی:

[main]
load-plugins=pylint.extensions.docparams
[Parameter_documentation]
accept-no-yields-doc=no

جزئیات تکمیلی:

این پیام تنها زمانی ایجاد می‌شود که پارامتر accept-no-yields-doc روی no تنظیم شده باشد.

نکته:

این پیام توسط بررسی‌کننده اختیاری 'parameter_documentation' <#pylint-extensions-docparams> صادر می‌شود که مستلزم بارگذاری افزونه pylint.extensions.docparams است.

ایجاد شده توسط بررسی‌کننده parameter_documentation https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py..SS missing-yield-type-doc / W9014

پیام صادرشده:

مستندات نوع yield موجود نیست (Missing yield type documentation)

توضیحات:

لطفاً نوع بازگردانده‌شده توسط این متد با yield را مستندسازی کنید.

کد دارای مشکل:

def even_number_under(n: int):  # [missing-yield-type-doc]
    """Prints even numbers smaller than n.
    Args:
        n: Upper limit of even numbers.
    Yields:
        even numbers
    """
    for i in range(n):
        if i % 2 == 1:
            continue
        yield i

کد صحیح:

from typing import Iterator
def even_number_under(n: int) -> Iterator[int]:
    """Prints even numbers smaller than n.
    Args:
        n: Upper limit of even numbers.
    Yields:
        even numbers
    """
    for i in range(n):
        if i % 2 == 1:
            continue
        yield i

فایل پیکربندی:

[main]
load-plugins=pylint.extensions.docparams
[Parameter_documentation]
accept-no-yields-doc=no

جزئیات تکمیلی:

این پیام تنها زمانی صادر می‌شود که پارامتر accept-no-yields-doc بر روی no تنظیم شده باشد.

نکته:

این پیام توسط بررسی‌کننده اختیاری 'parameter_documentation' <#pylint-extensions-docparams> صادر می‌شود، که نیازمند بارگذاری افزونه pylint.extensions.docparams است.

ایجادشده توسط بررسی‌کننده parameter_documentation https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py..SS modified-iterating-list / W4701

پیام صادرشده:

لیست در حال پیمایش '%s' درون بدنه حلقه for در حال تغییر است، در عوض پیمایش روی یک کپی از آن را در نظر بگیرید.

توضیحات:

زمانی صادر می‌شود که مواردی به لیستی که در حال پیمایش است افزوده یا از آن حذف شوند. انجام این کار می‌تواند منجر به رفتاری غیرمنتظره شود، به همین دلیل ترجیح داده می‌شود که از یک کپی از لیست استفاده شود.

کد دارای مشکل:

fruits = ["apple", "orange", "mango"]
for fruit in fruits:
    fruits.append("pineapple")  # [modified-iterating-list]

کد درست:

fruits = ["apple", "orange", "mango"]
for fruit in fruits.copy():
    fruits.append("pineapple")

ایجادشده توسط بررسی‌کننده modified_iteration https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/modified_iterating_checker.py.

پیام صادرشده:

"%s" پارامترهای سازنده را در کلاس و __init__ مستند کرده است

توضیحات:

لطفاً اعلان‌های پارامتر را در کلاس یا سازنده حذف کنید.

کد دارای مشکل:

class Point:  # [multiple-constructor-doc]
    """Represents a point in the xy-coordinate plane.
    :param x: coordinate
    :param y: coordinate
    """
    def __init__(self, x, y):
        """Represents a point in the xy-coordinate plane.
        :param x: coordinate
        :param y: coordinate
        """
        self.x = x
        self.y = y

کد درست:

class Point:
    def __init__(self, x, y):
        """Represents a point in the xy-coordinate plane.
        :param x: x coordinate
        :param y: y coordinate
        """
        self.x = x
        self.y = y

فایل پیکربندی:

[main]
load-plugins=pylint.extensions.docparams
[Parameter_documentation]
no-docstring-rgx=^(?!__init__$)_

جزئیات بیشتر:

هر دو docstring قابل قبول هستند اما نه هر دو به‌طور هم‌زمان.

نکته:

این پیام توسط بررسی‌کننده اختیاری 'parameter_documentation' <#pylint-extensions-docparams> صادر می‌شود، که نیازمند بارگذاری افزونه pylint.extensions.docparams است.

ایجادشده توسط بررسی‌کننده parameter_documentation https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py..SS named-expr-without-context / W0131

پیام صادرشده:

عبارت نام‌گذاری‌شده بدون زمینه به کار رفته است

توضیحات:

زمانی صادر می‌شود که یک عبارت نام‌گذاری‌شده برای انجام انتساب عادی، بیرون از زمینه‌هایی مانند if، for، while یا یک comprehension به کار رود.

کد دارای اشکال:

(a := 42)  # [named-expr-without-context]

کد درست:

if a := 42:
    print("Success")

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py.

پیام صادرشده:

مقایسه %s باید %s باشد

توضیحات:

زمانی استفاده می‌شود که یک عبارت با مقادیر NaN مانند numpy.NaN و float('nan') مقایسه شود.

کد دارای اشکال:

import numpy as np
def both_nan(x, y) -> bool:
    return x == np.NaN and y == float("nan")  # [nan-comparison, nan-comparison]

کد درست:

import numpy as np
def both_nan(x, y) -> bool:
    return np.isnan(x) and np.isnan(y)

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/comparison_checker.py.

پیام صادرشده:

از فراخوانی تو در توی '%s' استفاده نکنید؛ امکان استفاده از '%s' به‌جای آن وجود دارد

توضیحات:

فراخوانی‌های تو در تو مانند ``min(1, min(2, 3))`` را می‌توان به‌صورت ``min(1, 2, 3)`` بازنویسی کرد.

کد دارای اشکال:

print(min(1, min(2, 3)))  # [nested-min-max]

کد درست:

print(min(1, 2, 3))

ایجادشده توسط بررسی‌کننده nested_min_max https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/nested_min_max.py..SS non-ascii-file-name / W2402

پیام صادرشده:

نام %s "%s" شامل یک نویسه غیر ASCII است.

توضیحات:

در نسخه‌های پیش از Python 3.5، استاندارد PEP 3131 شناسه‌های غیر ASCII را مجاز می‌دانست، اما نام‌های فایل غیر ASCII را خیر. از Python 3.5 به بعد، با وجود اینکه Python از فایل‌های UTF-8 پشتیبانی می‌کند، برخی از ویرایشگرها یا ابزارها از آن پشتیبانی نمی‌کنند.

کد دارای مشکل:

bàd.py:

# [non-ascii-file-name]

not_bétter.py:

# [non-ascii-file-name]

کد درست:

__init__.py:

bad.py:

not_better.py:

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کنندهٔ nonascii-checker https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/non_ascii_names.py.

پیام صادرشده:

متد __init__ از یک کلاس پایه غیرمستقیم %r فراخوانی شده است

توضیحات:

زمانی استفاده می‌شود که یک متد __init__ روی کلاسی فراخوانی شود که در میان نیاکان مستقیم کلاس تحلیل‌شده قرار ندارد.

کد دارای مشکل:

class Animal:
    def __init__(self):
        self.is_multicellular = True
class Vertebrate(Animal):
    def __init__(self):
        super().__init__()
        self.has_vertebrae = True
class Cat(Vertebrate):
    def __init__(self):
        Animal.__init__(self)  # [non-parent-init-called]
        self.is_adorable = True

کد درست:

class Animal:
    def __init__(self):
        self.is_multicellular = True
class Vertebrate(Animal):
    def __init__(self):
        super().__init__()
        self.has_vertebrae = True
class Cat(Vertebrate):
    def __init__(self):
        super().__init__()
        self.is_adorable = True

ایجادشده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py..SS non-str-assignment-to-dunder-name / W1115

پیام صادرشده:

مقدار غیررشته‌ای به __name__ انتساب داده شده است

توضیحات:

هنگامی صادر می‌شود که یک مقدار غیررشته‌ای به __name__ اختصاص یابد

کد دارای مشکل:

class Fruit:
    pass
Fruit.__name__ = 1  # [non-str-assignment-to-dunder-name]

کد درست:

class Fruit:
    pass
Fruit.__name__ = "FRUIT"

ایجادشده توسط بررسی‌کننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.

پیام صادرشده:

استثناهای دارای هم‌پوشانی (%s)

توضیحات:

زمانی استفاده می‌شود که استثناها در مدیریت‌کننده (handler) هم‌پوشانی داشته یا یکسان باشند

کد دارای مشکل:

def divide_x_by_y(x: float, y: float):
    try:
        print(x / y)
    except (ArithmeticError, FloatingPointError) as e:  # [overlapping-except]
        print(f"There was an issue: {e}")

کد درست:

less_generic_first.py:

def divide_x_by_y(x: float, y: float):
    try:
        print(x / y)
    except FloatingPointError as e:
        print(f"There was a FloatingPointError: {e}")
    except ArithmeticError as e:
        # FloatingPointError  were already caught at this point
        print(f"There was an OverflowError or a ZeroDivisionError: {e}")

only_generic.py:

def divide_x_by_y(x: float, y: float):
    try:
        print(x / y)
    except ArithmeticError as e:
        print(
            f"There was an OverflowError, a ZeroDivisionError or a FloatingPointError: {e}"
        )

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.overlapping_exceptions,

پیوندهای مرتبط:

•
سلسله‌مراتب استثناها https://docs.python.org/3/library/exceptions.html#exception-hierarchy

نکته:

این پیام توسط بررسی‌کننده اختیاری 'overlap-except' <#pylint-extensions-overlapping-exceptions> صادر می‌شود که نیازمند بارگذاری افزونه pylint.extensions.overlapping_exceptions است.

ایجادشده توسط بررسی‌کننده overlap-except https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/overlapping_exceptions.py..SS overridden-final-method / W0239

پیام صادرشده:

متد %r متدی را که با typing.final تزیین شده و در کلاس %r تعریف شده است، بازنویسی می‌کند

توضیحات:

زمانی استفاده می‌شود که یک متد تزیین‌شده با typing.final بازنویسی شده باشد.

کد دارای مشکل:

from typing import final
class Animal:
    @final
    def can_breathe(self):
        return True
class Cat(Animal):
    def can_breathe(self):  # [overridden-final-method]
        pass

کد درست:

from typing import final
class Animal:
    @final
    def can_breathe(self):
        return True
class Cat(Animal):
    def can_purr(self):
        return True

فایل پیکربندی:

[MAIN]
py-version=3.8

جزئیات تکمیلی:

این پیام هنگام استفاده از Python < 3.8 صادر نمی‌شود.

پیوندهای مرتبط:

ایجاد شده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

دستور استثنا هیچ اثری ندارد

توضیحات:

زمانی استفاده می‌شود که یک استثنا ایجاد شده باشد بدون آنکه انتساب یابد، صادر (raise) شود یا برای استفاده‌های بعدی در جای دیگری بازگردانده شود.

کد دارای مشکل:

Exception("This exception is a statement.")  # [pointless-exception-statement]

کد درست:

raise Exception("This will raise.")

ایجاد شده توسط بررسی‌کنندهٔ basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py..SS pointless-statement / W0104

پیام صادرشده:

به‌نظر می‌رسد دستور هیچ تأثیری ندارد

توضیحات:

زمانی استفاده می‌شود که یک دستور هیچ تأثیری نداشته باشد (یا دست‌کم این‌طور به‌نظر برسد).

کد دارای مشکل:

[1, 2, 3]  # [pointless-statement]

کد درست:

NUMBERS = [1, 2, 3]
print(NUMBERS)

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py.

پیام صادرشده:

دستور رشته‌ای هیچ تأثیری ندارد

توضیحات:

زمانی استفاده می‌شود که یک رشته به‌عنوان یک دستور استفاده شود (که البته هیچ تأثیری ندارد). این یک حالت خاص از W0104 با پیام مختص به خود است تا اگر از این رشته‌ها به‌جای کامنت‌ها برای مستندسازی استفاده می‌کنید، بتوانید به‌سادگی آن را غیرفعال کنید.

کد دارای مشکل:

"""This is a docstring which describes the module"""
"""This is not a docstring"""  # [pointless-string-statement]

کد درست:

"""This is a docstring which describes the module"""
# This is comment which describes a particular part of the module.

پیوندهای مرتبط:

•
رشته‌گفتگوی مربوط به docstringها روی انتساب‌ها https://discuss.python.org/t/docstrings-for-new-type-aliases-as-defined-in-pep-695/39816

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py.

پیام صادرشده:

احتمالاً متغیر %r استفاده نشده است

توضیحات:

زمانی استفاده می‌شود که یک متغیر تعریف شده باشد اما ممکن است استفاده نشود. این احتمال از این واقعیت ناشی می‌شود که ممکن است locals() استفاده شده باشد، که می‌تواند متغیر مذکور را مصرف کند یا نکند.

کد دارای مشکل:

def choose_fruits(fruits):
    print(fruits)
    color = "red"  # [possibly-unused-variable]
    return locals()

کد درست:

def choose_fruits(fruits):
    current_locals = locals()
    print(fruits)
    color = "red"
    print(color)
    return current_locals

ایجادشده توسط بررسی‌کننده variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py..SS preferred-module / W0407

پیام صادرشده:

وارد کردن %r به جای %r ترجیح داده می‌شود

توضیحات:

زمانی استفاده می‌شود که یک ماژول واردشده، ماژول جایگزین ترجیحی داشته باشد.

کد دارای اشکال:

import urllib  # [preferred-module]

کد صحیح:

import requests

فایل پیکربندی:

[IMPORTS]
preferred-modules=urllib:requests,

ایجادشده توسط بررسی‌کننده imports https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/imports.py.

پیام صادرشده:

دسترسی به عضو محافظت‌شده %s از یک کلاس کلاینت

توضیحات:

زمانی استفاده می‌شود که به یک عضو محافظت‌شده (یعنی عضوی از کلاس با نامی که با یک زیرخط آغاز می‌شود) در خارج از کلاس یا نوادگان کلاسی که در آن تعریف شده است، دسترسی پیدا شود.

کد دارای اشکال:

class Worm:
    def __swallow(self):
        pass
jim = Worm()
jim.__swallow()  # [protected-access]

کد صحیح:

class Worm:
    def __swallow(self):
        pass
    def eat(self):
        return self.__swallow()
jim = Worm()
jim.eat()

ایجادشده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py..SS raise-missing-from / W0707

پیام صادرشده:

طرح مجدد صریح با استفاده از %s'%s from %s' را مد نظر قرار دهید

توضیحات:

زنجیره‌سازی استثناها در پایتون، هم گزارش ردیابی (traceback) استثنای فعلی و هم استثنای اصلی را نشان می‌دهد. هنگامی که پس از گرفتن یک استثنا، استثنای جدیدی را raise می‌کنید، احتمال دارد استثنای دوم یک بسته‌بندی مجددِ کاربرپسند از استثنای نخست باشد. در چنین مواردی، `raise from` پیوند بهتری میان دو traceback در خطای نهایی ایجاد می‌کند.

کد دارای اشکال:

try:
    1 / 0
except ZeroDivisionError as e:
    raise ValueError("Rectangle Area cannot be zero")  # [raise-missing-from]

کد درست:

try:
    1 / 0
except ZeroDivisionError as e:
    raise ValueError("Rectangle Area cannot be zero") from e

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کننده exceptions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/exceptions.py.

پیام صادرشده:

آرگومان‌های استثنا نشان می‌دهند که احتمالاً قالب‌بندی رشته مد نظر بوده است

توضیحات:

هنگامی استفاده می‌شود که چندین آرگومان به سازندهٔ یک استثنا ارسال شود و اولین آرگومان، یک لیترال رشته‌ای حاوی مواردی باشد که به نظر می‌رسد جای‌نگه‌دارهایی برای قالب‌بندی باشند

کد دارای اشکال:

raise RuntimeError("This looks wrong %s %s", ("a", "b"))  # [raising-format-tuple]

کد درست:

raise RuntimeError("This looks wrong %s %s" % ("a", "b"))

ایجادشده توسط بررسی‌کننده exceptions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/exceptions.py.

پیام صادرشده:

اعلان مجدد متغیر %r در انتساب

توضیحات:

زمانی صادر می‌شود که تشخیص داده شود یک متغیر در همان انتساب دوباره اعلان شده است.

کد دارای اشکال:

FIRST, FIRST = (1, 2)  # [redeclared-assigned-name]

کد درست:

FIRST, SECOND = (1, 2)

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py..SS redefined-builtin / W0622

پیام صادرشده:

بازتعریف شناسهٔ توکار %r

توضیحات:

هنگامی استفاده می‌شود که یک متغیر یا تابع، یک شناسهٔ توکار را بازنویسی کند.

کد دارای مشکل:

def map():  # [redefined-builtin]
    pass

کد صحیح:

def map_iterable():
    pass

جزئیات بیشتر:

گزینهٔ allowed-redefined-builtins <#variables-options> به شما امکان می‌دهد نام‌هایی را مشخص کنید که مجاز به پوشاندن شناسه‌های توکار هستند.

با این حال، این گزینه برای بازتعریف‌ها در سطح ماژول یا متغیرهای سراسری مؤثر نیست. برای مثال:

بازتعریف‌ها در سطح ماژول:

# module_level_redefine.py
id = 1  # Shadows the built-in `id`

بازتعریف‌های متغیرهای سراسری:

# global_variable_redefine.py
def my_func():
    global len
    len = 1  # Shadows the built-in `len`

دلیل:

پوشاندن شناسه‌های توکار در حوزهٔ سراسری توصیه نمی‌شود، زیرا رفتار آن‌ها را در سراسر ماژول مبهم می‌سازد و خطر بروز باگ‌های ظریف را هنگامی که در جای دیگری از ماژول به آن شناسه نیاز باشد، افزایش می‌دهد. در مقابل، بازتعریف‌های محلی قابل‌قبول هستند چرا که تأثیر آن‌ها به یک حوزهٔ مشخص محدود می‌شود، عوارض جانبی ناخواسته را کاهش می‌دهد و اشکال‌زدایی را ساده‌تر می‌کند.

ایجادشده توسط بررسی‌کنندهٔ variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py.

پیام صادرشده:

بازتعریف %r از حلقه (خط %s)

توضیحات:

هنگامی استفاده می‌شود که متغیر حلقه در بدنهٔ حلقه بازنویسی شود.

کد دارای مشکل:

def normalize_names(names):
    for name in names:
        name = name.lower()  # [redefined-loop-name]

کد صحیح:

def normalize_names(names):
    for name in names:
        lowercased_name = name.lower()

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.redefined_loop_name,

نکته:

این پیام توسط بررسی‌کنندهٔ اختیاری 'redefined-loop-name' <#pylint-extensions-redefined-loop-name> صادر می‌شود که نیازمند بارگذاری افزونهٔ pylint.extensions.redefined_loop_name است.

ایجادشده توسط بررسی‌کنندهٔ redefined-loop-name https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/redefined_loop_name.py..SS redefined-outer-name / W0621

پیام صادرشده:

بازتعریف نام %r از دامنه بیرونی (خط %s)

توضیحات:

زمانی استفاده می‌شود که نام یک متغیر، نام تعریف‌شده در یک دامنه بیرونی یا گرداننده استثنا (except handler) را بپوشاند.

کد دارای مشکل:

count = 10
def count_it(count):  # [redefined-outer-name]
    for i in range(count):
        print(i)

کد درست:

count = 10
def count_it(limit):
    for i in range(limit):
        print(i)

جزئیات تکمیلی:

یک مشکل رایج این است که این پیام هنگام استفاده از فیکسچرهای pytest فعال می‌شود https://docs.pytest.org/en/7.1.x/how-to/fixtures.html:

import pytest
@pytest.fixture
def setup():
    ...
def test_something(setup):  # [redefined-outer-name]
    ...

یک راه‌حل برای این مشکل، نام‌گذاری صریح فیکسچر است:

@pytest.fixture(name="setup")
def setup_fixture():
    ...

به عنوان روش دیگر، می‌توان از افزونه‌های pylint مانند pylint-pytest https://pypi.org/project/pylint-pytest استفاده کرد.

ایجاد شده توسط بررسی‌کننده variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py.

پیام صادرشده:

بازتعریف اسلات‌های %r در زیرکلاس

توضیحات:

زمانی استفاده می‌شود که یک slot در یک زیرکلاس دوباره تعریف شود.

کد دارای مشکل:

class Base:
    __slots__ = ("a", "b")
class Subclass(Base):
    __slots__ = ("a", "d")  # [redefined-slots-in-subclass]

کد درست:

class Base:
    __slots__ = ("a", "b")
class Subclass(Base):
    __slots__ = ("d",)

ایجاد شده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py..SS redundant-returns-doc / W9008

پیام صادرشده:

مستندات بازگشت مازاد

توضیحات:

لطفاً مستندات return/rtype را از این متد حذف کنید.

کد دارای مشکل:

def print_fruits(fruits):  # [redundant-returns-doc]
    """Print list of fruits
    Returns
    -------
        str
    """
    print(fruits)
    return None

کد صحیح:

def print_fruits(fruits):
    """Print list of fruits
    Returns
    -------
        str
    """
    print(fruits)
    return ",".join(fruits)

فایل پیکربندی:

[MAIN]
load-plugins = pylint.extensions.docparams

نکته:

این پیام توسط بررسی‌کننده اختیاری 'parameter_documentation' <#pylint-extensions-docparams> صادر می‌شود که نیازمند بارگذاری افزونه pylint.extensions.docparams است.

ایجادشده توسط بررسی‌کننده parameter_documentation https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py.

پیام صادرشده:

پیشوند u برای رشته‌ها در Python >=3.0 دیگر ضروری نیست

توضیحات:

هنگامی استفاده می‌شود که رشته‌ای با پیشوند u شناسایی شود. این پیشوندها در Python 2 برای مشخص کردن اینکه یک رشته Unicode است لازم بودند، اما از Python 3.0 به بعد رشته‌ها به صورت پیش‌فرض Unicode هستند.

کد دارای مشکل:

def print_fruit():
    print(u"Apple")  # [redundant-u-string-prefix]

کد صحیح:

def print_fruit():
    print("Apple")

ایجادشده توسط بررسی‌کننده string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py..SS redundant-unittest-assert / W1503

پیام صادرشده:

استفادهٔ زائد از %s با مقدار ثابت %r

توضیحات:

نخستین آرگومان assertTrue و assertFalse یک شرط است. اگر یک مقدار ثابت به عنوان پارامتر ارسال شود، آن شرط همواره درست خواهد بود. در این حالت باید یک هشدار صادر شود.

کد مشکل‌دار:

import unittest
class DummyTestCase(unittest.TestCase):
    def test_dummy(self):
        self.assertTrue("foo")  # [redundant-unittest-assert]

کد صحیح:

import unittest
class DummyTestCase(unittest.TestCase):
    def test_dummy(self):
        actual = "test_result"
        self.assertEqual(actual, "expected")

جزئیات تکمیلی:

اعتبارسنجی مستقیم یک رشتهٔ لفظی (string literal) همواره با موفقیت همراه خواهد بود. راه‌حل این است که چیزی را که امکان شکست در آن وجود دارد آزمایش کنید، یا اصلاً هیچ اعتبارسنجی‌ای انجام ندهید.

برای اعتبارسنجی‌ها با استفاده از assert، پیام‌های مشابهی وجود دارند: assert-on-string-literal / W0129 <#assert-on-string-literal> و assert-on-tuple / W0199 <#assert-on-tuple>.

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کنندهٔ stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py.

پیام صادرشده:

مستندسازی زائد yields

توضیحات:

لطفاً مستندسازی yields را از این متد حذف کنید.

کد مشکل‌دار:

def give_fruits(fruits):  # [redundant-yields-doc]
    """Something about fruits
    Yields
    -------
        list
            fruits
    """
    return fruits

کد صحیح:

def give_fruits(fruits):
    """Something about fruits
    Yields
    -------
        str
            fruit
    """
    for fruit in fruits:
        yield fruit

فایل پیکربندی:

[MAIN]
load-plugins = pylint.extensions.docparams

نکته:

این پیام توسط بررسی‌کنندهٔ اختیاری 'parameter_documentation' <#pylint-extensions-docparams> صادر می‌شود که نیازمند بارگذاری افزونهٔ pylint.extensions.docparams است.

ایجادشده توسط بررسی‌کنندهٔ parameter_documentation https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py..SS reimported / W0404

پیام صادرشده:

وارد کردن مجدد %r (واردشده در خط %s)

توضیحات:

هنگامی استفاده می‌شود که یک ماژول بیش از یک بار وارد شده باشد.

کد دارای مشکل:

import re
import re  # [reimported]

کد درست:

import re

ایجادشده توسط بررسی‌کنندهٔ imports https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/imports.py.

پیام صادرشده:

'return' توسط بند 'finally' تحت‌الشعاع قرار گرفته است.

توضیحات:

هنگامی صادر می‌شود که یک دستور 'return' در یک بلوک 'finally' یافت شود. این کار مقدار بازگشتی تابع را رونویسی خواهد کرد و باید از آن خودداری شود.

کد دارای مشکل:

def second_favorite():
    fruits = ["kiwi", "pineapple"]
    try:
        return fruits[1]
    finally:
        # because of this `return` statement, this function will always return "kiwi"
        return fruits[0]  # [return-in-finally]

کد درست:

def second_favorite():
    fruits = ["kiwi", "pineapple"]
    try:
        return fruits[1]
    except KeyError:
        ...
    return fruits[0]

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کنندهٔ basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py..SS self-assigning-variable / W0127

پیام صادرشده:

انتساب متغیر یکسان %r به خودش

توضیحات:

زمانی صادر می‌شود که تشخیص داده شود یک متغیر به خودش منتسب شده است

کد دارای مشکل:

year = 2000
year = year  # [self-assigning-variable]

کد درست:

year = 2000

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py.

پیام صادرشده:

انتساب نامعتبر به %s در متد

توضیحات:

انتساب نامعتبر به self یا cls به ترتیب در متد نمونه یا متد کلاس.

کد دارای مشکل:

class Fruit:
    @classmethod
    def list_fruits(cls):
        cls = "apple"  # [self-cls-assignment]
    def print_color(self, *colors):
        self = "red"  # [self-cls-assignment]
        color = colors[1]
        print(color)

کد درست:

class Fruit:
    @classmethod
    def list_fruits(cls):
        fruit = "apple"
        print(fruit)
    def print_color(self, *colors):
        color = colors[1]
        print(color)

ایجادشده توسط بررسی‌کننده variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py..SS shadowed-import / W0416

پیام صادرشده:

پوشانده‌شدن %r (واردشده در خط %s)

توضیحات:

زمانی استفاده می‌شود که برای یک ماژول نام مستعاری تعیین شود که یک import دیگر را می‌پوشاند.

کد مشکل‌دار:

from pathlib import Path
import FastAPI.Path as Path  # [shadowed-import]

کد درست:

from pathlib import Path
import FastAPI.Path as FastApiPath

ایجادشده توسط بررسی‌کنندهٔ imports https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/imports.py.

پیام صادرشده:

استفاده از copy.copy(os.environ). به‌جای آن از os.environ.copy() استفاده کنید.

توضیحات:

متغیر os.environ یک شیء dict نیست بلکه یک شیء پروکسی است، بنابراین کپی سطحی (shallow copy) همچنان بر شیء اصلی اثر می‌گذارد. برای مرجع، https://bugs.python.org/issue15373 را ببینید.

کد مشکل‌دار:

import copy
import os
copied_env = copy.copy(os.environ)  # [shallow-copy-environ]

کد درست:

import os
copied_env = os.environ.copy()

ایجادشده توسط بررسی‌کنندهٔ stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py.

پیام صادرشده:

امضا با متد %s %r متفاوت است

توضیحات:

زمانی استفاده می‌شود که امضای یک متد با امضای موجود در رابط پیاده‌سازی‌شده یا متد بازنویسی‌شده متفاوت باشد.

کد مشکل‌دار:

class Animal:
    def run(self, distance=0):
        print(f"Ran {distance} km!")
class Dog(Animal):
    def run(self, distance):  # [signature-differs]
        super(Animal, self).run(distance)
        print("Fetched that stick, wuff !")

کد درست:

class Animal:
    def run(self, distance=0):
        print(f"Ran {distance} km!")
class Dog(Animal):
    def run(self, distance=0):
        super(Animal, self).run(distance)
        print("Fetched that stick, wuff !")

ایجادشده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py..SS subclassed-final-class / W0240

پیام صادرشده:

کلاس %r زیرکلاسی از یک کلاس تزیین‌شده با typing.final است: %r

توضیحات:

زمانی استفاده می‌شود که کلاسی با دکوراتور typing.final زیرکلاس‌بندی (ارث‌بری) شده باشد.

کد دارای مشکل:

from typing import final
@final
class PlatypusData:
    """General Platypus data."""
    average_length = 46
    average_body_temperature = 32
class FluorescentPlaytipus(PlatypusData):  # [subclassed-final-class]
    """Playtipus with fluorescent fur."""

کد صحیح:

from typing import final
@final
class PlatypusData:
    """General Platypus data."""
    average_length = 46
    average_body_temperature = 32
def print_average_length_platypus():
    output = f"The average length of a platypus is: {PlatypusData.average_length}cm"
    print(output)

فایل پیکربندی:

[MAIN]
py-version=3.8

جزئیات بیشتر:

این پیام زمانی صادر می‌شود که از کلاسی تزیین‌شده با final زیرکلاس ایجاد شود؛ این دکوراتور نشان می‌دهد که کلاس نباید ارث‌بری یا گسترش داده شود.

توجه داشته باشید که این پیام هنگام استفاده از Python < 3.8 صادر نمی‌شود.

پیوندهای مرتبط:

ایجاد شده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py..SS subprocess-popen-preexec-fn / W1509

پیام صادرشده:

استفاده از کلیدواژه preexec_fn که ممکن است در حضور threadها ناامن باشد

توضیحات:

استفاده از پارامتر preexec_fn در صورت وجود threadها در برنامه شما ایمن نیست. فرآیند فرزند (child process) ممکن است پیش از فراخوانی exec دچار بن‌بست (deadlock) شود. اگر مجبور به استفاده از آن هستید، آن را بسیار ساده نگه دارید! تعداد کتابخانه‌هایی را که فراخوانی می‌کنید به حداقل برسانید. ببینید: https://docs.python.org/3/library/subprocess.html#popen-constructor

کد دارای مشکل:

import subprocess
def foo():
    pass
subprocess.Popen(preexec_fn=foo)  # [subprocess-popen-preexec-fn]

کد درست:

import subprocess
subprocess.Popen()

ایجاد شده توسط بررسی‌کننده stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py.

پیام صادرشده:

استفاده از 'subprocess.run' بدون تعیین صریح مقدار برای 'check'.

توضیحات:

کلیدواژه ``check`` به‌طور پیش‌فرض روی False تنظیم شده است. این بدان معناست که فرآیند راه‌اندازی‌شده توسط ``subprocess.run`` می‌تواند با یک کد خروج غیرصفر خارج شده و بدون هشدار شکست بخورد. بهتر است آن را به‌طور صریح مقداردهی کنید تا رفتار مدیریت خطا کاملاً مشخص باشد.

کد دارای مشکل:

import subprocess
proc = subprocess.run(["ls"])  # [subprocess-run-check]

کد درست:

import subprocess
proc = subprocess.run(["ls"], check=False)

پیوندهای مرتبط:

ایجاد شده توسط بررسی‌کننده stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py..SS super-init-not-called / W0231

پیام صادرشده:

متد __init__ از کلاس پایه %r فراخوانی نشده است

توضیحات:

زمانی استفاده می‌شود که کلاس والد متد __init__ داشته باشد که توسط کلاس مشتق‌شده فراخوانی نشده است.

کد دارای مشکل:

class Fruit:
    def __init__(self, name="fruit"):
        self.name = name
        print("Creating a {self.name}")
class Apple(Fruit):
    def __init__(self):  # [super-init-not-called]
        print("Creating an apple")

کد صحیح:

class Fruit:
    def __init__(self, name="fruit"):
        self.name = name
        print("Creating a {self.name}")
class Apple(Fruit):
    def __init__(self):
        super().__init__("apple")

ایجادشده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

فراخوانی super بدون پرانتز

توضیحات:

زمانی استفاده می‌شود که فراخوانی super بدون پرانتز باشد و در نتیجه یک فراخوانی واقعی نبوده و آن‌طور که انتظار می‌رود عمل نکند.

کد دارای مشکل:

class Soup:
    @staticmethod
    def temp():
        print("Soup is hot!")
class TomatoSoup(Soup):
    @staticmethod
    def temp():
        super.temp()  # [super-without-brackets]
        print("But tomato soup is even hotter!")

کد صحیح:

class Soup:
    @staticmethod
    def temp():
        print("Soup is hot!")
class TomatoSoup(Soup):
    @staticmethod
    def temp():
        super().temp()
        print("But tomato soup is even hotter!")

ایجادشده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py..SS too-many-try-statements / W0717

پیام صادرشده:

%s

توضیحات:

بند try حاوی دستورهای بیش از حد است.

کد دارای مشکل:

FRUITS = {"apple": 1, "orange": 10}
def pick_fruit(name):
    try:  # [too-many-try-statements]
        count = FRUITS[name]
        count += 1
        print(f"Got fruit count {count}")
    except KeyError:
        return

کد درست:

FRUITS = {"apple": 1, "orange": 10}
def pick_fruit(name):
    try:
        count = FRUITS[name]
    except KeyError:
        return
    count += 1
    print(f"Got fruit count {count}")

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.broad_try_clause,

نکته:

این پیام توسط بررسی‌کننده اختیاری 'broad_try_clause' <#pylint-extensions-broad-try-clause> صادر می‌شود که نیازمند بارگذاری افزونه pylint.extensions.broad_try_clause است.

ایجادشده توسط بررسی‌کننده broad_try_clause https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/broad_try_clause.py.

پیام صادرشده:

گرداننده except بلافاصله raise می‌کند

توضیحات:

زمانی استفاده می‌شود که یک گرداننده except از raise به عنوان نخستین یا تنها عملگر خود استفاده کند. این کار بیهوده است زیرا بلافاصله استثنا را دوباره raise می‌کند. عملگر raise یا کل بلوک try-except-raise را حذف کنید!

کد دارای مشکل:

try:
    1 / 0
except ZeroDivisionError as e:  # [try-except-raise]
    raise

کد درست:

remove_try_except.py:

# The try except might be removed entirely:
1 / 0

specialized_exception.py:

# Another more detailed exception can be raised:
try:
    1 / 0
except ZeroDivisionError as e:
    raise ValueError("The area of the rectangle cannot be zero") from e

جزئیات بیشتر:

یک مورد کاربرد معتبر برای raise مجدد و فوری وجود دارد؛ به عنوان مثال در درخت وراثت زیر:

+-- ArithmeticError
     +-- FloatingPointError
     +-- OverflowError
     +-- ZeroDivisionError

کد زیر یک حالت معتبر برای raise مجدد و فوری استثنا را نشان می‌دهد:

def execute_calculation(a, b):
    try:
        return some_calculation(a, b)
    except ZeroDivisionError:
        raise
    except ArithmeticError:
        return float('nan')

ابزار pylint قادر به شناسایی این حالت است و خطایی ایجاد نمی‌کند.

ایجادشده توسط بررسی‌کننده exceptions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/exceptions.py..SS unbalanced-dict-unpacking / W0644

پیام صادرشده:

احتمال بازگشایی نامتوازن دیکشنری با %s: سمت چپ دارای %d برچسب%s و سمت راست دارای %d مقدار%s است

توضیحات:

هنگامی استفاده می‌شود که یک بازگشایی (unpacking) نامتوازن دیکشنری در انتساب یا حلقه for وجود داشته باشد.

کد دارای مشکل:

FRUITS = {"apple": 2, "orange": 3, "mellon": 10}
for fruit, price in FRUITS.values():  # [unbalanced-dict-unpacking]
    print(fruit)

کد صحیح:

FRUITS = {"apple": 2, "orange": 3, "mellon": 10}
for fruit, price in FRUITS.items():
    print(fruit)

ایجادشده توسط بررسی‌کننده variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py.

پیام صادرشده:

استفاده از متغیر حلقه احتمالاً تعریف‌نشده %r

توضیحات:

هنگامی استفاده می‌شود که یک متغیر حلقه (یعنی متغیری که توسط یک حلقه for، یک توصیف لیست (list comprehension) یا یک عبارت مولد (generator expression) تعریف شده است) در خارج از حلقه استفاده شود.

کد دارای مشکل:

def find_even_number(numbers):
    for x in numbers:
        if x % 2 == 0:
            break
    return x  # [undefined-loop-variable]

کد صحیح:

def find_even_number(numbers):
    for x in numbers:
        if x % 2:
            return x
    return None

ایجادشده توسط بررسی‌کننده variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py..SS unnecessary-ellipsis / W2301

پیام صادرشده:

ثابت ellipsis غیرضروری

توضیحات:

زمانی استفاده می‌شود که با ثابت ellipsis برخورد شود و بتوان از آن اجتناب کرد. یک خط کد متشکل از یک ellipsis در صورتی غیرضروری است که یک docstring در خط قبلی آن وجود داشته باشد یا دستوری در همان حوزه (scope) قرار گرفته باشد.

کد دارای مشکل:

def my_function():
    """My docstring"""
    ...  # [unnecessary-ellipsis]

کد درست:

def my_function():
    """My docstring"""

ایجادشده توسط بررسی‌کننده unnecessary_ellipsis https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/ellipsis_checker.py.

پیام صادرشده:

ممکن است lambda غیرضروری باشد

توضیحات:

زمانی استفاده می‌شود که بدنه یک عبارت lambda فراخوانی تابعی با همان فهرست آرگومان‌های خود lambda باشد؛ چنین عبارت‌های lambdaای تقریباً در تمام موارد، به‌جز مواردی معدود، با تابعی که درون بدنه lambda فراخوانی می‌شود قابل جایگزینی هستند.

کد دارای مشکل:

pandas.py:

df.apply(lambda x: str(x))  # [unnecessary-lambda]

print.py:

function = lambda x: print(x)  # [unnecessary-lambda]
function("Hello world !")

کد درست:

pandas.py:

df.apply(str)

print.py:

print("Hello world !")

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py..SS unnecessary-pass / W0107

پیام صادرشده:

دستور pass غیرضروری

توضیحات:

زمانی استفاده می‌شود که یک دستور "pass" را بتوان بدون تأثیر بر رفتار کد حذف کرد.

کد دارای مشکل:

class DataEntryError(Exception):
    """This exception is raised when a user has provided incorrect data."""
    pass  # [unnecessary-pass]

کد درست:

class DataEntryError(Exception):
    """This exception is raised when a user has provided incorrect data."""

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/pass_checker.py.

پیام صادرشده:

نقطه‌ویرگول غیرضروری

توضیحات:

زمانی استفاده می‌شود که انتهای یک عبارت با نقطه‌ویرگول (";") خاتمه یابد، در حالی که نیازی به آن نیست (اینجا پایتون است، نه C ;).

کد دارای مشکل:

print("Hello World!");  # [unnecessary-semicolon]

کد درست:

print("Hello World!")

ایجادشده توسط بررسی‌کننده format https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/format.py.

پیام صادرشده:

کد غیرقابل‌دسترس

توضیحات:

زمانی استفاده می‌شود که کدی پس از یک دستور "return" یا "raise" قرار گرفته باشد که هیچ‌گاه به آن دسترسی پیدا نخواهد شد.

کد دارای مشکل:

def say_hello():
    return True
    print("Hello World!, Outside function.")  # [unreachable]

کد درست:

def say_hello():
    print("Hello World!, Inside function.")
    return True

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py..SS unspecified-encoding / W1514

پیام صادرشده:

استفاده از open بدون مشخص‌کردن صریح کدگذاری

توضیحات:

بهتر است هنگام باز کردن اسناد، یک کدگذاری را مشخص کنید. استفادهٔ ضمنی از پیش‌فرض سیستم می‌تواند در سایر سیستم‌عامل‌ها مشکلاتی ایجاد کند. https://peps.python.org/pep-0597 را ببینید.

کد دارای مشکل:

def foo(file_path):
    with open(file_path) as file:  # [unspecified-encoding]
        contents = file.read()

کد درست:

def foo(file_path):
    with open(file_path, encoding="utf-8") as file:
        contents = file.read()

ایجادشده توسط بررسی‌کنندهٔ stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py.

پیام صادرشده:

آرگومان استفاده‌نشده %r

توضیحات:

زمانی استفاده می‌شود که یک آرگومان تابع یا متد به کار نرفته باشد.

کد دارای مشکل:

def print_point(x, y):  # [unused-argument]
    print(f"Point is located at {x},{x}")

کد درست:

def print_point(x, y):
    print(f"Point is located at {x},{y}")

ایجادشده توسط بررسی‌کنندهٔ variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py.

پیام صادرشده:

آرگومان قالب‌بندی استفاده‌نشده %r

توضیحات:

زمانی استفاده می‌شود که یک رشتهٔ قالب‌بندی PEP 3101 دارای فیلدهای نام‌گذاری‌شده، با آرگومانی به کار رود که توسط رشتهٔ قالب‌بندی مورد نیاز نیست.

کد دارای مشکل:

print("{x} {y}".format(x=1, y=2, z=3))  # [unused-format-string-argument]

کد درست:

add_format_target.py:

print("{x} {y} {z}".format(x=1, y=2, z=3))

remove_unused_args.py:

print("{x} {y}".format(x=1, y=2))

ایجادشده توسط بررسی‌کنندهٔ string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py..SS unused-format-string-key / W1301

پیام صادرشده:

کلید استفاده‌نشده %r در دیکشنری رشته قالب‌بندی

توضیحات:

زمانی استفاده می‌شود که یک رشته قالب‌بندی که از مشخص‌کننده‌های تبدیل نام‌دار استفاده می‌کند، با دیکشنری‌ای به کار رود که حاوی کلیدهایی است که توسط رشته قالب‌بندی مورد نیاز نیستند.

کد دارای اشکال:

"The quick %(color)s fox jumps over the lazy dog." % {
    "color": "brown",
    "action": "hops",
}
# -4: [unused-format-string-key]

کد صحیح:

"The quick %(color)s fox %(action)s over the lazy dog." % {
    "color": "brown",
    "action": "hops",
}

ایجادشده توسط بررسی‌کننده string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py.

پیام صادرشده:

%s استفاده‌نشده

توضیحات:

زمانی استفاده می‌شود که یک ماژول یا متغیر واردشده، مورد استفاده قرار نگرفته باشد.

کد دارای اشکال:

from logging import getLogger
from pathlib import Path  # [unused-import]
LOGGER = getLogger(__name__)

کد صحیح:

from logging import getLogger
LOGGER = getLogger(__name__)

جزئیات تکمیلی:

به‌طور پیش‌فرض، این بررسی برای فایل‌های __init__.py نادیده گرفته می‌شود، زیرا این فایل‌ها اغلب برای راحتی کاربران نهایی، حاوی واردکردن‌هایی (imports) از زیرماژول‌ها هستند. گرچه این واردکردن‌ها درون __init__.py استفاده نمی‌شوند، اما هدف آن‌ها فراهم کردن مسیرهای واردسازی سرراست برای کلاس‌ها و مقادیر ثابتِ مهم ماژول است.

پیوندهای مرتبط:

•
--init-import <#variables-options>

ایجادشده توسط بررسی‌کننده variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py..SS unused-private-member / W0238

پیام صادرشده:

عضو خصوصی استفاده‌نشده `%s.%s`

توضیحات:

زمانی صادر می‌شود که یک عضو خصوصی در یک کلاس تعریف شده اما استفاده نشده باشد.

کد دارای مشکل:

class Fruit:
    FRUITS = {"apple": "red", "orange": "orange"}
    def __print_color(self):  # [unused-private-member]
        pass

کد صحیح:

class Fruit:
    FRUITS = {"apple": "red", "orange": "orange"}
    def __print_color(self, name, color):
        print(f"{name}: {color}")
    def print(self):
        for fruit, color in self.FRUITS.items():
            self.__print_color(fruit, color)

ایجادشده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

متغیر استفاده‌نشده %r

توضیحات:

زمانی استفاده می‌شود که یک متغیر تعریف شده اما به کار نرفته باشد.

کد دارای مشکل:

def print_fruits():
    fruit1 = "orange"
    fruit2 = "apple"  # [unused-variable]
    print(fruit1)

کد صحیح:

def print_fruits():
    fruit1 = "orange"
    fruit2 = "apple"
    print(fruit1, fruit2)

ایجادشده توسط بررسی‌کنندهٔ variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py..SS unused-wildcard-import / W0614

پیام صادرشده:

واردسازی(های) استفاده‌نشدهٔ %s از واردسازی نویسه‌عام (wildcard) از %s

توضیحات:

هنگامی استفاده می‌شود که یک ماژول یا متغیر واردشده از طریق واردسازی با شیوهٔ `'from X import *'` مورد استفاده قرار نگرفته باشد.

کد مشکل‌دار:

from abc import *  # [unused-wildcard-import]
class Animal(ABC): ...

کد درست:

from abc import ABC
class Animal(ABC): ...

ایجاد شده توسط بررسی‌کنندهٔ variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py.

پیام صادرشده:

بند else در حلقهٔ بدون دستور break؛ بند else را حذف کرده و تورفتگی تمام کدهای درون آن را بردارید (de-indent)

توضیحات:

حلقه‌ها فقط در صورتی باید دارای بند else باشند که بتوان با یک دستور break زودتر از موعد از آن‌ها خارج شد، در غیر این صورت دستورات زیر else باید در همان حوزهٔ (scope) حلقه قرار گیرند.

کد مشکل‌دار:

def find_even_number(numbers):
    for x in numbers:
        if x % 2 == 0:
            return x
    else:  # [useless-else-on-loop]
        print("Did not find an even number")

کد درست:

def find_even_number(numbers):
    for x in numbers:
        if x % 2 == 0:
            return x
    print("Did not find an even number")

ایجاد شده توسط بررسی‌کنندهٔ basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py..SS useless-param-doc / W9019

پیام صادرشده:

مستندسازی بی‌استفاده پارامتر نادیده‌گرفته‌شده "%s"

توضیحات:

لطفاً مستندسازی پارامتر نادیده‌گرفته‌شده را حذف کنید.

کد دارای مشکل:

def say_hello(_new: str) -> str:  # [useless-param-doc]
    """say hello!
    :param _new:
    :return: comment
    """
    return "hello"

کد درست:

def say_hello(_new: str) -> str:
    """say hello!
    :return: comment
    """
    return "hello"

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.docparams,

نکته:

این پیام توسط بررسی‌کننده اختیاری 'parameter_documentation' <#pylint-extensions-docparams> صادر می‌شود، که نیازمند بارگذاری افزونه pylint.extensions.docparams است.

ایجاد شده توسط بررسی‌کننده parameter_documentation https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py.

پیام صادرشده:

تفویض بی‌استفاده به والد یا ()super در متد %r

توضیحات:

زمانی استفاده می‌شود که بتوان تشخیص داد یک متد بازنویسی‌شده بی‌استفاده است و با اتکا به تفویض به والد یا ()super، دقیقاً همان کار متد دیگری از MRO را انجام می‌دهد.

کد دارای مشکل:

class Animal:
    def eat(self, food):
        print(f"Eating {food}")
class Human(Animal):
    def eat(self, food):  # [useless-parent-delegation]
        super(Human, self).eat(food)

کد درست:

class Animal:
    def eat(self, food):
        print(f"Eating {food}")
class Human(Animal):
    """There is no need to override 'eat' it has the same signature as the implementation in Animal."""

پیوندهای مرتبط:

•
توضیحات Stackoverflow درباره 'useless-super-delegation' https://stackoverflow.com/a/51030674/2519059

ایجاد شده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py..SS useless-type-doc / W9020

پیام صادرشده:

مستندسازی بی‌فایدهٔ نوع پارامتر نادیده‌گرفته‌شدهٔ "%s"

توضیحات:

لطفاً مستندسازی نوع پارامتر نادیده‌گرفته‌شده را حذف کنید.

کد دارای مشکل:

def print_fruit(fruit, _):  # [useless-type-doc]
    """docstring ...
    Args:
        fruit (str): A fruit.
        _ (float): Another argument.
    """
    print(fruit)

کد صحیح:

def print_fruit(fruit):
    """docstring ...
    Args:
        fruit (str): A fruit.
    """
    print(fruit)

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.docparams,

نکته:

این پیام توسط بررسی‌کنندهٔ اختیاری 'parameter_documentation' <#pylint-extensions-docparams> صادر می‌شود که مستلزم بارگذاری افزونهٔ pylint.extensions.docparams است.

ایجادشده توسط بررسی‌کنندهٔ parameter_documentation https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py.

پیام صادرشده:

'%s()' ایجادشده به‌طور مستقیم در 'with' بی‌اثر است

توضیحات:

زمانی استفاده می‌شود که یک نمونهٔ قفل جدید با استفاده از دستور with ایجاد شود که هیچ اثری ندارد. در عوض، باید از یک نمونهٔ موجود برای گرفتن قفل استفاده شود.

کد دارای مشکل:

import threading
with threading.Lock():  # [useless-with-lock]
    print("Make your bed.")
with threading.Lock():  # [useless-with-lock]
    print("Sleep in it")

کد صحیح:

import threading
lock = threading.Lock()
with lock:
    print("Make your bed.")
with lock:
    print("Sleep in it.")

ایجادشده توسط بررسی‌کنندهٔ threading https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/threading_checker.py..SS using-assignment-expression-in-unsupported-version / W2605

پیام صادرشده:

Assignment expression is not supported by all versions included in the py-version setting

توضیحات:

زمانی استفاده می‌شود که py-version تنظیم‌شده توسط کاربر کمتر از 3.8 باشد و pylint با عملگر عبارت انتساب (walrus) مواجه شود.

کد دارای مشکل:

import random
# +1: [using-assignment-expression-in-unsupported-version]
if zero_or_one := random.randint(0, 1):
    assert zero_or_one == 1

کد صحیح:

import random
zero_or_one = random.randint(0, 1)
if zero_or_one:
    assert zero_or_one == 1

فایل پیکربندی:

[main]
py-version=3.7

جزئیات تکمیلی:

عملگر عبارت انتساب (walrus) (:=) در Python 3.8 معرفی شد؛ برای استفاده از آن، لطفاً از نسخه جدیدتری از Python استفاده کنید.

ایجادشده توسط بررسی‌کننده unsupported_version https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/unsupported_version.py.

پیام صادرشده:

Using a conditional statement with a constant value

توضیحات:

زمانی صادر می‌شود که یک دستور شرطی (If یا if سه‌گانه) از یک مقدار ثابت برای آزمون شرط خود استفاده کند. این ممکن است هدف مورد نظر کاربر نبوده باشد.

کد دارای مشکل:

if 0:  # [using-constant-test]
    print("This code is never executed.")
if 1:  # [using-constant-test]
    print("This code is always executed.")

کد صحیح:

print("This code is always executed.")

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py..SS using-exception-groups-in-unsupported-version / W2603

پیام صادرشده:

گروه‌های استثنا در تمام نسخه‌های مشخص‌شده در تنظیم py-version پشتیبانی نمی‌شوند

توضیحات:

زمانی استفاده می‌شود که py-version تنظیم‌شده توسط کاربر کمتر از 3.11 باشد و pylint با ``except*`` یا `ExceptionGroup`` مواجه شود.

کد مشکل‌دار:

def f():
    excs = [OSError("error 1"), SystemError("error 2")]
    # +1: [using-exception-groups-in-unsupported-version]
    raise ExceptionGroup("there were problems", excs)
try:  # [using-exception-groups-in-unsupported-version]
    f()
except* OSError as e:
    print("There were OSErrors")
except* SystemError as e:
    print("There were SystemErrors")

کد صحیح:

def f():
    raise OSError("error 1")
try:
    f()
except OSError as e:
    print("There were OSErrors")
except SystemError as e:
    print("There were SystemErrors")

فایل پیکربندی:

[main]
py-version=3.10

جزئیات بیشتر:

گروه‌های استثنا در Python 3.11 معرفی شدند؛ برای استفاده از آن‌ها، لطفاً از نسخه جدیدتری از Python استفاده کنید.

ایجادشده توسط بررسی‌کننده unsupported_version https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/unsupported_version.py.

پیام صادرشده:

F-stringها در تمام نسخه‌های مشخص‌شده در تنظیم py-version پشتیبانی نمی‌شوند

توضیحات:

زمانی استفاده می‌شود که py-version تنظیم‌شده توسط کاربر کمتر از 3.6 باشد و pylint با یک f-string مواجه شود.

کد مشکل‌دار:

f"python {3.5} is past end of life"  # [using-f-string-in-unsupported-version]

کد صحیح:

"python {} is past end of life".format(3.5)

فایل پیکربندی:

[main]
py-version=3.5

جزئیات بیشتر:

f-stringها در Python نسخه 3.6 معرفی شدند؛ برای استفاده از آن‌ها، لطفاً از نسخه جدیدتری از Python استفاده کنید.

ایجادشده توسط بررسی‌کننده unsupported_version https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/unsupported_version.py..SS using-final-decorator-in-unsupported-version / W2602

پیام صادرشده:

typing.final در تمامی نسخه‌های موجود در تنظیم py-version پشتیبانی نمی‌شود

توضیحات:

زمانی استفاده می‌شود که py-version تعیین‌شده توسط کاربر کمتر از 3.8 باشد و pylint با یک دکوراتور ``typing.final`` مواجه شود.

کد دارای مشکل:

from typing import final
@final  # [using-final-decorator-in-unsupported-version]
class Playtypus(Animal):
    @final  # [using-final-decorator-in-unsupported-version]
    def lay_egg(self): ...

کد درست:

class Playtypus(Animal):
    def lay_egg(self): ...

فایل پیکربندی:

[main]
py-version=3.7

جزئیات بیشتر:

این پیام زمانی صادر می‌شود که دکوراتور final با نسخه‌ای از Python کمتر از 3.8 به کار رود. دکوراتور final در نسخه 3.8 از Python معرفی شد.

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کنندهٔ unsupported_version https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/unsupported_version.py.

پیام صادرشده:

نحو نوع جنریک (PEP 695) در تمامی نسخه‌های موجود در تنظیم py-version پشتیبانی نمی‌شود

توضیحات:

زمانی استفاده می‌شود که py-version تعیین‌شده توسط کاربر کمتر از 3.12 باشد و pylint با نحو نوع جنریک مواجه شود.

کد دارای مشکل:

type Vector = list[float]  # [using-generic-type-syntax-in-unsupported-version]

کد درست:

from typing import TypeAlias
Vector: TypeAlias = list[float]

فایل پیکربندی:

[main]
py-version=3.11

جزئیات بیشتر:

نحو نوع جنریک در Python 3.12 معرفی شد؛ برای استفاده از آن، لطفاً از نسخهٔ جدیدتری از Python استفاده کنید.

ایجادشده توسط بررسی‌کنندهٔ unsupported_version https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/unsupported_version.py..SS using-positional-only-args-in-unsupported-version / W2606

پیام صادرشده:

آرگومان‌های صرفاً موضعی (positional-only) در تمام نسخه‌های موجود در تنظیم py-version پشتیبانی نمی‌شوند

توضیحات:

زمانی استفاده می‌شود که py-version تنظیم‌شده توسط کاربر کمتر از 3.8 باشد و pylint با آرگومان‌های صرفاً موضعی مواجه شود.

کد دارای مشکل:

def add(x, y, /):  # [using-positional-only-args-in-unsupported-version]
    return x + y

کد صحیح:

# pylint: disable=missing-function-docstring, missing-module-docstring
def add(x, y):
    return x + y

فایل پیکربندی:

[main]
py-version=3.7

جزئیات بیشتر:

آرگومان‌های صرفاً موضعی در Python 3.8 معرفی شدند؛ برای استفاده از آن‌ها، لطفاً از نسخه جدیدتری از Python استفاده کنید.

ایجادشده توسط بررسی‌کننده unsupported_version https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/unsupported_version.py.

پیام صادرشده:

حلقه `while` استفاده شده است

توضیحات:

حلقه‌های نامحدود `while` اغلب می‌توانند به صورت حلقه‌های محدود `for` بازنویسی شوند. مواردی مانند حلقه‌های رویداد (event loops)، شنونده‌ها (listeners) و غیره می‌توانند استثنا باشند.

کد دارای مشکل:

import requests
def fetch_data():
    i = 1
    while i < 6:  # [while-used]
        print(f"Attempt {i}...")
        try:
            return requests.get("https://example.com/data")
        except requests.exceptions.RequestException:
            pass
        i += 1

کد صحیح:

import requests
def fetch_data():
    for i in range(1, 6):
        print(f"Attempt {i}...")
        try:
            return requests.get("https://example.com/data")
        except requests.exceptions.RequestException:
            pass

فایل پیکربندی:

[main]
load-plugins=pylint.extensions.while_used

پیوندهای مرتبط:

نکته:

این پیام توسط بررسی‌کننده اختیاری 'while_used' <#pylint-extensions-while-used> صادر می‌شود، که نیازمند بارگذاری افزونه pylint.extensions.while_used است.

ایجادشده توسط بررسی‌کننده while_used https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/while_used.py..SS wildcard-import / W0401

پیام صادرشده:

Wildcard import %s

توضیحات:

هنگامی استفاده می‌شود که `from module import *` شناسایی شود.

کد دارای مشکل:

from abc import *  # [wildcard-import]

کد درست:

# Either import module or
# only import required objects from module.
import abc
from abc import ABC, abstractmethod

ایجادشده توسط بررسی‌کنندهٔ imports https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/imports.py.

پیام صادرشده:

Invalid exception operation. %s

توضیحات:

زمانی استفاده می‌شود که عملیاتی روی یک استثنا انجام گیرد، اما آن عملیات برای استثنای مورد نظر معتبر نباشد. معمولاً هنگام وجود عملیات‌های دودویی بین استثناها در گرداننده‌های except صادر می‌شود.

کد دارای مشکل:

try:
    1 / 0
except ValueError + TypeError:  # [wrong-exception-operation]
    pass

کد درست:

try:
    1 / 0
except (ValueError, TypeError):
    pass

ایجادشده توسط بررسی‌کنندهٔ exceptions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/exceptions.py.

تمام پیام‌های تغییرنام‌یافته در دسته‌بندی warning:

'broad-except' تغییرنام یافته است. پیام جدید را می‌توان در این نشانی یافت:.SS cache-max-size-none / W1517

نام 'cache-max-size-none' تغییر یافته است. پیام جدید را می‌توانید در اینجا بیابید:

نام 'implicit-str-concat-in-sequence' تغییر یافته است. پیام جدید را می‌توانید در اینجا بیابید:

نام 'lru-cache-decorating-method' تغییر یافته است. پیام جدید را می‌توانید در اینجا بیابید:

نام 'old-assignment-from-none' تغییر یافته است. پیام جدید را می‌توانید در اینجا بیابید:

نام 'old-deprecated-argument' تغییر یافته است. پیام جدید را می‌توانید در اینجا بیابید:

نام 'old-deprecated-class' تغییر یافته است. پیام جدید را می‌توانید در اینجا بیابید:

نام 'old-deprecated-decorator' تغییر یافته است. پیام جدید را می‌توانید در اینجا بیابید:

نام 'old-deprecated-method' تغییر یافته است. پیام جدید را می‌توانید در اینجا بیابید:

نام 'old-deprecated-module' تغییر یافته است. پیام جدید را می‌توانید در اینجا بیابید:

نام 'old-empty-docstring' تغییر یافته است. پیام جدید را می‌توانید در اینجا بیابید:

پیام صادرشده:

Empty %s docstring

توضیحات:

زمانی استفاده می‌شود که یک ماژول، تابع، کلاس یا متد دارای docstring خالی باشد (دیگر خیلی ساده می‌شد ;).

کد دارای مشکل:

def foo():  # [empty-docstring]
    """"""

کد صحیح:

def foo():
    """A dummy description."""

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/docstring_checker.py.

نام 'old-missing-param-doc' تغییر یافته است. پیام جدید را می‌توانید در اینجا بیابید:

نام 'old-missing-returns-doc' تغییر یافته است. پیام جدید را می‌توانید در اینجا بیابید:

نام 'old-missing-type-doc' تغییر یافته است. پیام جدید را می‌توانید در اینجا بیابید:

نام 'old-missing-yields-doc' تغییر یافته است. پیام جدید را می‌توانید در اینجا بیابید:

نام 'old-non-iterator-returned-1' تغییر یافته است. پیام جدید را می‌توانید در اینجا بیابید:.SS old-unidiomatic-typecheck / W0154

نام 'old-unidiomatic-typecheck' تغییر یافته است. پیام جدید را می‌توان در بخش زیر یافت:

پیام صادرشده:

برای بررسی نوع، به جای type() از isinstance() استفاده کنید.

توضیحات:

روش استاندارد و اصولی برای انجام یک بررسی نوع صریح در پایتون، استفاده از isinstance(x, Y) به جای type(x) == Y یا type(x) is Y است؛ هرچند شرایط نادری وجود دارند که در آن‌ها این دو روش نتایج متفاوتی ارائه می‌دهند.

کد دارای اشکال:

test_score = {"Biology": 95, "History": 80}
if type(test_score) is dict:  # [unidiomatic-typecheck]
    pass

کد درست:

test_score = {"Biology": 95, "History": 80}
if isinstance(test_score, dict):
    pass

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/comparison_checker.py.

نام 'old-unpacking-non-sequence' تغییر یافته است. پیام جدید را می‌توان در بخش زیر یافت:

نام 'useless-super-delegation' تغییر یافته است. پیام جدید را می‌توان در بخش زیر یافت:

تمام پیام‌ها در دسته‌بندی قرارداد (convention):

پیام صادرشده:

متد کلاس %s باید %s را به عنوان اولین آرگومان داشته باشد

توضیحات:

هنگامی به کار می‌رود که نام نخستین آرگومان یک متد کلاس با مقدار مشخص‌شده در گزینه valid-classmethod-first-arg (به طور پیش‌فرض "cls") متفاوت باشد؛ این کار توصیه می‌شود تا بتوان آن‌ها را به آسانی از متدهای عادی نمونه تشخیص داد.

کد دارای اشکال:

class Klass:
    @classmethod
    def get_instance(self):  # [bad-classmethod-argument]
        return self()

کد درست:

class Klass:
    @classmethod
    def get_instance(cls):
        return cls()

ایجادشده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py..SS bad-docstring-quotes / C0198

پیام صادرشده:

نقل‌قول‌های نادرست docstring در %s، مورد انتظار: """، ارائه‌شده: %s

توضیحات:

هنگامی استفاده می‌شود که یک docstring نقل‌قول سه‌گانه دوگانه (""") نداشته باشد.

کد دارای مشکل:

def foo():  # [bad-docstring-quotes]
    "Docstring."
    return

کد درست:

def foo():
    """Docstring."""
    return

فایل پیکربندی:

[main]
load-plugins=pylint.extensions.docstyle

جزئیات بیشتر:

از PEP 257:
"برای یکدستی، همواره از """نقل‌قول‌های سه‌گانه دوگانه""" در اطراف docstringها استفاده کنید."

پیوندهای مرتبط:

•
PEP 257 – Docstring Conventions https://peps.python.org/pep-0257/#specification

نکته:

این پیام توسط بررسی‌کننده اختیاری 'docstyle' <#pylint-extensions-docstyle> صادر می‌شود که نیازمند بارگذاری افزونه pylint.extensions.docstyle است.

ایجادشده توسط بررسی‌کننده docstyle https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docstyle.py.

پیام صادرشده:

PEP8 استفاده از UTF-8 را به عنوان کدگذاری فایل‌های پایتون توصیه می‌کند

توضیحات:

PEP8 کدگذاری پیش‌فرض UTF-8 را برای فایل‌های Python توصیه می‌کند. https://peps.python.org/pep-0008/#source-file-encoding را ببینید

کد دارای مشکل:

# coding: latin_1 # [bad-file-encoding]

کد درست:

ایجادشده توسط بررسی‌کننده unicode_checker https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/unicode.py..SS bad-mcs-classmethod-argument / C0204

پیام صادرشده:

متد کلاسی فراکلاس %s باید %s را به‌عنوان نخستین آرگومان داشته باشد

توضیحات:

زمانی استفاده می‌شود که نام نخستین آرگومان یک متد کلاسی فراکلاس با مقدار مشخص‌شده در گزینهٔ valid-metaclass-classmethod-first-arg (پیش‌فرض "mcs") متفاوت باشد؛ این کار برای تمایز آسان آن‌ها از متدهای معمولی نمونه توصیه می‌شود.

کد دارای مشکل:

class Meta(type):
    @classmethod
    def foo(some):  # [bad-mcs-classmethod-argument]
        pass

کد درست:

class Meta(type):
    @classmethod
    def foo(mcs):
        pass

ایجادشده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

متد فراکلاس %s باید %s را به‌عنوان نخستین آرگومان داشته باشد

توضیحات:

زمانی استفاده می‌شود که نام نخستین آرگومان یک متد فراکلاس با مقدار مشخص‌شده در گزینهٔ valid-classmethod-first-arg (پیش‌فرض "cls") متفاوت باشد؛ این کار برای تمایز آسان آن‌ها از متدهای معمولی نمونه توصیه می‌شود.

کد دارای مشکل:

class Meta(type):
    def func(some):  # [bad-mcs-method-argument]
        pass

کد درست:

class Meta(type):
    def func(cls):
        pass

ایجادشده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

به‌جای فراخوانی .keys()، پیمایش مستقیم دیکشنری را در نظر بگیرید

توضیحات:

هنگامی صادر می‌شود که کلیدهای یک دیکشنری از طریق متد ``.keys()`` پیمایش شوند یا زمانی که ``.keys()`` برای بررسی عضویت استفاده شود. پیمایش خود دیکشنری کافی است: ``for key in dictionary``. برای بررسی‌های عضویت، ``if key in dictionary`` سریع‌تر است.

کد دارای مشکل:

FRUITS = {"apple": 1, "pear": 5, "peach": 10}
for fruit in FRUITS.keys():  # [consider-iterating-dictionary]
    print(fruit)

کد درست:

FRUITS = {"apple": 1, "pear": 5, "peach": 10}
for fruit in FRUITS:
    print(fruit)

ایجادشده توسط بررسی‌کنندهٔ refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/recommendation_checker.py..SS consider-using-any-or-all / C0501

پیام صادرشده:

`for` loop could be `%s`

توضیحات:

یک حلقهٔ for که شرطی را بررسی می‌کند و یک مقدار bool برمی‌گرداند، می‌تواند با any یا all جایگزین شود.

کد دارای مشکل:

all_even.py:

def all_even(items):
    """Return True if the list contains all even numbers"""
    for item in items:  # [consider-using-any-or-all]
        if not item % 2 == 0:
            return False
    return True

any_even.py:

def any_even(items):
    """Return True if the list contains any even numbers"""
    for item in items:  # [consider-using-any-or-all]
        if item % 2 == 0:
            return True
    return False

کد صحیح:

all_even.py:

def all_even(items):
    """Return True if the list contains all even numbers"""
    return all(item % 2 == 0 for item in items)

any_even.py:

def any_even(items):
    """Return True if the list contains any even numbers"""
    return any(item % 2 == 0 for item in items)

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.for_any_all

نکته:

این پیام توسط بررسی‌کنندهٔ اختیاری 'consider-using-any-or-all' <#pylint-extensions-for-any-all> صادر می‌شود، که نیازمند بارگذاری پلاگین pylint.extensions.for_any_all است.

ایجادشده توسط بررسی‌کنندهٔ consider-using-any-or-all https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/for_any_all.py..SS consider-using-dict-items / C0206

پیام صادرشده:

استفاده از ()items. را برای پیمایش مد نظر قرار دهید

توضیحات:

زمانی صادر می‌شود که روی کلیدهای یک دیکشنری پیمایش صورت گرفته و مقدار با جستجوی اندیس به دست می‌آید. در عوض می‌توان با پیمایش با متد ()items. دیکشنری، به هر دوی کلید و مقدار دسترسی یافت.

کد دارای اشکال:

ORCHESTRA = {
    "violin": "strings",
    "oboe": "woodwind",
    "tuba": "brass",
    "gong": "percussion",
}
for instrument in ORCHESTRA:  # [consider-using-dict-items]
    print(f"{instrument}: {ORCHESTRA[instrument]}")

کد درست:

ORCHESTRA = {
    "violin": "strings",
    "oboe": "woodwind",
    "tuba": "brass",
    "gong": "percussion",
}
for instrument, section in ORCHESTRA.items():
    print(f"{instrument}: {section}")

ایجادشده توسط بازبین refactoring در https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/recommendation_checker.py.

پیام صادرشده:

استفاده از enumerate را به‌جای پیمایش با range و len مد نظر قرار دهید

توضیحات:

هنگام مواجهه با کدی صادر می‌شود که با range و len پیمایش می‌کند. چنین کدی را می‌توان با استفاده از تابع توکار enumerate ساده‌سازی کرد.

کد دارای اشکال:

seasons = ["Spring", "Summer", "Fall", "Winter"]
for i in range(len(seasons)):  # [consider-using-enumerate]
    print(i, seasons[i])

کد درست:

seasons = ["Spring", "Summer", "Fall", "Winter"]
for i, season in enumerate(seasons):
    print(i, season)

ایجادشده توسط بازبین refactoring در https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/recommendation_checker.py..SS consider-using-f-string / C0209

پیام صادرشده:

قالب‌بندی یک رشته معمولی که می‌تواند یک f-string باشد

توضیحات:

زمانی استفاده می‌شود که تشخیص داده شود یک رشته با format() یا % قالب‌بندی شده است، در حالی که امکان تبدیل آن به یک f-string وجود دارد. استفاده از f-stringها ترجیح داده می‌شود. نیازمند Python 3.6 و ``py-version >= 3.6`` است.

کد دارای مشکل:

from string import Template
menu = ("eggs", "spam", 42.4)
old_order = "%s and %s: %.2f ¤" % menu  # [consider-using-f-string]
beginner_order = menu[0] + " and " + menu[1] + ": " + str(menu[2]) + " ¤"
joined_order = " and ".join(menu[:2])
# +1: [consider-using-f-string]
format_order = "{} and {}: {:0.2f} ¤".format(menu[0], menu[1], menu[2])
# +1: [consider-using-f-string]
named_format_order = "{eggs} and {spam}: {price:0.2f} ¤".format(
    eggs=menu[0], spam=menu[1], price=menu[2]
)
template_order = Template("$eggs and $spam: $price ¤").substitute(
    eggs=menu[0], spam=menu[1], price=menu[2]
)

کد صحیح:

menu = ("eggs", "spam", 42.4)
f_string_order = f"{menu[0]} and {menu[1]}: {menu[2]:0.2f} ¤"

جزئیات تکمیلی:

لفظ‌های رشته‌ای قالب‌بندی‌شده (f-stringها) ساختار نحوی مختصر و یکدستی را ارائه می‌دهند که می‌تواند جایگزین بیشتر موارد استفاده از عملگر قالب‌بندی %، str.format() و string.Template شود.

همچنین f-stringها عملکرد بهتری نسبت به روش‌های جایگزین دارند؛ برای یک مثال ساده به این توییت https://twitter.com/raymondh/status/1205969258800275456 مراجعه کنید.

ایجادشده توسط بررسی‌کنندهٔ refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/recommendation_checker.py.

پیام صادرشده:

هنگام مقداردهی اولیه دیکشنری، تمام کلید/مقدارهای شناخته‌شده را اعلان کنید.

توضیحات:

دیکشنری‌ها می‌توانند در یک دستور واحد و با استفاده از نحو لفظِ دیکشنری (dictionary literal) مقداردهی اولیه شوند.

کد دارای مشکل:

fruit_prices = {}  # [dict-init-mutate]
fruit_prices["apple"] = 1
fruit_prices["banana"] = 10

کد صحیح:

fruit_prices = {"apple": 1, "banana": 10}

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.dict_init_mutate,

نکته:

این پیام توسط بررسی‌کنندهٔ اختیاری 'dict-init-mutate' <#pylint-extensions-dict-init-mutate> صادر می‌شود که مستلزم بارگذاری افزونهٔ pylint.extensions.dict_init_mutate است.

ایجادشده توسط بررسی‌کنندهٔ dict-init-mutate https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/dict_init_mutate.py..SS disallowed-name / C0104

پیام صادرشده:

نام غیرمجاز "%s"

توضیحات:

زمانی استفاده می‌شود که نام با bad-names یا bad-names-rgxs- (نام‌های غیرمجاز) مطابقت داشته باشد.

کد مشکل‌دار:

def foo():  # [disallowed-name]
    print("apples")

کد صحیح:

def print_fruit():
    print("apples")

فایل پیکربندی:

[MAIN]
bad-names=foo,bar,baz

ایجادشده توسط بررسی‌کنندهٔ basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/name_checker/checker.py.

پیام صادرشده:

خط اول در docstring %s خالی است

توضیحات:

زمانی استفاده می‌شود که یک خط خالی در ابتدای docstring یافت شود.

کد مشکل‌دار:

def foo():  # [docstring-first-line-empty]
    """
    Lorem Ipsum is simply dummy text of the printing and typesetting
    industry.
    Lorem Ipsum has been the industry's standard dummy text ever since the
    1500s, when an unknown printer took a galley of type and scrambled it
    to make a type specimen book
    """

کد صحیح:

def foo():
    """Lorem Ipsum is simply dummy text of the printing and typesetting
    industry.
    Lorem Ipsum has been the industry's standard dummy text ever since the
    1500s, when an unknown printer took a galley of type and scrambled it
    to make a type specimen book
    """

فایل پیکربندی:

[MAIN]
load-plugins = pylint.extensions.docstyle

نکته:

این پیام توسط بررسی‌کنندهٔ اختیاری 'docstyle' <#pylint-extensions-docstyle> صادر می‌شود که نیازمند بارگذاری افزونهٔ pylint.extensions.docstyle است.

ایجادشده توسط بررسی‌کنندهٔ docstyle https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docstyle.py..SS import-outside-toplevel / C0415

پیام صادرشده:

وارد کردن خارج از بالاترین سطح (%s)

توضیحات:

هنگامی استفاده می‌شود که یک دستور import در جایی غیر از بالاترین سطح ماژول به کار رفته باشد. این import را به ابتدای فایل منتقل کنید.

کد دارای مشکل:

def print_python_version():
    import sys  # [import-outside-toplevel]
    print(sys.version_info)

کد درست:

import sys
def print_python_version():
    print(sys.version_info)

ایجادشده توسط بازبین imports https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/imports.py.

پیام صادرشده:

وارد کردن %s خصوصی (%s)

توضیحات:

هنگامی استفاده می‌شود که یک ماژول یا شیء خصوصی با پیشوند _ وارد شود. راهنمای PEP8 در بخش قراردادهای نام‌گذاری بیان می‌کند که ویژگی‌های عمومی با زیرخط آغازین باید خصوصی در نظر گرفته شوند.

کد دارای مشکل:

from argparse import _AttributeHolder, _SubParsersAction  # [import-private-name]
attr_holder = _AttributeHolder()
def add_sub_parser(sub_parsers: _SubParsersAction):
    sub_parsers.add_parser("my_subparser")
    # ...

کد درست:

"""Private import can be used as type annotations."""
from argparse import _SubParsersAction
def add_sub_parser(sub_parsers: _SubParsersAction):
    sub_parsers.add_parser("my_subparser")
    # ...

فایل پیکربندی:

[main]
load-plugins = pylint.extensions.private_import

جزئیات بیشتر:

استفاده از وارد کردن‌های خصوصی، شما را در هر ارتقای نسخه وابستگی‌هایتان، حتی در نسخه‌های وصله‌ای (patch)، در معرض تغییرات ناسازگار و غیرمنتظره قرار می‌دهد.

نکته:

این پیام توسط بازبین اختیاری 'import-private-name' <#pylint-extensions-private-import> صادر می‌شود که نیازمند بارگذاری افزونه pylint.extensions.private_import است.

ایجادشده توسط بازبین import-private-name https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/private_import.py..SS invalid-characters-in-docstring / C0403

پیام صادرشده:

Invalid characters %r in a docstring

توضیحات:

زمانی استفاده می‌شود که یک کلمه در docstring توسط enchant قابل بررسی نباشد.

جزئیات تکمیلی:

این پیامی مرتبط با یک مشکل داخلی در enchant است. نیازی به تغییر در کد شما نیست، بلکه ممکن است در پیکربندی pylint یا نحوه نصب کتابخانه سیستمی 'enchant' مشکلی وجود داشته باشد.

ایجادشده توسط بررسی‌کننده spelling https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/spelling.py.

پیام صادرشده:

%s name "%s" doesn't conform to %s

توضیحات:

زمانی استفاده می‌شود که نام با قواعد نام‌گذاری مرتبط با نوع خود (ثابت، متغیر، کلاس...) مطابقت نداشته باشد.

کد دارای مشکل:

class cat:  # [invalid-name]
    def Meow(self, NUMBER_OF_MEOW):  # [invalid-name, invalid-name]
        print("Meow" * NUMBER_OF_MEOW)
        return NUMBER_OF_MEOW
Cat = cat().Meow(42)  # [invalid-name]

کد درست:

class Cat:
    def meow(self, number_of_meow):
        print("Meow" * number_of_meow)
        return number_of_meow
CAT = Cat().meow(42)

جزئیات تکمیلی:

ابزار Pylint در درون خود چندین نوع نام مختلف را تشخیص می‌دهد. با چند استثنا، نوع یک نام توسط مکانی که انتساب به آن نام در آنجا یافت می‌شود تعیین می‌گردد، نه بر اساس نوع شیء اختصاص‌داده‌شده.

نوع نام توضیحات
module نام‌های ماژول و بسته (package)، همانند نام فایل‌ها.
const ثابت‌های سطح ماژول: هر نام تعریف‌شده در سطح ماژول که نه به یک شیء کلاس متصل است و نه مجدداً مقداردهی می‌شود.
class نام‌ها در دستورهای class، و همچنین نام‌های متصل به اشیاء کلاس در سطح ماژول.
function توابع؛ در سطح بالا یا تودرتو درون توابع یا متدها.
method متدها؛ توابع تعریف‌شده در بدنه کلاس. شامل متدهای ایستا (static) و متدهای کلاس.
attr صفت‌های ایجادشده روی نمونه‌های کلاس در درون متدها.
argument آرگومان‌های هر نوع تابع، از جمله توابع لامبدا (lambdas).
variable متغیرهای محلی در حوزه توابع یا نام‌های سطح ماژول که چندین بار مقداردهی می‌شوند.
class-attribute صفت‌های تعریف‌شده در بدنه کلاس.
class-const ثابت‌های Enum و متغیرهای کلاس نشانه‌گذاری‌شده با Final
inlinevar متغیرهای حلقه در فهم لیست‌ها (list comprehensions) و عبارات مولد (generator expressions).
typevar متغیر نوع اعلان‌شده با TypeVar.
paramspec متغیر مشخصات پارامتر اعلان‌شده با ParamSpec.
typevartuple تاپل متغیر نوع اعلان‌شده با TypeVarTuple.
typealias نام مستعار نوع اعلان‌شده با TypeAlias یا انتساب‌های Union.
رفتار پیش‌فرض
به‌طور پیش‌فرض، Pylint نام‌های پیشنهادی در PEP8 https://peps.python.org/pep-0008 را اعمال می‌کند.
سبک‌های نام‌گذاری از پیش‌تعریف‌شده
ابزار Pylint مجموعه‌ای از سبک‌های نام‌گذاری از پیش‌تعریف‌شده را ارائه می‌دهد. این سبک‌های
نام‌گذاری از پیش‌تعریف‌شده می‌توانند برای تطبیق پیکربندی Pylint با سبک کدنویسیِ
استفاده‌شده در پروژهٔ مورد بررسی به کار روند.
سبک‌های نام‌گذاری از پیش‌تعریف‌شدهٔ زیر در دسترس هستند:
0.0
• 2
snake_case
• 2
camelCase
• 2
PascalCase
• 2
UPPER_CASE
• 2
any - سبک ساختگی که هیچ محدودیتی را اعمال نمی‌کند
168u
گزینه‌های زیر در دسترس قرار دارند:
0.0
--module-naming-style=<style>
168u
0.0
--const-naming-style=<style>
168u
0.0
--class-naming-style=<style>
168u
0.0
--function-naming-style=<style>
168u
0.0
--method-naming-style=<style>
168u
0.0
--attr-naming-style=<style>
168u
0.0
--argument-naming-style=<style>
168u
0.0
--variable-naming-style=<style>
168u
0.0
--class-attribute-naming-style=<style>
168u
0.0
--class-const-naming-style=<style>
168u
0.0
--inlinevar-naming-style=<style>
168u
الگوهای نام‌گذاری از پیش‌تعریف‌شده
ابزار Pylint الگوهای نام‌گذاری از پیش‌تعریف‌شده‌ای را برای برخی نام‌ها ارائه می‌کند. این الگوها
اغلب بر پایهٔ یک سبک نام‌گذاری هستند، اما گزینه‌ای برای انتخاب یکی از سبک‌های ذکرشده در بالا وجود ندارد.
این الگو را می‌توان با گزینه‌هایی که در ادامه شرح داده شده‌اند بازنویسی کرد.
انواع نام‌های زیر با یک الگوی از پیش‌تعریف‌شده بررسی می‌شوند:
box center;
l|l|l.
نوع نام نام‌های مناسب
نام‌های نامناسب
T}
typevar T, _CallableT, _T_co, AnyStr, DeviceTypeT, IPAddressT
DICT_T, CALLABLE_T, ENUM_T, DeviceType,
_StrType
T}
paramspec P, _P
CALLABLE_P
T}
typevartuple Ts, _Ts
TUPLE_TS
T}
typealias 0.0 GoodName, _GoodName, IPAddressType, GoodName2 و سایر گونه‌های PascalCase که با T یا Type شروع نمی‌شوند. این به منظور متمایز ساختن آن‌ها از typevars است. توجه داشته باشید که TopName مجاز است اما TTopName مجاز نیست. 168u
0.0
BadNameT, badName, TBadName, TypeBadName,
_1BadName
168u
T}

پیش از pylint 3.0، بیشتر الگوهای از پیش‌تعریف‌شده حداقل طول سه نویسه را نیز اعمال می‌کردند. اگر این رفتار در نگارش‌های 3.0 و پس از آن مورد نیاز باشد، می‌توان با ارائهٔ عبارت‌های باقاعدهٔ سفارشی، مطابق آنچه در ادامه توضیح داده شده، به آن دست یافت. (یا چنانچه بررسی disallowed-name به‌جای invalid-name کافی باشد، ارائهٔ تک‌گزینهٔ bad-names-rgxs="^..?$" برای رد کردن نام‌های ۱ تا ۲ نویسه‌ای کفایت خواهد کرد)..SS عبارت‌های باقاعده سفارشی

اگر سبک‌های نام‌گذاری از پیش تعریف‌شده بیش از حد محدود باشند، می‌توان رفتار بررسی‌کننده را بیشتر سفارشی‌سازی کرد. برای هر نوع نام، می‌توان یک عبارت باقاعده جداگانه برای تطبیق با نام‌های معتبر آن نوع تعریف نمود. اگر هر یک از عبارت‌های باقاعده سفارشی تعریف شوند، مقدار گزینه *-naming-style را بازنویسی (override) می‌کنند.

عبارت‌های باقاعده برای نام‌ها از ابتدا مهار شده‌اند؛ هر مهارکننده‌ای برای انتها باید به‌طور صریح ارائه شود. هر نامی که با عبارت باقاعده مطابقت نداشته باشد، منجر به یک نمونه از هشدار invalid-name خواهد شد.

--module-rgx=<regex>

پایگاه‌های کد بزرگی که چندین سال توسعه یافته‌اند، اغلب دچار تحول در سبک نیز می‌شوند. در برخی موارد، ماژول‌ها ممکن است درون یک بسته یکسان باشند، اما بسته به لایه‌ای که به آن تعلق دارند، از سبک‌های نام‌گذاری متفاوتی استفاده کنند. با این حال، برای آسان‌تر شدن ایجاد تغییرات درون یک فایل، همچنان یکپارچگی درون‌ماژولی الزامی است. برای این مورد، Pylint از عبارت‌های باقاعده با چندین گروه ضبط نام‌گذاری‌شده (named capturing group) پشتیبانی می‌کند.

به‌جای صدور فوری هشدارهای نام، Pylint سبک نام‌گذاری غالب در هر ماژول را تعیین کرده و آن را بر تمام نام‌ها اعمال می‌کند.

مثال (ساده‌شده) زیر را در نظر بگیرید:

pylint --function-rgx='(?:(?P<snake>[a-z_]+)|(?P<camel>[a-z]+([A-Z][a-z]*)*))$' sample.py

این عبارت باقاعده دو سبک نام‌گذاری را تعریف می‌کند: snake برای نام‌های snake-case و camel برای نام‌های camel-case.

در فایل sample.py، نام تابع در خط ۱ و ۷ ماژول را علامت‌گذاری کرده و تطابق با گروه نام‌گذاری‌شده snake را برای سایر نام‌های موجود در ماژول اجباری می‌سازد:

def valid_snake_case(arg):
   ...
def InvalidCamelCase(arg):
   ...
def more_valid_snake_case(arg):
 ...

به همین دلیل، نام موجود در خط ۴ یک هشدار invalid-name ایجاد خواهد کرد، حتی با وجود این‌که نام با عبارت باقاعده داده‌شده مطابقت دارد.

تطابق‌های نام‌گذاری‌شده با exempt یا ignore می‌توانند برای نام‌های بی‌اثر (non-tainting) به کار روند، تا از فعال شدن سبک‌های نام‌گذاری خاص توسط نام‌های توکار (built-in) یا تحمیل‌شده توسط رابط جلوگیری شود.

مقدار پیش‌فرض: خالی

قالب: گروه‌های جداشده با کاما از نام‌های جداشده با دونقطه.

این گزینه می‌تواند برای ترکیب سبک‌های نام‌گذاری استفاده شود. برای مثال، function:method الزامی می‌کند که توابع و متدها از سبکی یکسان استفاده کنند، و سبکی که توسط هر یک از این دو نوع نام فعال شود به دیگری نیز سرایت می‌کند. این امر مستلزم آن است که عبارت باقاعده برای انواع نام‌های ترکیب‌شده از نام‌های گروه مشابهی استفاده کند.

پیش‌فرض: off

همراه با هر هشدار invalid-name، یک راهنمایی (عبارت باقاعده استفاده‌شده) برای قالب نام صحیح گنجانده شود.

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/name_checker/checker.py.

پیام صادرشده:

Line too long (%s/%s)

توضیحات:

زمانی استفاده می‌شود که یک خط طولانی‌تر از تعداد نویسه‌های مشخص‌شده باشد.

کد دارای مشکل:

# +1: [line-too-long]
FRUIT = ["apricot", "blackcurrant", "cantaloupe", "dragon fruit", "elderberry", "fig", "grapefruit", ]

کد صحیح:

FRUIT = [
    "apricot",
    "blackcurrant",
    "cantaloupe",
    "dragon fruit",
    "elderberry",
    "fig",
    "grapefruit",
]

فایل پیکربندی:

[MAIN]
max-line-length=100

جزئیات بیشتر:

کنترل‌های pragma مانند # pylint: disable=all برای اهداف این پیام، در محاسبه طول خط شمرده نمی‌شوند.

اگر تلاش کنید این پیام را از طریق # pylint: disable=line-too-long در یک ماژول بدون کد غیرفعال کنید، ممکن است پیامی برای useless-suppression دریافت کنید. این یک مثبت کاذب از useless-suppression است که نمی‌توانیم آن را به‌راحتی برطرف کنیم.

برای اطلاعات بیشتر https://github.com/pylint-dev/pylint/issues/3368 را ببینید.

ایجادشده توسط بررسی‌کننده format https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/format.py.

پیام صادرشده:

Comparison should be %s

توضیحات:

زمانی استفاده می‌شود که مقدار ثابت در سمت چپ یک مقایسه قرار گیرد. معمولاً از نظر بیان مقصود، قرار دادن آن در سمت راست مقایسه واضح‌تر است.

کد دارای مشکل:

def compare_apples(apples=20):
    for i in range(10):
        if 5 <= i:  # [misplaced-comparison-constant]
            pass
        if 1 == i:  # [misplaced-comparison-constant]
            pass
        if 20 < len(apples):  # [misplaced-comparison-constant]
            pass

کد صحیح:

def compare_apples(apples=20):
    for i in range(10):
        if i >= 5:
            pass
        if i == 1:
            pass
        if len(apples) > 20:
            pass

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.comparison_placement

نکته:

این پیام توسط بررسی‌کننده اختیاری 'comparison-placement' <#pylint-extensions-comparison-placement> صادر می‌شود که به بارگذاری افزونه pylint.extensions.comparison_placement نیاز دارد.

ایجادشده توسط بررسی‌کننده comparison-placement https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/comparison_placement.py..SS missing-class-docstring / C0115

پیام صادرشده:

docstring کلاس وجود ندارد (Missing class docstring)

توضیحات:

زمانی استفاده می‌شود که یک کلاس فاقد docstring باشد. حتی یک کلاس خالی نیز باید یک docstring داشته باشد.

کد مشکل‌دار:

class Person:  # [missing-class-docstring]
    def __init__(self, first_name, last_name):
        self.first_name = first_name
        self.last_name = last_name

کد صحیح:

class Person:
    """Class representing a person"""
    def __init__(self, first_name, last_name):
        self.first_name = first_name
        self.last_name = last_name

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/docstring_checker.py.

پیام صادرشده:

خط جدید پایانی وجود ندارد (Final newline missing)

توضیحات:

زمانی استفاده می‌شود که آخرین خط یک فایل فاقد خط جدید (newline) باشد.

کد مشکل‌دار:

crlf.py:

print("Hello")  # CRLF (\r\n)
print("world")  # End-of-file (EOF)
# [missing-final-newline]

lf.py:

print("Hello")  # LF (\n)
print("world")  # End-of-file (EOF)
# [missing-final-newline]

کد صحیح:

crlf.py:

print("Hello")  # CRLF (\r\n)
print("world")  # CRLF (\r\n)
# End-of-file (EOF)

lf.py:

print("Hello")  # LF (\n)
print("world")  # LF (\n)
# End-of-file (EOF)

جزئیات تکمیلی:

استاندارد POSIX یک خط را این‌گونه تعریف می‌کند:
"دنباله‌ای از صفر یا چند نویسه غیر- <newline> به همراه یک نویسه خاتمه‌دهنده <newline>."

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کننده format https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/format.py..SS missing-function-docstring / C0116

پیام صادرشده:

نبود docstring تابع یا متد

توضیحات:

هنگامی استفاده می‌شود که یک تابع یا متد فاقد docstring باشد. برخی متدهای خاص مانند __init__ نیازی به docstring ندارند.

کد دارای مشکل:

import sys
def print_python_version():  # [missing-function-docstring]
    print(sys.version)

کد درست:

import sys
def print_python_version():
    """Function printing python version."""
    print(sys.version)

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/docstring_checker.py.

پیام صادرشده:

نبود docstring ماژول

توضیحات:

هنگامی استفاده می‌شود که یک ماژول فاقد docstring باشد. ماژول‌های خالی نیازی به docstring ندارند.

کد دارای مشکل:

import sys  # [missing-module-docstring]
def print_python_version():
    print(sys.version)

کد درست:

"""Module providing a function printing python version."""
import sys
def print_python_version():
    print(sys.version)

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/docstring_checker.py..SS mixed-line-endings / C0327

پیام صادرشده:

پایان خط‌های ترکیبی LF و CRLF

توضیحات:

زمانی استفاده می‌شود که نشانه‌های پایان خط ترکیبی (LF و CRLF) در یک فایل وجود داشته باشند.

کد دارای مشکل:

print("Hello")  # CRLF (\r\n)
print("World")  # LF (\n) # [mixed-line-endings]

کد صحیح:

full_crlf.py:

print("Hello")  # CRLF (\r\n)
print("World")  # CRLF (\r\n)

full_lf.py:

print("Hello")  # LF (\n)
print("World")  # LF (\n)

پیوندهای مرتبط:

ایجاد شده توسط بررسی‌کننده format https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/format.py.

پیام صادرشده:

چندین import در یک خط (%s)

توضیحات:

زمانی استفاده می‌شود که دستور import در حال وارد کردن چندین ماژول شناسایی شود.

کد دارای مشکل:

import os, sys  # [multiple-imports]

کد صحیح:

import os
import sys

ایجاد شده توسط بررسی‌کننده imports https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/imports.py..SS multiple-statements / C0321

پیام صادرشده:

بیش از یک دستور در یک سطر

توضیحات:

هنگامی استفاده می‌شود که بیش از یک دستور در یک سطر یکسان یافت شود.

کد دارای مشکل:

fruits = ["apple", "orange", "mango"]
if "apple" in fruits: pass  # [multiple-statements]
else:
    print("no apples!")

کد درست:

fruits = ["apple", "orange", "mango"]
if "apple" in fruits:
    pass
else:
    print("no apples!")

ایجاد شده توسط بررسی‌کنندهٔ format https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/format.py.

پیام صادرشده:

نام %s "%s" شامل یک نویسهٔ غیر ASCII است، برای import از یک نام مستعارِ فقط ASCII استفاده کنید.

توضیحات:

هنگامی استفاده می‌شود که نام حاوی حداقل یک نویسهٔ یونیکد غیر ASCII باشد. برای پیشینه‌ای دربارهٔ اینکه چرا این می‌تواند بد باشد، https://peps.python.org/pep-0672/#confusing-features را ببینید. اگر شیوه‌نامهٔ برنامه‌نویسی شما مشخص کرده است که به زبان انگلیسی برنامه‌نویسی می‌کنید، پس نباید نیازی به نویسه‌های غیر ASCII در نام‌های Python باشد. در غیر این صورت، می‌توانید به سادگی این بررسی را غیرفعال کنید.

کد دارای مشکل:

from os.path import join as łos  # [non-ascii-module-import]
foo = łos("a", "b")

کد درست:

from os.path import join as os_join
foo = os_join("a", "b")

ایجاد شده توسط بررسی‌کنندهٔ nonascii-checker https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/non_ascii_names.py..SS non-ascii-name / C2401

پیام صادرشده:

نام %s "%s" حاوی یک نویسه غیر ASCII است، تغییر نام آن را در نظر بگیرید.

توضیحات:

زمانی استفاده می‌شود که نام حاوی حداقل یک نویسه یونیکد غیر ASCII باشد. برای پیش‌زمینه‌ای در مورد چرایی نامناسب بودن این مورد، https://peps.python.org/pep-0672/#confusing-features را ببینید. اگر شیوه‌نامه برنامه‌نویسی شما مشخص کرده که به زبان انگلیسی برنامه‌نویسی می‌کنید، دیگر نیازی به نویسه‌های غیر ASCII در نام‌های پایتون نخواهد بود. در غیر این صورت، می‌توانید به سادگی این بررسی را غیرفعال کنید.

کد دارای اشکال:

ápple_count = 4444  # [non-ascii-name]

کد صحیح:

apple_count = 4444

ایجاد شده توسط بررسی‌کننده nonascii-checker https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/non_ascii_names.py.

پیام صادرشده:

مقدار __slots__ کلاس باید یک شیء تکرارپذیر (غیر از رشته) باشد

توضیحات:

زمانی استفاده می‌شود که __slots__ کلاس به جای یک شیء تکرارپذیر، یک رشته ساده باشد.

کد دارای اشکال:

class Fruit:  # [single-string-used-for-slots]
    __slots__ = "name"
    def __init__(self, name):
        self.name = name

کد صحیح:

class Fruit:
    __slots__ = ("name",)
    def __init__(self, name):
        self.name = name

ایجاد شده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

مقایسه %s باید %s باشد

توضیحات:

زمانی استفاده می‌شود که یک عبارت با مقادیر تکین (singleton) مانند True، False یا None مقایسه شود.

کد دارای اشکال:

game_won = True
if game_won == True:  # [singleton-comparison]
    print("Game won !")

کد صحیح:

game_won = True
if game_won:
    print("Game won !")

پیوندهای مرتبط:

•
PEP 285 – افزودن نوع داده bool https://peps.python.org/pep-0285

ایجاد شده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/comparison_checker.py..SS superfluous-parens / C0325

پیام صادرشده:

پرانتزهای غیرضروری پس از کلیدواژهٔ %r

توضیحات:

زمانی استفاده می‌شود که یک عبارت منفرد درون پرانتز پس از if، for یا دیگر کلیدواژه‌ها قرار گیرد.

کد دارای مشکل:

example_1.py:

x = input()
y = input()
if (x == y):  # [superfluous-parens]
    pass

example_2.py:

i = 0
exclude = []
if (i - 0) in exclude:  # [superfluous-parens]
    pass

کد صحیح:

example_1.py:

x = input()
y = input()
if x == y:
    pass

example_2.py:

i = 0
exclude = []
if i - 0 in exclude:
    pass

ایجادشده توسط بررسی‌کنندهٔ format https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/format.py.

پیام صادرشده:

خطوط بیش از حد در ماژول (%s/%s)

توضیحات:

زمانی استفاده می‌شود که یک ماژول خطوط بسیار زیادی داشته باشد و خوانایی آن کاهش یابد.

کد دارای مشکل:

def is_palindrome(string):  # [too-many-lines]
    left_pos = 0
    right_pos = len(string) - 1
    while right_pos >= left_pos:
        if not string[left_pos] == string[right_pos]:
            return False
        left_pos += 1
        right_pos -= 1
    return True
def main():
    print(is_palindrome("aza"))
    print(is_palindrome("racecar"))
    print(is_palindrome("trigger"))
    print(is_palindrome("ogre"))

کد صحیح:

__init__.py:

__all__ = ["is_palindrome", "main"]
from is_palindrome import is_palindrome
from main import main

is_palindrome.py:

def is_palindrome(string):
    return string == string[::-1]

main.py:

from is_palindrome import is_palindrome
def main():
    for string in ["aza", "racecar", "trigger", "ogre"]:
        print(is_palindrome(string))

فایل پیکربندی:

[main]
max-module-lines=15

جزئیات بیشتر:

هنگامی که یک ماژول خطوط بسیار زیادی داشته باشد، خواندن و درک آن دشوار می‌شود. همچنین ممکن است هنگام ویرایش فایل به دلیل نیاز IDE به تجزیه و تحلیل کد بیشتر، افت کارایی رخ دهد. برای پیمایش مناسب در فایل نیز به مهارت بیشتری نیاز خواهید داشت (مانند رفتن به خطی خاص هنگام اشکال‌زدایی، یا جستجو برای یک ساختار کد مشخص، به‌جای پیمایش صرف با کلیک و اسکرول).

این معیار، جایگزینی تقریبی برای پیچیدگی چرخه‌ای (cyclomatic complexity) بالاتر است که اگر از load-plugins=pylint.extensions.mccabe, استفاده نکنید، ممکن است آن را محاسبه نکرده باشید. محاسبهٔ پیچیدگی چرخه‌ای زمان‌برتر است، اما در عین حال معیاری دقیق‌تر و ریزدانه‌تر از SLOC خام محسوب می‌شود. به‌ویژه، در صورت استفاده از پیچیدگی چرخه‌ای، نمی‌توانید با ساختن یک کد تک‌خطی بسیار پیچیده خوانایی کد را پایین بیاورید.

مثال بالا کد را ساده‌سازی می‌کند، اما این کار همیشه ممکن نیست. در اغلب موارد، شکستن فایل و تقسیم آن از طریق ایجاد یک بسته (package) با همان رابط برنامه‌نویسی (API) تنها راه‌حل موجود است. پیش‌بینی این موضوع و ساختاردهی فایل‌ها از همان آغاز کار باعث می‌شود به همان نتیجهٔ نهایی برسید در حالی که تاریخچهٔ بهتری در سیستم کنترل نسخه خواهید داشت.

ایجادشده توسط بررسی‌کنندهٔ format https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/format.py..SS trailing-newlines / C0305

پیام صادرشده:

خطوط جدید پایانی

توضیحات:

هنگامی استفاده می‌شود که خطوط خالی پایانی در یک فایل وجود داشته باشد.

کد دارای مشکل:

print("apple")
# The file ends with 2 lines that are empty # +1: [trailing-newlines]

کد صحیح:

print("apple")

ایجادشده توسط بررسی‌کننده format https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/format.py.

پیام صادرشده:

فاصله‌های خالی پایانی

توضیحات:

هنگامی استفاده می‌شود که بین انتهای یک خط و نویسه‌ی خط جدید، فاصله‌ی خالی وجود داشته باشد.

کد دارای مشکل:

print("Hello")  # [trailing-whitespace]   
#                                       ^^^ trailing whitespaces

کد صحیح:

print("Hello")

ایجادشده توسط بررسی‌کننده format https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/format.py.

پیام صادرشده:

TypeVar نمی‌تواند هم‌زمان هم covariant و هم contravariant باشد

توضیحات:

هنگامی صادر می‌شود که هر دو آرگومان کلیدی "covariant" و "contravariant" در یک TypeVar روی "True" تنظیم شده باشند.

کد دارای مشکل:

from typing import TypeVar
T = TypeVar("T", covariant=True, contravariant=True)  # [typevar-double-variance]

کد صحیح:

from typing import TypeVar
T_co = TypeVar("T_co", covariant=True)
T_contra = TypeVar("T_contra", contravariant=True)

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/name_checker/checker.py..SS typevar-name-incorrect-variance / C0105

پیام صادرشده:

Type variable name does not reflect variance%s

توضیحات:

زمانی صادر می‌شود که نام یک TypeVar نشان‌دهنده واریانس نوع آن نباشد. طبق استاندارد PEP8، توصیه می‌شود پسوندهای '_co' و '_contra' به متغیرهایی اضافه شوند که به ترتیب برای اعلان رفتار هم‌وردا (covariant) یا پادوردا (contravariant) به کار می‌روند. متغیرهای ناوردا (invariant، پیش‌فرض) نیازی به پسوند ندارند. این پیام همچنین زمانی صادر می‌شود که متغیرهای ناوردا دارای پسوند باشند.

کد دارای اشکال:

from typing import TypeVar
T_co = TypeVar("T_co")  # [typevar-name-incorrect-variance]

کد درست:

from typing import TypeVar
T = TypeVar("T")

جزئیات بیشتر:

هنگام نام‌گذاری متغیرهای نوع (type vars)، تنها زمانی از پسوند _co برای نشان دادن هم‌وردایی یا از _contra برای نشان دادن پادوردایی استفاده کنید.

ایجاد شده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/name_checker/checker.py.

پیام صادرشده:

TypeVar name "%s" does not match assigned variable name "%s"

توضیحات:

زمانی صادر می‌شود که یک TypeVar به متغیری انتساب داده شود که با آرگومان نام آن مطابقت ندارد.

کد دارای اشکال:

from typing import TypeVar
X = TypeVar("T")  # [typevar-name-mismatch]

کد درست:

from typing import TypeVar
T = TypeVar("T")

ایجاد شده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/name_checker/checker.py.

پیام صادرشده:

Unexpected line ending format. There is '%s' while it should be '%s'.

توضیحات:

زمانی استفاده می‌شود که نویسه خط جدید متفاوتی با آنچه انتظار می‌رود وجود داشته باشد.

کد دارای اشکال:

print("I'm drinking tea!")  # CRLF (\r\n) # [unexpected-line-ending-format]
print("I'm drinking water!")  # CRLF (\r\n) # [unexpected-line-ending-format]

کد درست:

print("I'm drinking tea!")  # LF (\n)
print("I'm drinking water!")  # LF (\n)

فایل پیکربندی:

[FORMAT]
expected-line-ending-format=LF

پیوندهای مرتبط:

ایجاد شده توسط بررسی‌کننده format https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/format.py..SS ungrouped-imports / C0412

پیام صادرشده:

وارد کردن‌ها از بسته‌ی %s گروه‌بندی نشده‌اند

توضیحات:

هنگامی استفاده می‌شود که وارد کردن‌ها بر اساس بسته‌ها گروه‌بندی نشده باشند.

کد دارای اشکال:

import logging
import os
import sys
import logging.config  # [ungrouped-imports]
from logging.handlers import WatchedFileHandler

کد درست:

import logging
import logging.config
import os
import sys
from logging.handlers import FileHandler

ایجادشده توسط بررسی‌کننده‌ی imports https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/imports.py.

پیام صادرشده:

عبارت لامبدا مستقیماً فراخوانی شده است. در عوض عبارت را به‌صورت درون‌خطی اجرا کنید.

توضیحات:

هنگامی استفاده می‌شود که یک عبارت لامبدا به جای اجرای محتوای آن به‌صورت درون‌خطی، مستقیماً فراخوانی شود.

کد دارای اشکال:

y = (lambda x: x**2 + 2 * x + 1)(a)  # [unnecessary-direct-lambda-call]

کد درست:

y = a**2 + 2 * a + 1

ایجادشده توسط بررسی‌کننده‌ی lambda-expressions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/lambda_expressions.py.

پیام صادرشده:

متد داندر %s به‌طور غیرضروری فراخوانی شده است. %s.

توضیحات:

هنگامی استفاده می‌شود که یک متد داندر به‌صورت دستی و به جای تابع/متد/عملگر متناظر فراخوانی شده باشد.

کد دارای اشکال:

three = (3.0).__str__()  # [unnecessary-dunder-call]
twelve = "1".__add__("2")  # [unnecessary-dunder-call]
def is_bigger_than_two(x):
    return x.__gt__(2)  # [unnecessary-dunder-call]

کد درست:

three = str(3.0)
twelve = "1" + "2"
def is_bigger_than_two(x):
    return x > 2

پیوندهای مرتبط:

•
متدهای داندر را تعریف کنید اما آن‌ها را مستقیماً فراخوانی نکنید https://www.pythonmorsels.com/avoid-dunder-methods

ایجادشده توسط بررسی‌کننده‌ی unnecessary-dunder-call https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/dunder_methods.py..SS unnecessary-lambda-assignment / C3001

پیام صادرشده:

عبارت لاندا به یک متغیر نسبت داده شده است. به‌جای آن یک تابع با استفاده از کلیدواژه "def" تعریف کنید.

توضیحات:

زمانی استفاده می‌شود که یک عبارت لاندا به‌جای تعریف یک تابع استاندارد با کلیدواژه "def"، به یک متغیر نسبت داده شود.

کد دارای اشکال:

foo = lambda x: x**2 + 2 * x + 1  # [unnecessary-lambda-assignment]

کد درست:

def foo(x):
    return x**2 + 2 * x + 1

ایجادشده توسط بررسی‌کننده lambda-expressions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/lambda_expressions.py.

پیام صادرشده:

تغییر دادن "%s" به "%s" را در نظر بگیرید

توضیحات:

زمانی استفاده می‌شود که یک عبارت بولی شامل یک نقیض غیرضروری باشد؛ برای نمونه هنگامی که دو عملگر نقیض اثر یکدیگر را خنثی می‌کنند.

کد دارای اشکال:

double_not.py:

if not not input():  # [unnecessary-negation]
    pass

equivalent_comparator_exists.py:

a = 3
b = 10
if not a > b:  # [unnecessary-negation]
    pass

کد درست:

double_not.py:

if input():
    pass

equivalent_comparator_exists.py:

a = 3
b = 10
if a <= b:
    pass

ایجادشده توسط بررسی‌کننده refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/not_checker.py..SS use-implicit-booleaness-not-comparison / C1803

پیام صادرشده:

"%s" می‌تواند به "%s" ساده‌سازی شود، در صورتی که دقیقاً یک دنباله باشد، زیرا یک %s خالی فالس‌گونه (falsey) است

توضیحات:

دنباله‌های خالی در یک زمینهٔ بولی (boolean context) نادرست (false) در نظر گرفته می‌شوند. پیروی کورکورانه از این بررسی در پایگاه‌های کدی با نوع‌بندی ضعیف (weakly typed)، می‌تواند اشکالاتی ایجاد کند که عیب‌یابی آن‌ها دشوار است. اگر مقدار بتواند چیز دیگری باشد که فالس‌گونه (falsey) است اما دنباله نیست (برای مثال ``None``، یک رشتهٔ خالی، یا ``0``)، کد معادل نخواهد بود.

کد دارای اشکال:

z = []
if z != []:  # [use-implicit-booleaness-not-comparison]
    print("z is not an empty sequence")

کد درست:

z = []
if z:
    print("z is not an empty sequence")

ایجادشده توسط بازبین refactoring در https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/implicit_booleaness_checker.py.

پیام صادرشده:

"%s" می‌تواند به "%s" ساده‌سازی شود، در صورتی که دقیقاً یک رشته باشد، زیرا یک رشتهٔ خالی فالس‌گونه (falsey) است

توضیحات:

رشته‌های خالی در یک زمینهٔ بولی (boolean context) نادرست (false) در نظر گرفته می‌شوند. پیروی کورکورانه از این بررسی در پایگاه‌های کدی با نوع‌بندی ضعیف (weakly typed)، می‌تواند اشکالاتی ایجاد کند که عیب‌یابی آن‌ها دشوار است. اگر مقدار بتواند چیز دیگری باشد که فالس‌گونه (falsey) است اما رشته نیست (برای مثال ``None``، یک دنبالهٔ خالی، یا ``0``)، کد معادل نخواهد بود.

هشدار:

این پیام به‌طور پیش‌فرض غیرفعال است. برای فعال‌کردن آن، use-implicit-booleaness-not-comparison-to-string را به گزینهٔ enable بیفزایید.

کد دارای اشکال:

def important_string_manipulation(x: str, y: str) -> None:
    if x == "":  # [use-implicit-booleaness-not-comparison-to-string]
        print("x is an empty string")
    if y != "":  # [use-implicit-booleaness-not-comparison-to-string]
        print("y is not an empty string")

کد درست:

def important_string_manipulation(x: str, y: str) -> None:
    if not x:
        print("x is an empty string")
    if y:
        print("y is not an empty string")

فایل پیکربندی:

[main]
enable=use-implicit-booleaness-not-comparison-to-string

ایجادشده توسط بازبین refactoring در https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/implicit_booleaness_checker.py..SS use-implicit-booleaness-not-comparison-to-zero / C1805

پیام صادرشده:

اگر مقدار دقیقاً از نوع int باشد، عبارت "%s" می‌تواند به "%s" ساده‌سازی شود، زیرا 0 مقداری کاذب (falsey) است

توضیحات:

در یک بافت بولی (boolean context)، مقدار 0 نادرست (false) در نظر گرفته می‌شود. پیروی کورکورانه از این بررسی در پایگاه‌های کدی با نوع‌بندی ضعیف (weakly typed)، می‌تواند اشکالاتی ایجاد کند که اشکال‌زدایی آن‌ها دشوار است. اگر مقدار متغیر بتواند چیزی غیر از int اما همچنان کاذب باشد (برای نمونه ``None``، یک رشته خالی، یا یک توالی خالی)، کد معادل نخواهد بود.

هشدار:

این پیام به‌طور پیش‌فرض غیرفعال است. برای فعال‌سازی آن، use-implicit-booleaness-not-comparison-to-zero را به گزینهٔ enable اضافه کنید.

کد دارای مشکل:

def important_math(x: int, y: int) -> None:
    if x == 0:  # [use-implicit-booleaness-not-comparison-to-zero]
        print("x is equal to zero")
    if y != 0:  # [use-implicit-booleaness-not-comparison-to-zero]
        print("y is not equal to zero")

کد صحیح:

def important_math(x: int, y: int) -> None:
    if not x:
        print("x is equal to zero")
    if y:
        print("y is not equal to zero")

فایل پیکربندی:

[main]
enable=use-implicit-booleaness-not-comparison-to-zero

ایجاد شده توسط بررسی‌کنندهٔ بازسازی (refactoring) https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/implicit_booleaness_checker.py.

پیام صادرشده:

برای تعیین خالی بودن یک توالی، از `len(SEQUENCE)` بدون مقایسه استفاده نکنید

توضیحات:

توالی‌های خالی در بافت بولی نادرست (false) در نظر گرفته می‌شوند. می‌توانید فراخوانی 'len' را حذف کنید (``if not x``) یا طول را با یک مقدار اسکالر مقایسه نمایید (``if len(x) > 1``).

کد دارای مشکل:

fruits = ["orange", "apple"]
if len(fruits):  # [use-implicit-booleaness-not-len]
    print(fruits)

کد صحیح:

fruits = ["orange", "apple"]
if fruits:
    print(fruits)

ایجاد شده توسط بررسی‌کنندهٔ بازسازی (refactoring) https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/implicit_booleaness_checker.py..SS use-maxsplit-arg / C0207

پیام صادرشده:

به جای آن از %s استفاده کنید

توضیحات:

زمانی صادر می‌شود که تنها به اولین یا آخرین عنصر ()str.split دسترسی پیدا شود. دسترسی به اولین و آخرین عنصر می‌تواند در عوض با استفاده از [0]str.split(sep, maxsplit=1) یا [-1]str.rsplit(sep, maxsplit=1) انجام گیرد.

کد دارای مشکل:

url = "www.example.com"
suffix = url.split(".")[-1]  # [use-maxsplit-arg]

کد درست:

url = "www.example.com"
suffix = url.rsplit(".", maxsplit=1)[-1]

جزئیات بیشتر:

توجه داشته باشید که بهبود کارایی حاصل از عدم تقسیم چندباره رشته، تنها در مواردی حاصل می‌شود که تعداد موارد نویسه جداکننده، بیشتر از این مثال کمینه باشد.

ایجاد شده توسط بازبین refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/recommendation_checker.py.

پیام صادرشده:

هنگام پیمایش روی مقادیر از یک نوع دنباله استفاده کنید

توضیحات:

هنگام پیمایش روی مقادیر، انواع دنباله (مانند ``lists``، ``tuples``، ``ranges``) کارآمدتر از ``sets`` هستند.

کد دارای مشکل:

for food in {"apples", "lemons", "water"}:  # [use-sequence-for-iteration]
    print(f"I like {food}.")

کد درست:

list.py:

for food in ["apples", "lemons", "water"]:
    print(f"I like {food}.")

tuple.py:

for food in ("apples", "lemons", "water"):
    print(f"I like {food}.")

جزئیات بیشتر:

https://gist.github.com/hofrob/8b1c1e205a0d4c66a680b1fe4bfeba11

این اسکریپت نمونه، افزایش چشمگیر کارایی را هنگام استفاده از list، tuple یا range به جای set در پایتون نسخه 3.11.1 نشان می‌دهد.

ایجاد شده توسط بازبین refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/recommendation_checker.py..SS useless-import-alias / C0414

پیام صادرشده:

نام مستعار واردسازی، بسته اصلی را تغییر نام نمی‌دهد

توضیحات:

زمانی استفاده می‌شود که نام مستعار واردسازی با بسته اصلی یکسان باشد؛ مانند استفاده از import numpy as numpy به جای import numpy as np.

کد دارای مشکل:

import pandas as pandas  # [useless-import-alias]

کد صحیح:

import pandas as pd

جزئیات بیشتر:

اگر ترجیح می‌دهید برای بازصادر کردن صریح در API به جای استفاده از __all__ از "from-as" (from fruit import orange as orange) استفاده کنید، این پیام یک مثبت کاذب (false positive) خواهد بود.

از --allow-reexport-from-package برای مجاز کردن بازصادر کردن‌های صریح با نام مستعار در فایل‌های __init__ بسته استفاده کنید.

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کننده imports https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/imports.py.

پیام صادرشده:

%s باید پیش از %s قرار گیرد

توضیحات:

زمانی استفاده می‌شود که ترتیب واردسازی PEP8 رعایت نشده باشد (ابتدا واردسازی‌های استاندارد، سپس کتابخانه‌های شخص ثالث و در نهایت واردسازی‌های محلی).

کد دارای مشکل:

import os
from . import utils
import pylint  # [wrong-import-order]
import sys  # [wrong-import-order]

کد صحیح:

import os
import sys
import pylint
from . import utils

ایجادشده توسط بررسی‌کننده imports https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/imports.py..SS wrong-import-position / C0413

پیام صادرشده:

واردسازی "%s" باید در ابتدای ماژول قرار گیرد

توضیحات:

زمانی استفاده می‌شود که کد و دستورهای واردسازی (import) با یکدیگر آمیخته شده باشند.

کد دارای مشکل:

import os
home = os.environ["HOME"]
import sys  # [wrong-import-position]
print(f"Home directory is {home}", file=sys.stderr)

کد درست:

import os
import sys
home = os.environ["HOME"]
print(f"Home directory is {home}", file=sys.stderr)

ایجادشده توسط بررسی‌کنندهٔ imports https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/imports.py.

پیام صادرشده:

املای نادرست واژهٔ '%s' در یک کامنت: %s %s آیا منظور شما: '%s' بود؟

توضیحات:

زمانی استفاده می‌شود که املای واژه‌ای در کامنت نادرست باشد.

کد دارای مشکل:

# There's a mistkae in this string  # [wrong-spelling-in-comment]

کد درست:

# There's no mistake in this string

فایل پیکربندی:

[main]
# This might not run in your env if you don't have the en_US dict installed.
spelling-dict=en_US

ایجادشده توسط بررسی‌کنندهٔ spelling https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/spelling.py..SS wrong-spelling-in-docstring / C0402

پیام صادرشده:

املای نادرست واژه '%s' در docstring: %s %s آیا منظور شما '%s' بود؟

توضیحات:

زمانی استفاده می‌شود که املای یک واژه در docstring نادرست باشد.

کد مشکل‌دار:

"""There's a mistkae in this string"""  # [wrong-spelling-in-docstring]

کد درست:

"""There's no mistake in this string"""

فایل پیکربندی:

[main]
# This might not run in your env if you don't have the en_US dict installed.
spelling-dict=en_US

ایجادشده توسط بررسی‌کننده spelling https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/spelling.py.

تمام پیام‌های تغییرنام‌یافته در دسته‌بندی convention:

'blacklisted-name' تغییر نام یافته است. پیام جدید را می‌توان در اینجا یافت:

'compare-to-empty-string' تغییر نام یافته است. پیام جدید را می‌توان در اینجا یافت:

'compare-to-zero' تغییر نام یافته است. پیام جدید را می‌توان در اینجا یافت:

'len-as-condition' تغییر نام یافته است. پیام جدید را می‌توان در اینجا یافت:

'missing-docstring' تغییر نام یافته است. پیام جدید را می‌توان در اینجا یافت:

'old-misplaced-comparison-constant' تغییر نام یافته است. پیام جدید را می‌توان در اینجا یافت:

'old-non-ascii-name' تغییر نام یافته است. پیام جدید را می‌توان در اینجا یافت:

'unneeded-not' تغییر نام یافته است. پیام جدید را می‌توان در اینجا یافت:

تمام پیام‌های دسته‌بندی بازآرایی (refactor):

پیام صادرشده:

ساده‌سازی مقایسه زنجیره‌ای میان عملوندها

توضیحات:

این پیام زمانی صادر می‌شود که pylint با عملیاتی بولی مانند "a < b and b < c" مواجه شود و پیشنهاد می‌دهد که در عوض آن را به "a < b < c" بازآرایی کنید.

کد مشکل‌دار:

a = int(input())
b = int(input())
c = int(input())
if a < b and b < c:  # [chained-comparison]
    pass

کد درست:

a = int(input())
b = int(input())
c = int(input())
if a < b < c:
    pass

ایجادشده توسط بررسی‌کننده refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py..SS comparison-of-constants / R0133

پیام صادرشده:

مقایسه بین مقادیر ثابت: "%s %s %s" دارای یک مقدار ثابت است

توضیحات:

هنگامی که دو لیترال با یکدیگر مقایسه می‌شوند، نتیجه یک مقدار ثابت است. استفادهٔ مستقیم از مقدار ثابت، هم خواناتر است و هم کارایی بالاتری دارد. مقداردهی اولیهٔ 'True' و 'False' به این شیوه، از Python 2.3 به بعد دیگر لازم نیست.

کد دارای مشکل:

def is_the_answer() -> bool:
    return 42 == 42  # [comparison-of-constants]

کد درست:

def is_the_answer(meaning_of_life: int) -> bool:
    return meaning_of_life == 42

ایجادشده توسط بررسی‌کنندهٔ basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/comparison_checker.py.

پیام صادرشده:

مقایسهٔ زائد - %s

توضیحات:

هنگامی استفاده می‌شود که چیزی با خودش مقایسه شود.

کد دارای مشکل:

def is_an_orange(fruit):
    an_orange = "orange"
    return fruit == fruit  # [comparison-with-itself]

کد درست:

def is_an_orange(fruit):
    an_orange = "orange"
    return an_orange == fruit

ایجادشده توسط بررسی‌کنندهٔ basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/comparison_checker.py.

پیام صادرشده:

شرط بولی '%s' همواره به '%s' ارزیابی خواهد شد

توضیحات:

هنگامی صادر می‌شود که بتوان یک شرط بولی را به یک مقدار ثابت ساده کرد.

کد دارای مشکل:

def is_a_fruit(fruit):
    return bool(fruit in {"apple", "orange"} or True)  # [condition-evals-to-constant]

کد درست:

def is_a_fruit(fruit):
    return fruit in {"apple", "orange"}

ایجادشده توسط بررسی‌کنندهٔ refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py..SS confusing-consecutive-elif / R5601

پیام صادرشده:

elif متوالی با سطح تورفتگی متفاوت؛ برای جداسازی elif درونی، ایجاد یک تابع را در نظر بگیرید

توضیحات:

زمانی استفاده می‌شود که یک عبارت elif بلافاصله پس از یک بلوک دارای تورفتگی قرار می‌گیرد که خود با if یا elif پایان یافته است. ممکن است مشخص نباشد که آیا کاهش تورفتگی عبارت elif عمداً انجام شده یا بر اثر اشتباه بوده است. استخراج عبارت if دارای تورفتگی در یک تابع جداگانه می‌تواند از سردرگمی جلوگیری کرده و مانع از بروز خطا شود.

کد دارای اشکال:

def myfunc(shall_continue: bool, shall_exit: bool):
    if shall_continue:
        if input("Are you sure?") == "y":
            print("Moving on.")
    elif shall_exit:  # [confusing-consecutive-elif]
        print("Exiting.")

کد درست:

# Option 1: add explicit 'else'
def myfunc(shall_continue: bool, shall_exit: bool):
    if shall_continue:
        if input("Are you sure?") == "y":
            print("Moving on.")
        else:
            pass
    elif shall_exit:
        print("Exiting.")
# Option 2: extract function
def user_confirmation():
    if input("Are you sure?") == "y":
        print("Moving on.")
def myfunc2(shall_continue: bool, shall_exit: bool):
    if shall_continue:
        user_confirmation()
    elif shall_exit:
        print("Exiting.")

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.confusing_elif

جزئیات تکمیلی:

ایجاد یک تابع برای عبارت شرطی تودرتو، یا افزودن یک else صریح در عبارت if دارای تورفتگی، حتی اگر تنها شامل یک دستور pass باشد، می‌تواند به خوانایی و شفافیت کد کمک کند.

نکته:

این پیام توسط بازبین اختیاری 'confusing_elif' <#pylint-extensions-confusing-elif> صادر می‌شود که نیازمند بارگذاری افزونهٔ pylint.extensions.confusing_elif است.

ایجادشده توسط بازبین confusing_elif https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/confusing_elif.py..SS consider-alternative-union-syntax / R6003

پیام صادرشده:

استفاده از نحو جایگزین union به جای '%s'%s را در نظر بگیرید

توضیحات:

زمانی صادر می‌شود که ``typing.Union`` یا ``typing.Optional`` به جای نحو کوتاه union استفاده شود. برای مثال، ``Union[int, float]`` به جای ``int | float``. استفاده از نحو کوتاه برای union با توصیه‌های نوع‌گذاری (typing) پایتون هم‌خوانی دارد، نیاز به importها را برطرف می‌کند و از سردرگمی در امضای توابع جلوگیری می‌نماید.

کد دارای اشکال:

from typing import Optional, Union
def forecast(
    temp: Union[int, float],  # [consider-alternative-union-syntax]
    unit: Optional[str],  # [consider-alternative-union-syntax]
) -> None:
    print(f'Temperature: {temp}{unit or ""}')

کد درست:

def forecast(temp: int | float, unit: str | None) -> None:
    print(f'Temperature: {temp}{unit or ""}')

فایل پیکربندی:

[MAIN]
load-plugins = pylint.extensions.typing

جزئیات تکمیلی:

استفاده از نحو کوتاه برای انواع union نسبت به ماژول typing توصیه می‌شود https://docs.python.org/3/library/typing.html#typing.Union. این موضوع با توصیهٔ گسترده‌تر مبنی بر ترجیح انواع توکار (built-in) نسبت به importها هم‌خوانی دارد (به عنوان مثال، استفاده از list به جای typing.List که اکنون منسوخ شده است).

همچنین typing.Optional می‌تواند در آرگومان‌های نشانه‌گذاری‌شدهٔ توابع باعث سردرگمی شود، زیرا آرگومانی که به عنوان Optional نشانه‌گذاری شده، در صورتی که مقدار پیش‌فرضی برای آن تعیین نشده باشد همچنان یک آرگومان اجباری (required) است. نشانه‌گذاری صریح چنین آرگومان‌هایی با type | None قصد و نیت کد را کاملاً شفاف می‌سازد.

نکته:

این پیام توسط بررسی‌کنندهٔ اختیاری 'typing' <#pylint-extensions-typing> صادر می‌شود که نیازمند بارگذاری افزونهٔ pylint.extensions.typing است.

ایجاد شده توسط بررسی‌کنندهٔ typing https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/typing.py.

پیام صادرشده:

استفاده از %smath.%s به جای %s را در نظر بگیرید

توضیحات:

استفاده از math.inf یا math.nan امکان بهره‌مندی از سیستم نوع‌گذاری (typing) را فراهم می‌کند و تا ۴ برابر سریع‌تر از فراخوانی float است (پس از import اولیهٔ math). این بررسی همچنین به عنوان یک اثر جانبی، غلط‌های املایی در فراخوانی‌های float را شناسایی می‌کند.

کد دارای اشکال:

swag = float("inf")  # [consider-math-not-float]

کد درست:

import math
swag = math.inf

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.code_style

جزئیات تکمیلی:

این یک بررسی افزونه‌ای (extension check) است زیرا مزیت نوع‌گذاری (typing) ممکن است برطرف شود.

از لحاظ کارایی، float("nan") و float("inf") پس از import اولیهٔ math، به ضریب ۴ برابر کندتر از همتایان خود یعنی math.inf و math.nan هستند.

import math
import timeit
time_math_inf = timeit.timeit('math.nan', globals=globals(), number=10**8)
print(f'math.nan: {time_math_inf:.2f} seconds')
import timeit
time_inf_str = timeit.timeit('float("nan")', number=10**8)
print(f'float("nan"): {time_inf_str:.2f} seconds')

نتیجه:

math.nan: 1.24 seconds
float("nan"): 5.15 seconds

اما اگر import اولیه را به حساب آوریم، وضعیت بدتر است.

import timeit
time_math_inf = timeit.timeit('import math;math.nan', globals=globals(), number=10**8)
print(f'math.nan: {time_math_inf:.2f} seconds')
import timeit
time_inf_str = timeit.timeit('float("nan")', number=10**8)
print(f'float("nan"): {time_inf_str:.2f} seconds')

نتیجه:

math.nan: 9.08 seconds
float("nan"): 5.33 seconds

بنابراین تصمیم‌گیری به این بستگی دارد که چگونه و با چه بسامدی نیاز به استفاده از آن دارید و چه چیزی برای شما اهمیت دارد.

نکته:

این پیام توسط بررسی‌کنندهٔ اختیاری 'code_style' <#pylint-extensions-code-style> صادر می‌شود که نیازمند بارگذاری افزونهٔ pylint.extensions.code_style است.
ایجادشده توسط بررسی‌کننده code_style https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/code_style.py.

پیام صادرشده:

ادغام این فراخوانی‌های isinstance در isinstance(%s, (%s)) را در نظر بگیرید

توضیحات:

زمانی استفاده می‌شود که بتوان چندین فراخوانی متوالی isinstance را در یکی ادغام کرد.

کد مشکل‌دار:

from typing import Any
def is_number(value: Any) -> bool:
    # +1: [consider-merging-isinstance]
    return isinstance(value, int) or isinstance(value, float)

کد درست:

from typing import Any
def is_number(value: Any) -> bool:
    return isinstance(value, (int, float))

ایجادشده توسط بررسی‌کننده refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

استفاده از 'while %s' را به جای 'while %s:'، یک 'if' و یک 'break' در نظر بگیرید

توضیحات:

زمانی صادر می‌شود که یک حلقه `while True:` استفاده شده باشد و نخستین دستور یک شرط break باشد. اگر شرط معکوس شده و به دستور ``while`` منتقل شود، ساختار ``if / break`` می‌تواند حذف شود.

کد مشکل‌دار:

fruit_basket = ["apple", "orange", "banana", "cherry", "guava"]
while True:  # [consider-refactoring-into-while-condition]
    if len(fruit_basket) == 0:
        break
    fruit = fruit_basket.pop()
    print(f"We removed {fruit} from the basket")

کد درست:

fruit_basket = ["apple", "orange", "banana", "cherry", "guava"]
while len(fruit_basket) != 0:
    fruit = fruit_basket.pop()
    print(f"We removed {fruit} from the basket")

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.consider_refactoring_into_while_condition

نکته:

این پیام توسط بررسی‌کننده اختیاری 'consider_refactoring_into_while' <#pylint-extensions-consider-refactoring-into-while-condition> صادر می‌شود که نیازمند بارگذاری افزونه pylint.extensions.consider_refactoring_into_while_condition است.

ایجادشده توسط بررسی‌کننده consider_refactoring_into_while https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/consider_refactoring_into_while_condition.py..SS consider-swap-variables / R1712

پیام صادرشده:

استفاده از tuple unpacking را برای جابه‌جایی متغیرها در نظر بگیرید

توضیحات:

برای جابه‌جا کردن متغیرها نیازی به استفاده از یک متغیر موقت ندارید. استفاده از "tuple unpacking" برای جابه‌جایی مستقیم متغیرها، هدف را واضح‌تر می‌کند.

کد دارای مشکل:

a = 1
b = 2
temp = a  # [consider-swap-variables]
a = b
b = temp

کد درست:

a = 1
b = 2
a, b = b, a

ایجاد شده توسط بررسی‌کننده refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

'%s' در PY39 منسوخ خواهد شد، استفاده از '%s' را به‌جای آن در نظر بگیرید%s

توضیحات:

تنها در صورتی صادر می‌شود که 'runtime-typing=no' باشد و یک alias منسوخ‌شدهٔ typing در بستر type annotation در Python 3.7 یا 3.8 استفاده شده باشد.

کد دارای مشکل:

import typing
cats: typing.Dict[str, int]  # [consider-using-alias]

کد درست:

import typing
cats: typing.cast(dict[str, int], "string")

فایل پیکربندی:

[main]
load-plugins = pylint.extensions.typing
py-version = 3.7
runtime-typing=no

نکته:

این پیام توسط بررسی‌کننده اختیاری 'typing' <#pylint-extensions-typing> صادر می‌شود که نیازمند بارگذاری افزونه pylint.extensions.typing است.

ایجاد شده توسط بررسی‌کننده typing https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/typing.py..SS consider-using-assignment-expr / R6103

پیام صادرشده:

به جای آن از '%s' استفاده کنید

توضیحات:

زمانی صادر می‌شود که یک انتساب بلافاصله پیش از یک دستور if قرار گیرد و هر دو بتوانند با استفاده از یک عبارت انتساب ``:=`` با یکدیگر ترکیب شوند. نیازمند Python 3.8 و ``py-version >= 3.8`` است.

کد دارای اشکال:

apples = 2
if apples:  # [consider-using-assignment-expr]
    print("God apples!")

کد صحیح:

if apples := 2:
    print("God apples!")

فایل پیکربندی:

[MAIN]
py-version=3.8
load-plugins=pylint.extensions.code_style

نکته:

این پیام توسط بازبین اختیاری 'code_style' <#pylint-extensions-code-style> صادر می‌شود، که نیازمند بارگذاری افزونه pylint.extensions.code_style است.

ایجادشده توسط بازبین code_style https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/code_style.py.

پیام صادرشده:

برای انجام مستقیم یک انتساب افزوده از '%s' استفاده کنید

توضیحات:

زمانی صادر می‌شود که یک انتساب به همان شیئی ارجاع می‌دهد که در حال انتساب مقدار به آن است. این مورد می‌تواند به یک انتساب افزوده تبدیل شود. به‌طور پیش‌فرض غیرفعال است!

هشدار:

این پیام به‌طور پیش‌فرض غیرفعال است. برای فعال‌سازی آن، consider-using-augmented-assign را به گزینه enable بیفزایید.

کد دارای اشکال:

x = 1
x = x + 1  # [consider-using-augmented-assign]

کد صحیح:

x = 1
x += 1

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.code_style
enable=consider-using-augmented-assign

نکته:

این پیام توسط بازبین اختیاری 'code_style' <#pylint-extensions-code-style> صادر می‌شود، که نیازمند بارگذاری افزونه pylint.extensions.code_style است.

ایجادشده توسط بازبین code_style https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/code_style.py..SS consider-using-dict-comprehension / R1717

پیام صادرشده:

استفاده از یک dictionary comprehension را در نظر بگیرید

توضیحات:

هنگامی صادر می‌شود که ساخت یک دیکشنری با استفاده از فراخوان‌پذیر dict() و یک لیست گذرا تشخیص داده شود. اگرچه این کد از نظر نحوی مشکلی ندارد، اما خوانایی پایینی دارد و می‌توان آن را به یک dict comprehension ساده‌تر تبدیل کرد. همچنین سریع‌تر است، زیرا نیازی به ایجاد یک لیست گذرای دیگر ندارید.

کد مشکل‌دار:

NUMBERS = [1, 2, 3]
# +1: [consider-using-dict-comprehension]
DOUBLED_NUMBERS = dict([(number, number * 2) for number in NUMBERS])

کد صحیح:

NUMBERS = [1, 2, 3]
DOUBLED_NUMBERS = {number: number * 2 for number in NUMBERS}

جزئیات بیشتر:

ابزار pyupgrade https://github.com/asottile/pyupgrade یا ruff https://docs.astral.sh/ruff می‌توانند این مورد را به‌طور خودکار رفع کنند.

ایجادشده توسط بررسی‌کنندهٔ refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

به‌جای آن از 'from %s import %s' استفاده کنید

توضیحات:

هنگامی صادر می‌شود که یک زیرماژول از یک بسته وارد (import) شده و با همان نام، نام مستعار (alias) بگیرد؛ برای نمونه، به‌جای ``import concurrent.futures as futures`` از ``from concurrent import futures`` استفاده کنید.

کد مشکل‌دار:

import os.path as path  # [consider-using-from-import]

کد صحیح:

from os import path

ایجادشده توسط بررسی‌کنندهٔ imports https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/imports.py.

پیام صادرشده:

به‌جای '%s(%s)'، استفاده از یک generator را در نظر بگیرید

توضیحات:

اگر کانتینر شما می‌تواند بزرگ باشد، استفاده از یک generator کارایی بهتری به همراه خواهد داشت.

کد مشکل‌دار:

list([0 for y in list(range(10))])  # [consider-using-generator]
tuple([0 for y in list(range(10))])  # [consider-using-generator]
sum([y**2 for y in list(range(10))])  # [consider-using-generator]
max([y**2 for y in list(range(10))])  # [consider-using-generator]
min([y**2 for y in list(range(10))])  # [consider-using-generator]

کد صحیح:

list(0 for y in list(range(10)))
tuple(0 for y in list(range(10)))
sum(y**2 for y in list(range(10)))
max(y**2 for y in list(range(10)))
min(y**2 for y in list(range(10)))

جزئیات بیشتر:

حذف [] در داخل فراخوانی‌هایی که می‌توانند از کانتینرها یا مولدها (generators) استفاده کنند باید به دلایل کارایی مد نظر قرار گیرد، چرا که یک generator هزینهٔ اولیه‌ای خواهد داشت. اگر با لیست‌ها یا مجموعه‌های بزرگ کار می‌کنید، کارایی بهتر خواهد بود.

برای max، min و sum، استفاده از یک generator توسط pep289 نیز توصیه شده است.

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کنندهٔ refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py..SS consider-using-get / R1715

پیام صادرشده:

استفاده از dict.get را برای دریافت مقادیر از یک dict در صورت وجود کلید یا مقدار پیش‌فرض در غیر این صورت در نظر بگیرید

توضیحات:

استفاده از متد توکار dict.get برای دریافت یک مقدار از دیکشنری در صورت وجود کلید یا مقدار پیش‌فرض در صورت عدم وجود آن، ساده‌تر بوده و استانداردتر (idiomatic) در نظر گرفته می‌شود، اگرچه گاهی اوقات کمی کندتر است

کد مشکل‌دار:

knights = {"Gallahad": "the pure", "Robin": "the brave"}
if "Gallahad" in knights:  # [consider-using-get]
    DESCRIPTION = knights["Gallahad"]
else:
    DESCRIPTION = ""

کد درست:

knights = {"Gallahad": "the pure", "Robin": "the brave"}
description = knights.get("Gallahad", "")

ایجاد شده توسط بررسی‌کننده بازآفرینی (refactoring) https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

ادغام این مقایسه‌ها با 'in' با استفاده از '%s %sin (%s)' را در نظر بگیرید. در صورتی که عناصر قابل درهم‌سازی (hashable) هستند، به‌جای آن از یک set استفاده کنید.

توضیحات:

برای بررسی اینکه آیا یک متغیر با یکی از چندین مقدار برابر است یا خیر، مقادیر را در یک set یا tuple ترکیب کرده و به‌جای بررسی برابری با تک‌تک مقادیر، بررسی کنید که آیا متغیر "in" آن قرار دارد یا خیر. این کار سریع‌تر بوده و پرگویی کمتری دارد.

کد مشکل‌دار:

def fruit_is_round(fruit):
    # +1: [consider-using-in]
    return fruit == "apple" or fruit == "orange" or fruit == "melon"

کد درست:

def fruit_is_round(fruit):
    return fruit in {"apple", "orange", "melon"}

ایجاد شده توسط بررسی‌کننده بازآفرینی (refactoring) https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

استفاده از str.join(sequence) را برای پیوند دادن رشته‌ها از یک شیء تکرارپذیر (iterable) در نظر بگیرید

توضیحات:

استفاده از str.join(sequence) در مقایسه با پیمایش با حلقه for، سریع‌تر است، حافظه کمتری مصرف می‌کند و خوانایی را افزایش می‌دهد.

کد مشکل‌دار:

def fruits_to_string(fruits):
    formatted_fruit = ""
    for fruit in fruits:
        formatted_fruit += fruit  # [consider-using-join]
    return formatted_fruit
print(fruits_to_string(["apple", "pear", "peach"]))

کد درست:

print("".join(["apple", "pear", "peach"]))

ایجاد شده توسط بررسی‌کننده بازآفرینی (refactoring) https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py..SS consider-using-max-builtin / R1731

پیام صادرشده:

استفاده از '%s' به جای بلوک if غیرضروری را در نظر بگیرید

توضیحات:

استفاده از تابع توکار max به جای عبارت شرطی، خوانایی و ایجاز کد را بهبود می‌بخشد.

کد دارای اشکال:

def get_max(value1, value2):
    if value1 < value2:  # [consider-using-max-builtin]
        value1 = value2
    return value1
print(get_max(1, 2))

کد درست:

print(max(1, 2))

ایجادشده توسط بازبین refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

استفاده از '%s' به جای بلوک if غیرضروری را در نظر بگیرید

توضیحات:

استفاده از تابع توکار min به جای عبارت شرطی، خوانایی و ایجاز کد را بهبود می‌بخشد.

کد دارای اشکال:

def get_min(value1, value2):
    if value1 > value2:  # [consider-using-min-builtin]
        value1 = value2
    return value1
print(get_min(1, 2))

کد درست:

print(min(1, 2))

ایجادشده توسط بازبین refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

استفاده از namedtuple یا dataclass را برای مقادیر دیکشنری در نظر بگیرید

توضیحات:

هنگامی صادر می‌شود که بتوان مقادیر دیکشنری را با نمونه‌هایی از namedtuple یا dataclass جایگزین کرد.

کد دارای اشکال:

FELIDAES = {  # [consider-using-namedtuple-or-dataclass]
    "The queen's cymric, fragile furry friend": {
        "tail_length_cm": 1,
        "paws": 4,
        "eyes": 2,
        "Elizabethan collar": 1,
    },
    "Rackat the red, terror of the sea": {
        "tail_length_cm": 13,
        "paws": 3,
        "eyes": 1,
        "Red Hat": 1,
    },
}

کد درست:

from typing import NamedTuple
class FelidaeCharacteristics(NamedTuple):
    tail_length_cm: int
    paws: int
    eyes: int
    hat: str | None
FELIDAES = {
    "The queen's cymric, fragile furry friend": FelidaeCharacteristics(
        tail_length_cm=1, paws=4, eyes=2, hat="Elizabethan collar"
    ),
    "Rackat the red, terror of the sea": FelidaeCharacteristics(
        tail_length_cm=21, paws=3, eyes=1, hat="Red Hat"
    ),
}

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.code_style

نکته:

این پیام توسط بازبین اختیاری 'code_style' <#pylint-extensions-code-style> صادر می‌شود، که نیازمند بارگذاری افزونه pylint.extensions.code_style است.

ایجادشده توسط بازبین code_style https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/code_style.py..SS consider-using-set-comprehension / R1718

پیام صادرشده:

استفاده از set comprehension را در نظر بگیرید

توضیحات:

اگرچه این کد از نظر نحوی هیچ ایرادی ندارد، اما خوانایی پایینی دارد و می‌توان آن را به یک set comprehension ساده کرد. همچنین به دلیل عدم نیاز به ایجاد یک لیست موقت دیگر، سریع‌تر است.

کد دارای مشکل:

NUMBERS = [1, 2, 2, 3, 4, 4]
# +1: [consider-using-set-comprehension]
UNIQUE_EVEN_NUMBERS = set([number for number in NUMBERS if number % 2 == 0])

کد صحیح:

NUMBERS = [1, 2, 2, 3, 4, 4]
UNIQUE_EVEN_NUMBERS = {number for number in NUMBERS if number % 2 == 0}

جزئیات تکمیلی:

ابزارهای pyupgrade https://github.com/asottile/pyupgrade یا ruff https://docs.astral.sh/ruff می‌توانند این مورد را به‌صورت خودکار برطرف کنند.

ایجاد شده توسط بررسی‌کننده refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

به‌جای آن استفاده از 'sys.exit' را در نظر بگیرید

توضیحات:

برخلاف 'exit()' یا 'quit()'، دستور 'sys.exit' وابسته به در دسترس بودن ماژول site نیست (زیرا ماژول 'sys' همواره در دسترس است).

کد دارای مشکل:

if __name__ == "__main__":
    user = input("Enter user name: ")
    print(f"Hello, {user}")
    exit(0)  # [consider-using-sys-exit]

کد صحیح:

import sys
if __name__ == "__main__":
    user = input("Enter user name: ")
    print(f"Hello, {user}")
    sys.exit(0)

ایجاد شده توسط بررسی‌کننده refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py..SS consider-using-ternary / R1706

پیام صادرشده:

استفاده از عملگر سه‌تایی (%s) را در نظر بگیرید

توضیحات:

زمانی استفاده می‌شود که یکی از نحوهای سه‌تایی شناخته‌شدهٔ پیش از Python 2.5 به کار رفته باشد.

کد مشکل‌دار:

x, y = 1, 2
maximum = x >= y and x or y  # [consider-using-ternary]

کد درست:

x, y = 1, 2
maximum = x if x >= y else y

ایجادشده توسط بررسی‌کنندهٔ refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

استفاده از تاپل درجا به‌جای لیست را در نظر بگیرید

توضیحات:

صرفاً جهت یک‌دستی سبک نگارش! زمانی صادر می‌شود که یک ``list`` تعریف‌شده به‌صورت درجا بتواند با یک ``tuple`` جایگزین شود. به دلیل بهینه‌سازی‌های انجام‌شده توسط CPython، این کار هیچ بهبود عملکردی به همراه ندارد.

کد مشکل‌دار:

for i in [1, 2, 3]:  # [consider-using-tuple]
    print(i)

کد درست:

for i in (1, 2, 3):
    print(i)

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.code_style

نکته:

این پیام توسط بررسی‌کنندهٔ اختیاری 'code_style' <#pylint-extensions-code-style> صادر می‌شود که نیازمند بارگذاری افزونهٔ pylint.extensions.code_style است.

ایجادشده توسط بررسی‌کنندهٔ code_style https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/code_style.py..SS consider-using-with / R1732

پیام صادرشده:

استفاده از 'with' را برای عملیات‌های تخصیص منابع در نظر بگیرید

توضیحات:

زمانی صادر می‌شود که یک انتساب یا فراخوانی تخصیص‌دهندهٔ منابع بتواند با یک بلوک 'with' جایگزین شود. با استفاده از 'with'، آزادسازی منابع تخصیص‌یافته حتی در صورت بروز استثنا تضمین می‌شود.

کد دارای اشکال:

close.py:

file = open("apple.txt", "r", encoding="utf8")  # [consider-using-with]
contents = file.read()
file.close()

not_even_close.py:

contents = open("apple.txt", "r", encoding="utf8").read()  # [consider-using-with]

کد صحیح:

with open("apple.txt", "r", encoding="utf8") as file:
    contents = file.read()

جزئیات تکمیلی:

فراخوانی write() بدون استفاده از کلمهٔ کلیدی with یا فراخوانی close() ممکن است باعث شود آرگومان‌های write() به‌طور کامل روی دیسک نوشته نشوند، حتی اگر برنامه با موفقیت پایان یابد.

این پیام برای فراخوانی‌پذیرهای stdlib پایتون که می‌توانند با یک دستور with جایگزین شوند، اعمال می‌شود. در موارد زیر از صدور آن صرف‌نظر می‌شود:

  • فراخوانی درون یک مدیر زمینه (context manager) قرار داشته باشد
  • نتیجهٔ فراخوانی از تابع دربرگیرنده بازگردانده شود
  • نتیجهٔ فراخوانی خودش در یک دستور with استفاده شود

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کنندهٔ refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

درون‌ریزی چرخه‌ای (%s)

توضیحات:

زمانی استفاده می‌شود که یک درون‌ریزی چرخه‌ای بین دو یا چند ماژول شناسایی شود.

کد دارای اشکال:

__init__.py:

bad.py:

def count_to_one():
    return 1
def count_to_three():
    from .bad2 import count_to_two
    return count_to_two() + 1

bad2.py:

from .bad import count_to_one  # [cyclic-import]
def count_to_two():
    return count_to_one() + 1

کد صحیح:

def count_to_one():
    return 1
def count_to_two():
    return count_to_one() + 1
def count_to_three():
    return count_to_two() + 1

جزئیات تکمیلی:

کد صحیح صرفاً یک مثال است. راهبردهای گوناگونی برای برطرف کردن درون‌ریزی‌های چرخه‌ای وجود دارد و بهترین انتخاب تا حد زیادی به زمینهٔ کد و ماژول‌های متأثر بستگی دارد.

ایجادشده توسط بررسی‌کنندهٔ imports https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/imports.py..SS duplicate-code / R0801

پیام صادرشده:

خطوط مشابه در %s فایل %s

توضیحات:

نشان می‌دهد که مجموعه‌ای از خطوط مشابه میان چندین فایل شناسایی شده است. این معمولاً بدین معناست که برای جلوگیری از این تکرار، کد باید بازآرایی (refactor) شود.

کد دارای مشکل:

__init__.py:

apple.py:

class Apple:
    def __init__(self):
        self.remaining_bites = 3
    def take_bite(self):
        if self.remaining_bites > 0:
            print("You take a bite of the apple.")
            self.remaining_bites -= 1
        else:
            print("The apple is already eaten up!")
    def eaten_by_animal(self, animal):
        self.remaining_bites = 0
        print("The apple has been eaten by an animal.")

orange.py:

class Orange:  # [duplicate-code]
    def __init__(self):
        self.remaining_bites = 3
    def take_bite(self):
        if self.remaining_bites > 0:
            print("You take a bite of the apple.")
            self.remaining_bites -= 1
        else:
            print("The orange is already eaten up!")
    def eaten_by_animal(self, animal):
        if animal == "cat":
            raise ValueError("A cat would never do that !")
        self.remaining_bites = 0
        print("The orange has been eaten by an animal.")

کد صحیح:

__init__.py:

apple.py:

from fruit import Fruit
class Apple(Fruit): ...

fruit.py:

class Fruit:
    def __init__(self):
        self.remaining_bites = 3
    def take_bite(self):
        if self.remaining_bites > 0:
            print(f"You take a bite of the {self.__class__.__name__.lower()}.")
            self.remaining_bites -= 1
        else:
            print(f"The {self.__class__.__name__.lower()} is already eaten up!")
    def eaten_by_animal(self, animal):
        self.remaining_bites = 0
        print(f"The {self.__class__.__name__.lower()} has been eaten by an animal.")

orange.py:

from fruit import Fruit
class Orange(Fruit):
    def eaten_by_animal(self, animal):
        if animal == "cat":
            raise ValueError("A cat would never do that !")
        super().eaten_by_animal(animal)

جزئیات بیشتر:

اگر نیاز به اعمال تغییر در منطق یا عملکرد کد تکراری داشته باشید، باید تمام بخش‌هایی را که نیاز به تغییر دارند شناسایی کنید که این کار می‌تواند زمان‌بر و مستعد خطا باشد. اگر چندین رونوشت از یک کد یکسان وجود داشته باشد، باید هر نسخه را نیز آزمایش کنید تا مطمئن شوید عملکرد آن درست است. کد تکراری می‌تواند برای کسی که در تلاش برای درک منطق و جریان کد است گیج‌کننده باشد، به‌ویژه اگر با چندین بلوک کد یکسان یا تقریباً یکسان مواجه شود. در این حالت خواننده ممکن است کد را به‌صورت گذرا مرور کند و تصور کند همه‌چیز یکسان است، در حالی که در واقعیت چنین نیست. این موضوع به‌ویژه در زمان بازبینی کد رخ می‌دهد.

تولیدشده توسط بررسی‌کنندهٔ similarities https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/symilar.py..SS else-if-used / R5501

پیام صادرشده:

استفاده از "elif" را به‌جای "else" و سپس "if" برای حذف یک سطح تورفتگی در نظر بگیرید

توضیحات:

زمانی استفاده می‌شود که یک عبارت else بلافاصله با یک عبارت if دنبال شده باشد و شامل عبارت‌های غیرمرتبط با آن نباشد.

کد دارای اشکال:

if input():
    pass
else:
    if len(input()) >= 10:  # [else-if-used]
        pass
    else:
        pass

کد درست:

if input():
    pass
elif len(input()) >= 10:
    pass
else:
    pass

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.check_elif

نکته:

این پیام توسط بررسی‌کننده اختیاری 'else_if_used' <#pylint-extensions-check-elif> صادر می‌شود، که نیازمند بارگذاری افزونه pylint.extensions.check_elif است.

ایجادشده توسط بررسی‌کننده else_if_used https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/check_elif.py.

پیام صادرشده:

خط دارای کامنت خالی

توضیحات:

زمانی استفاده می‌شود که نماد # روی خطی ظاهر شود و به دنبال آن کامنت واقعی نیامده باشد

کد دارای اشکال:

# +1:[empty-comment]
#
# +1:[empty-comment]
x = 0  #

کد درست:

# comment
x = 0  # comment

فایل پیکربندی:

[main]
load-plugins=pylint.extensions.empty_comment

نکته:

این پیام توسط بررسی‌کننده اختیاری 'empty-comment' <#pylint-extensions-empty-comment> صادر می‌شود، که نیازمند بارگذاری افزونه pylint.extensions.empty_comment است.

ایجادشده توسط بررسی‌کننده empty-comment https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/empty_comment.py..SS inconsistent-return-statements / R1710

پیام صادرشده:

یا تمام دستورهای return در یک تابع باید یک عبارت را برگردانند، یا هیچ‌کدام نباید برگردانند.

توضیحات:

بر اساس PEP8، اگر هر یک از دستورهای return عبارتی را برگرداند، سایر دستورهای return که مقداری برنمی‌گردانند باید صراحتاً به صورت return None مشخص شوند، و یک دستور return صریح نیز باید در پایان تابع (در صورت دسترسی‌پذیر بودن) وجود داشته باشد

کد مشکل‌دار:

def get_the_answer(value: str) -> str | None:  # [inconsistent-return-statements]
    if value:
        return value

کد درست:

def get_the_answer(value: str) -> str | None:
    if value:
        return value
    return None

ایجادشده توسط بررسی‌کننده refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

در '%s'، هنگام مقایسه لیترال‌های ثابت از '%s' استفاده کنید نه '%s' ('%s')

توضیحات:

زمانی به کار می‌رود که یک شیء با یک مقدار لیترال مقایسه شود؛ کاری که معمولاً نباید انجام دهید، زیرا ممکن است مقایسه با لیترالی کاملاً متفاوت از آنچه انتظار می‌رفت صورت گیرد.

کد مشکل‌دار:

def is_an_orange(fruit):
    return fruit is "orange"  # [literal-comparison]

کد درست:

def is_an_orange(fruit):
    return fruit == "orange"

پیوندهای مرتبط:

•
عملیات مقایسه‌ای در Python https://docs.python.org/3/library/stdtypes.html#comparisons

ایجادشده توسط بررسی‌کننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/comparison_checker.py.

پیام صادرشده:

استفاده از یک ثابت نام‌گذاری‌شده یا یک enum را به جای '%s' در نظر بگیرید.

توضیحات:

استفاده از ثابت‌های نام‌گذاری‌شده به جای مقادیر جادویی (magic values) به بهبود خوانایی و قابلیت نگهداری کد شما کمک می‌کند؛ سعی کنید در مقایسه‌ها از آن‌ها پرهیز کنید.

کد مشکل‌دار:

import random
measurement = random.randint(0, 200)
above_threshold = False
i = 0
while i < 5:  # [magic-value-comparison]
    above_threshold = measurement > 100  # [magic-value-comparison]
    if above_threshold:
        break
    measurement = random.randint(0, 200)

کد درست:

import random
MAX_NUM_OF_ITERATIONS = 5
THRESHOLD_VAL = 100
MIN_MEASUREMENT_VAL = 0
MAX_MEASUREMENT_VAL = 200
measurement = random.randint(MIN_MEASUREMENT_VAL, MAX_MEASUREMENT_VAL)
above_threshold = False
i = 0
while i < MAX_NUM_OF_ITERATIONS:
    above_threshold = measurement > THRESHOLD_VAL
    if above_threshold:
        break
    measurement = random.randint(MIN_MEASUREMENT_VAL, MAX_MEASUREMENT_VAL)

فایل پیکربندی:

[main]
load-plugins=pylint.extensions.magic_value

نکته:

این پیام توسط بررسی‌کننده اختیاری 'magic-value' <#pylint-extensions-magic-value> صادر می‌شود، که نیازمند بارگذاری افزونه pylint.extensions.magic_value است.

ایجادشده توسط بررسی‌کننده magic-value https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/magic_value.py..SS match-class-bind-self / R1905

پیام صادرشده:

به‌جای آن از '%s() as %s' استفاده کنید

توضیحات:

الگوهای تطبیق کلاس سریع‌تر هستند اگر مقیدسازی نام برای کل الگو صورت گیرد و بتوان از هرگونه جست‌وجو برای `__match_args__` جلوگیری کرد.

کد دارای مشکل:

class Book:
    __match_args__ = ("title", "year")
    def __init__(self, title, year):
        self.title = title
        self.year = year
def func(item: Book):
    match item:
        case Book(title=str(title)):  # [match-class-bind-self]
            ...
        case Book(year=int(year)):  # [match-class-bind-self]
            ...

کد صحیح:

class Book:
    __match_args__ = ("title", "year")
    def __init__(self, title, year):
        self.title = title
        self.year = year
def func(item: Book):
    match item:
        case Book(title=str() as title):
            ...
        case Book(year=int() as year):
            ...

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کننده match_statements https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/match_statements_checker.py.

پیام صادرشده:

به‌جای ویژگی‌های ترتیبی از ویژگی‌های کلیدواژه‌ای استفاده کنید (%s)

توضیحات:

ویژگی‌های کلیدواژه‌ای صریح‌تر و اندکی سریع‌تر هستند، زیرا CPython می‌تواند از جست‌وجوی `__match_args__` صرف‌نظر کند.

کد دارای مشکل:

class Book:
    __match_args__ = ("title", "year")
    def __init__(self, title, year):
        self.title = title
        self.year = year
def func(item: Book):
    match item:
        case Book("abc", 2000):  # [match-class-positional-attributes]
            ...

کد صحیح:

class Book:
    __match_args__ = ("title", "year")
    def __init__(self, title, year):
        self.title = title
        self.year = year
def func(item: Book):
    match item:
        case Book(title="abc", year=2000):
            ...

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کننده match_statements https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/match_statements_checker.py..SS no-classmethod-decorator / R0202

پیام صادرشده:

به‌جای فراخوانی classmethod، استفاده از دکوراتور را در نظر بگیرید

توضیحات:

زمانی استفاده می‌شود که یک متد کلاس بدون به‌کارگیری نحو دکوراتور تعریف شده باشد.

کد دارای مشکل:

class Fruit:
    COLORS = []
    def __init__(self, color):
        self.color = color
    def pick_colors(cls, *args):
        """classmethod to pick fruit colors"""
        cls.COLORS = args
    pick_colors = classmethod(pick_colors)  # [no-classmethod-decorator]

کد درست:

class Fruit:
    COLORS = []
    def __init__(self, color):
        self.color = color
    @classmethod
    def pick_colors(cls, *args):
        """classmethod to pick fruit colors"""
        cls.COLORS = args

ایجادشده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

"%s" غیرضروری پس از "break"، %s

توضیحات:

برای برجسته‌سازی یک بلوک کد غیرضروری پس از یک if حاوی دستور break به کار می‌رود. به این ترتیب، هنگام مواجهه با یک else پس از زنجیره‌ای از دستورهای if که همگی شامل دستور break هستند، هشدار می‌دهد.

کد دارای مشکل:

def next_seven_elements(iterator):
    for i, item in enumerate(iterator):
        if i == 7:  # [no-else-break]
            break
        else:
            yield item

کد درست:

def next_seven_elements(iterator):
    for i, item in enumerate(iterator):
        if i == 7:
            break
        yield item

ایجادشده توسط بررسی‌کنندهٔ refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py..SS no-else-continue / R1724

پیام صادرشده:

"%s" غیرضروری پس از "continue"، %s

توضیحات:

برای مشخص کردن یک بلوک کد غیرضروری پس از یک if حاوی دستور continue به کار می‌رود. به همین ترتیب، هنگامی که پس از زنجیره‌ای از ifها که همگی شامل دستور continue هستند با یک else مواجه شود، هشدار خواهد داد.

کد مشکل‌دار:

def even_number_under(n: int):
    for i in range(n):
        if i % 2 == 1:  # [no-else-continue]
            continue
        else:
            yield i

کد درست:

def even_number_under(n: int):
    for i in range(n):
        if i % 2 == 1:
            continue
        yield i

ایجادشده توسط بررسی‌کننده refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

"%s" غیرضروری پس از "raise"، %s

توضیحات:

برای مشخص کردن یک بلوک کد غیرضروری پس از یک if یا یک try/except حاوی دستور raise به کار می‌رود. به همین ترتیب، هنگامی که پس از زنجیره‌ای از ifها که همگی شامل دستور raise هستند با یک else مواجه شود، هشدار خواهد داد.

کد مشکل‌دار:

def integer_sum(a: int, b: int) -> int:
    if not (isinstance(a, int) and isinstance(b, int)):  # [no-else-raise]
        raise ValueError("Function supports only integer parameters.")
    else:
        return a + b

کد درست:

def integer_sum(a: int, b: int) -> int:
    if not (isinstance(a, int) and isinstance(b, int)):
        raise ValueError("Function supports only integer parameters.")
    return a + b

ایجادشده توسط بررسی‌کننده refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py..SS no-else-return / R1705

پیام صادرشده:

"%s" غیرضروری پس از "return"، %s

توضیحات:

برای مشخص کردن یک بلوک کد غیرضروری پس از یک if یا یک try/except حاوی دستور return به کار می‌رود. به این ترتیب، زمانی که پس از زنجیره‌ای از دستورهای if که همگی دارای دستور return هستند با یک else مواجه شود، هشدار خواهد داد.

کد مشکل‌دار:

def compare_numbers(a: int, b: int) -> int:
    if a == b:  # [no-else-return]
        return 0
    elif a < b:
        return -1
    else:
        return 1

کد صحیح:

def compare_numbers(a: int, b: int) -> int:
    if a == b:
        return 0
    if a < b:
        return -1
    return 1

ایجادشده توسط بررسی‌کنندهٔ refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

متد می‌تواند یک تابع باشد

توضیحات:

زمانی به کار می‌رود که یک متد از نمونهٔ مقید خود استفاده نمی‌کند و بنابراین می‌تواند به صورت یک تابع نوشته شود.

کد مشکل‌دار:

class Person:
    def greeting(self):  # [no-self-use]
        print("Greetings pythonista!")

کد صحیح:

function.py:

def greeting():
    print("Greetings pythonista!")

staticmethod.py:

class Person:
    @staticmethod
    def greeting():
        print("Greetings pythonista!")

use_self.py:

class Person:
    name: str = "Amelia"
    def greeting(self):
        print(f"Greetings {self.name} the pythonista!")

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.no_self_use,

جزئیات تکمیلی:

اگر یک تابع از هیچ‌یک از ویژگی‌های کلاس استفاده نمی‌کند، می‌تواند یک @staticmethod یا یک تابع در خارج از کلاس باشد.

نکته:

این پیام توسط بررسی‌کنندهٔ اختیاری 'no_self_use' <#pylint-extensions-no-self-use> صادر می‌شود که نیازمند بارگذاری افزونهٔ pylint.extensions.no_self_use است.

ایجادشده توسط بررسی‌کنندهٔ no_self_use https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/no_self_use.py..SS no-staticmethod-decorator / R0203

پیام صادرشده:

Consider using a decorator instead of calling staticmethod

توضیحات:

زمانی استفاده می‌شود که یک متد استاتیک بدون استفاده از نحو دکوراتور تعریف شده باشد.

کد دارای اشکال:

class Worm:
    def bore(self):
        pass
    bore = staticmethod(bore)  # [no-staticmethod-decorator]

کد درست:

class Worm:
    @staticmethod
    def bore(self):
        pass

ایجادشده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

Prefer 'typing.NamedTuple' over 'collections.namedtuple'

توضیحات:

'typing.NamedTuple' از کلیدواژهٔ نام‌آشنای 'class' همراه با type-hints برای خوانایی بهتر استفاده می‌کند (همچنین به دلیل اجتناب از فراخوانی داخلی exec، سریع‌تر است). به‌طور پیش‌فرض غیرفعال است!

احتیاط:

این پیام به‌طور پیش‌فرض غیرفعال است. برای فعال‌سازی آن، prefer-typing-namedtuple را به گزینهٔ enable اضافه کنید.

کد دارای اشکال:

from collections import namedtuple
Philosophy = namedtuple(  # [prefer-typing-namedtuple]
    "Philosophy", ("goodness", "truth", "beauty")
)

کد درست:

from typing import NamedTuple
class Philosophy(NamedTuple):
    goodness: str
    truth: bool
    beauty: float

فایل پیکربندی:

[MAIN]
load-plugins = pylint.extensions.code_style

پیوندهای مرتبط:

نکته:

این پیام توسط بررسی‌کنندهٔ اختیاری 'code_style' <#pylint-extensions-code-style> صادر می‌شود که نیازمند بارگذاری افزونهٔ pylint.extensions.code_style است.

ایجادشده توسط بررسی‌کنندهٔ code_style https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/code_style.py..SS property-with-parameters / R0206

پیام صادرشده:

نمی‌توان برای ویژگی‌ها پارامتر تعریف کرد

توضیحات:

زمانی استفاده می‌شود که تشخیص دهیم یک ویژگی (property) دارای پارامتر نیز هست؛ این پارامترها بی‌استفاده هستند، زیرا ویژگی‌ها نمی‌توانند با آرگومان‌های اضافی فراخوانی شوند.

کد دارای مشکل:

class Worm:
    @property
    def bore(self, depth):  # [property-with-parameters]
        pass

کد درست:

class Worm:
    @property
    def bore(self):
        """Property accessed with '.bore'."""
        pass
    def bore_with_depth(depth):
        """Function called with .bore_with_depth(depth)."""
        pass

ایجادشده توسط بررسی‌کنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.

پیام صادرشده:

بازتعریف آرگومان با نام محلی %r

توضیحات:

زمانی استفاده می‌شود که یک نام محلی، آرگومانی را بازتعریف کند که می‌تواند نشان‌دهندهٔ یک خطای احتمالی باشد. این مورد تنها برای تعداد اندکی از عملیات مقیدسازی نام (name binding)، مانند پیمایش در حلقهٔ for، انتساب در دستور with و انتساب در مدیریت‌کنندهٔ استثنا (exception handler) لحاظ می‌شود.

کد دارای مشکل:

def show(host_id=10.11):
    # +1: [redefined-argument-from-local]
    for host_id, host in [[12.13, "Venus"], [14.15, "Mars"]]:
        print(host_id, host)

کد درست:

def show(host_id=10.11):
    for inner_host_id, host in [[12.13, "Venus"], [14.15, "Mars"]]:
        print(host_id, inner_host_id, host)

ایجادشده توسط بررسی‌کنندهٔ refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py..SS redefined-variable-type / R0204

پیام صادرشده:

تعریف مجدد نوع %s از %s به %s

توضیحات:

زمانی استفاده می‌شود که نوع یک متغیر درون یک متد یا تابع تغییر کند.

کد دارای مشکل:

x = 1
x = "2"  # [redefined-variable-type]

کد درست:

x = 1
x = 2

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.redefined_variable_type,

نکته:

این پیام توسط بررسی‌کننده اختیاری 'multiple_types' <#pylint-extensions-redefined-variable-type> صادر می‌شود، که نیازمند بارگذاری افزونه pylint.extensions.redefined_variable_type است.

ایجادشده توسط بررسی‌کننده multiple_types https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/redefined_variable_type.py.

پیام صادرشده:

نوع `%s` بیش از یک بار در حاشیه‌نویسی نوع union استفاده شده است. راهنماهای نوع اضافی را حذف کنید.

توضیحات:

آرگومان‌های نوع تکراری توسط ابزار `mypy` نادیده گرفته خواهند شد، بنابراین برای جلوگیری از سردرگمی باید حذف شوند.

کد دارای مشکل:

from typing import Union
sweet_count: Union[int, str, int] = 42  # [redundant-typehint-argument]

کد درست:

from typing import Union
sweet_count: Union[str, int] = 42

فایل پیکربندی:

[main]
load-plugins=pylint.extensions.typing

نکته:

این پیام توسط بررسی‌کننده اختیاری 'typing' <#pylint-extensions-typing> صادر می‌شود، که نیازمند بارگذاری افزونه pylint.extensions.typing است.

ایجادشده توسط بررسی‌کننده typing https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/typing.py..SS simplifiable-condition / R1726

پیام صادرشده:

شرط بولی "%s" می‌تواند به "%s" ساده‌سازی شود

توضیحات:

زمانی صادر می‌شود که یک شرط بولی قابل ساده‌سازی باشد.

کد دارای مشکل:

def has_apples(apples) -> bool:
    return bool(apples or False)  # [simplifiable-condition]

کد صحیح:

def has_apples(apples) -> bool:
    return bool(apples)

ایجادشده توسط بررسی‌کننده refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

عبارت if می‌تواند با %s جایگزین شود

توضیحات:

زمانی استفاده می‌شود که یک عبارت if بتواند با 'bool(test)' یا در صورت ضمنی بودن تبدیل نوع بولی، به سادگی با 'test' جایگزین شود.

کد دارای مشکل:

FLYING_THINGS = ["bird", "plane", "superman", "this example"]
def is_flying_thing(an_object):
    return True if an_object in FLYING_THINGS else False  # [simplifiable-if-expression]
def is_not_flying_thing(an_object):
    return False if an_object in FLYING_THINGS else True  # [simplifiable-if-expression]

کد صحیح:

FLYING_THINGS = ["bird", "plane", "superman", "this example"]
def is_flying_thing(an_object):
    return an_object in FLYING_THINGS
def is_not_flying_thing(an_object):
    return an_object not in FLYING_THINGS

پیوندهای مرتبط:

•
ساده‌سازی یک دستور 'if' با ()bool https://stackoverflow.com/questions/49546992

ایجادشده توسط بررسی‌کننده refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py..SS simplifiable-if-statement / R1703

پیام صادرشده:

The if statement can be replaced with %s

توضیحات:

هنگامی استفاده می‌شود که یک دستور if بتواند با 'bool(test)' جایگزین شود.

کد دارای اشکال:

FLYING_THINGS = ["bird", "plane", "superman", "this example"]
def is_flying_animal(an_object):
    # +1: [simplifiable-if-statement]
    if isinstance(an_object, Animal) and an_object in FLYING_THINGS:
        is_flying = True
    else:
        is_flying = False
    return is_flying

کد صحیح:

FLYING_THINGS = ["bird", "plane", "superman", "this example"]
def is_flying_animal(an_object):
    is_flying = isinstance(an_object, Animal) and an_object.name in FLYING_THINGS
    return is_flying

ایجاد شده توسط بررسی‌کننده refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

Boolean expression may be simplified to %s

توضیحات:

هنگامی صادر می‌شود که از نحو سه‌گانه (ternary) زائد pre-python 2.5 استفاده شده باشد.

کد دارای اشکال:

def has_oranges(oranges, apples=None) -> bool:
    return apples and False or oranges  # [simplify-boolean-expression]

کد صحیح:

def has_oranges(oranges, apples=None) -> bool:
    return oranges

ایجاد شده توسط بررسی‌کننده refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py..SS stop-iteration-return / R1708

پیام صادرشده:

در generator از raise StopIteration استفاده نکنید، به‌جای آن از دستور return استفاده کنید

توضیحات:

مطابق با PEP479، ایجاد خطای StopIteration با دستور raise برای خاتمه دادن به حلقه یک generator ممکن است منجر به باگ‌هایی شود که یافتن آن‌ها دشوار است. این PEP مشخص می‌کند که raise StopIteration باید با یک دستور return ساده جایگزین شود.

کد مشکل‌دار:

fruit_generator.py:

def fruit_generator():
    for fruit in ["apple", "banana"]:
        yield fruit
    raise StopIteration  # [stop-iteration-return]

two_fruit_generator.py:

def two_fruits_generator(fruits):
    for fruit in fruits:
        yield fruit, next(fruits)  # [stop-iteration-return]

two_good_fruit_generator.py:

def two_good_fruits_generator(fruits):
    for fruit in fruits:
        if not fruit.is_tasty():
            continue
        while True:
            next_fruit = next(fruits)  # [stop-iteration-return]
            if next_fruit.is_tasty():
                yield fruit, next_fruit
                break

کد صحیح:

fruit_generator.py:

def fruit_generator():
    """The example is simple enough you don't need an explicit return."""
    for fruit in ["apple", "banana"]:
        yield fruit

two_fruit_generator.py:

def two_fruits_generator(fruits):
    """Catching the StopIteration."""
    for fruit in fruits:
        try:
            yield fruit, next(fruits)
        except StopIteration:
            print("Sorry there is only one fruit left.")
            yield fruit, None

two_good_fruit_generator.py:

def two_good_fruits_generator(fruits):
    """A return can be used to end the iterator early, but not a StopIteration."""
    for fruit in fruits:
        if not fruit.is_tasty():
            continue
        while True:
            next_fruit = next(fruits, None)
            if next_fruit is None:
                print("Sorry there is only one fruit left.")
                yield fruit, None
                # We reached the end of the 'fruits' generator but raising a
                # StopIteration instead of returning would create a RuntimeError
                return
            if next_fruit.is_tasty():
                yield fruit, next_fruit
                break

جزئیات تکمیلی:

امکان‌پذیر است که یک مقدار پیش‌فرض به next داده شود یا StopIteration دریافت (catch) گردد، یا مستقیماً return انجام شود. یک StopIteration نمی‌تواند از یک generator به بیرون منتشر شود.

پیوندهای مرتبط:

ایجادشده توسط بازرس (checker) refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py..SS super-with-arguments / R1725

پیام صادرشده:

استفاده از ()super بدون آرگومان به سبک Python 3 را در نظر بگیرید

توضیحات:

هنگام فراخوانی تابع توکار ()super با کلاس و نمونه جاری صادر می‌شود. در Python 3 این آرگومان‌ها پیش‌فرض هستند و می‌توان آن‌ها را حذف کرد.

کد دارای مشکل:

class Fruit:
    pass
class Orange(Fruit):
    def __init__(self):
        super(Orange, self).__init__()  # [super-with-arguments]

کد صحیح:

class Fruit:
    pass
class Orange(Fruit):
    def __init__(self):
        super().__init__()

ایجادشده توسط بررسی‌کننده refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

%s بیش از حد پیچیده است. رتبه‌بندی McCabe برابر با %d است

توضیحات:

زمانی استفاده می‌شود که یک متد یا تابع بر اساس پیچیدگی سیکلوماتیک McCabe بیش از حد پیچیده باشد

کد دارای مشکل:

def fifty_percent_off(whole):
    return (float(whole)) * 50 / 100
def calculate_sum_and_display_price_of_fruits(*fruits):  # [too-complex]
    # McCabe rating is 13 here (by default 10)
    shopping_list = []
    if "apple" in fruits:
        v = fifty_percent_off(1.1)
        shopping_list.append(v)
    if "pear" in fruits:
        shopping_list.append(0.8)
    if "banana" in fruits:
        shopping_list.append(1.2)
    if "mango" in fruits:
        shopping_list.append(3.5)
    if "peach" in fruits:
        shopping_list.append(0.5)
    if "melon" in fruits:
        shopping_list.append(4.9)
    if "orange" in fruits:
        shopping_list.append(2.0)
    if "strawberry" in fruits:
        shopping_list.append(2.5)
    if "mandarin" in fruits:
        shopping_list.append(2.3)
    if "plum" in fruits:
        shopping_list.append(0.5)
    if "watermelon" in fruits:
        v = fifty_percent_off(6.4)
        shopping_list.append(v)
    combine = zip(fruits, shopping_list)
    for i in combine:
        print(f"{i[0]} ${i[1]:.2f}")
    total = sum(shopping_list)
    print(f"Total price is ${total:.2f}")
fruits_to_buy = ["apple", "orange", "watermelon"]
calculate_sum_and_display_price_of_fruits(*fruits_to_buy)

کد صحیح:

FRUIT_PRICES = {
    "apple": 1.1,
    "pear": 0.8,
    "banana": 1.2,
    "mango": 3.5,
    "peach": 0.5,
    "melon": 4.9,
    "orange": 2.0,
    "strawberry": 2.5,
    "mandarin": 2.3,
    "plum": 0.5,
    "watermelon": 6.4,
}
DISCOUNTED_FRUITS = ["apple", "watermelon"]
def fifty_percent_off(whole):
    return (float(whole)) * 50 / 100
def get_price(fruit):
    full_price = FRUIT_PRICES.get(fruit)
    if fruit in DISCOUNTED_FRUITS:
        return fifty_percent_off(full_price)
    else:
        return full_price
def display_fruit_and_price(fruits):
    for fruit in fruits:
        print(f"{fruit} ${get_price(fruit) :.2f}")
def get_total(fruits):
    return sum(get_price(f) for f in fruits)
fruits_to_buy = ["apple", "orange", "watermelon"]
display_fruit_and_price(fruits_to_buy)
print(f"Total price is ${get_total(fruits_to_buy):.2f}")

فایل پیکربندی:

[main]
load-plugins=pylint.extensions.mccabe

نکته:

این پیام توسط بررسی‌کننده اختیاری 'design' <#pylint-extensions-mccabe> صادر می‌شود که مستلزم بارگذاری افزونه pylint.extensions.mccabe است.

ایجادشده توسط بررسی‌کننده design https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/mccabe.py..SS too-few-public-methods / R0903

پیام صادرشده:

متدهای عمومی بسیار کم (%s/%s)

توضیحات:

زمانی استفاده می‌شود که کلاس متدهای عمومی بسیار کمی دارد، بنابراین مطمئن شوید که واقعاً ارزشش را دارد.

کد دارای مشکل:

class Worm:  # [too-few-public-methods]
    def __init__(self, name: str, fruit_of_residence: Fruit):
        self.name = name
        self.fruit_of_residence = fruit_of_residence
    def bore(self):
        print(f"{self.name} is boring into {self.fruit_of_residence}")

کد صحیح:

dataclass_and_function.py:

import dataclasses
@dataclasses.dataclass
class Worm:
    name: str
    fruit_of_residence: Fruit
def bore(worm: Worm):
    print(f"{worm.name} is boring into {worm.fruit_of_residence}")

function.py:

def bore(fruit: Fruit, worm_name: str):
    print(f"{worm_name} is boring into {fruit}")

larger_api.py:

class Worm:
    def __init__(self, name: str, fruit_of_residence: Fruit):
        self.name = name
        self.fruit_of_residence = fruit_of_residence
    def bore(self):
        print(f"{self.name} is boring into {self.fruit_of_residence}")
    def wiggle(self):
        print(f"{self.name} wiggle around wormily.")

ایجادشده توسط بررسی‌کنندهٔ design https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/design_analysis.py..SS too-many-ancestors / R0901

پیام صادرشده:

اجداد بیش از حد (%s/%s)

توضیحات:

زمانی استفاده می‌شود که کلاس بیش از حد کلاس والد داشته باشد؛ سعی کنید این تعداد را کاهش دهید تا به کلاسی ساده‌تر (و در نتیجه با استفادهٔ آسان‌تر) دست یابید.

کد دارای مشکل:

class Animal: ...
class BeakyAnimal(Animal): ...
class FurryAnimal(Animal): ...
class Swimmer(Animal): ...
class EggLayer(Animal): ...
class VenomousAnimal(Animal): ...
class ProtectedSpecie(Animal): ...
class BeaverTailedAnimal(Animal): ...
class Vertebrate(Animal): ...
# max of 7 by default, can be configured
# each edge of a diamond inheritance counts
class Playtypus(  # [too-many-ancestors]
    BeakyAnimal,
    FurryAnimal,
    Swimmer,
    EggLayer,
    VenomousAnimal,
    ProtectedSpecie,
    BeaverTailedAnimal,
    Vertebrate,
):
    pass

کد صحیح:

class Animal:
    beaver_tailed: bool
    can_swim: bool
    has_beak: bool
    has_fur: bool
    has_vertebrae: bool
    lays_egg: bool
    protected_specie: bool
    venomous: bool
class Invertebrate(Animal):
    has_vertebrae = False
class Vertebrate(Animal):
    has_vertebrae = True
class Mammal(Vertebrate):
    has_beak = False
    has_fur = True
    lays_egg = False
    venomous = False
class Playtypus(Mammal):
    beaver_tailed = True
    can_swim = True
    has_beak = True
    lays_egg = True
    protected_specie = True
    venomous = True

ایجاد شده توسط بررسی‌کنندهٔ design https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/design_analysis.py..SS too-many-arguments / R0913

پیام صادرشده:

آرگومان‌های بیش از حد (%s/%s)

توضیحات:

زمانی استفاده می‌شود که یک تابع یا متد بیش از حد آرگومان بپذیرد.

کد مشکل‌دار:

def three_d_chess_move(  # [too-many-arguments]
    x_white,
    y_white,
    z_white,
    piece_white,
    x_black,
    y_black,
    z_black,
    piece_black,
    x_blue,
    y_blue,
    z_blue,
    piece_blue,
    current_player,
):
    pass

کد صحیح:

from dataclasses import dataclass
@dataclass
class ThreeDChessPiece:
    x: int
    y: int
    z: int
    type: str
def three_d_chess_move(
    white: ThreeDChessPiece,
    black: ThreeDChessPiece,
    blue: ThreeDChessPiece,
    current_player,
):
    pass

ایجادشده توسط بررسی‌کنندهٔ design https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/design_analysis.py.

پیام صادرشده:

عبارات بولی بیش از حد در دستور if (%s/%s)

توضیحات:

زمانی استفاده می‌شود که یک دستور if شامل عبارات بولی بیش از حد باشد.

کد مشکل‌دار:

def can_be_divided_by_two_and_are_not_zero(x, y, z):
    # Maximum number of boolean expressions in an if statement (by default 5)
    # +1: [too-many-boolean-expressions]
    if (x and y and z) and (x % 2 == 0 and y % 2 == 0 and z % 2 == 0):
        pass

کد صحیح:

def can_be_divided_by_two_and_are_not_zero(x, y, z):
    if all(i and i % 2 == 0 for i in [x, y, z]):
        pass

ایجادشده توسط بررسی‌کنندهٔ design https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/design_analysis.py..SS too-many-branches / R0912

پیام صادرشده:

تعداد شاخه‌ها بیش از حد مجاز (%s/%s)

توضیحات:

هنگامی استفاده می‌شود که یک تابع یا متد دارای شاخه‌های بیش از حد باشد، که دنبال کردن آن را دشوار می‌سازد.

کد دارای مشکل:

def num_to_word(x):  # [too-many-branches]
    if x == 0:
        return "zero"
    elif x == 1:
        return "one"
    elif x == 2:
        return "two"
    elif x == 3:
        return "three"
    elif x == 4:
        return "four"
    elif x == 5:
        return "five"
    elif x == 6:
        return "six"
    elif x == 7:
        return "seven"
    elif x == 8:
        return "eight"
    elif x == 9:
        return "nine"
    else:
        return None

کد صحیح:

def num_to_word(x):
    return {
        0: "zero",
        1: "one",
        2: "two",
        3: "three",
        4: "four",
        5: "five",
        6: "six",
        7: "seven",
        8: "eight",
        9: "nine",
    }.get(x)

فایل پیکربندی:

[main]
max-branches=10

ایجادشده توسط بررسی‌کنندهٔ design https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/design_analysis.py.

پیام صادرشده:

تعداد ویژگی‌های نمونه بیش از حد مجاز (%s/%s)

توضیحات:

هنگامی استفاده می‌شود که یک کلاس ویژگی‌های نمونهٔ بیش از حدی داشته باشد؛ تلاش کنید این تعداد را کاهش دهید تا به کلاسی ساده‌تر (و در نتیجه با کاربرد آسان‌تر) دست یابید.

کد دارای مشکل:

class Fruit:  # [too-many-instance-attributes]
    def __init__(self):
        # max of 7 attributes by default, can be configured
        self.worm_name = "Jimmy"
        self.worm_type = "Codling Moths"
        self.worm_color = "light brown"
        self.fruit_name = "Little Apple"
        self.fruit_color = "Bright red"
        self.fruit_vitamins = ["A", "B1"]
        self.fruit_antioxidants = None
        self.secondary_worm_name = "Kim"
        self.secondary_worm_type = "Apple maggot"
        self.secondary_worm_color = "Whitish"

کد صحیح:

import dataclasses
@dataclasses.dataclass
class Worm:
    name: str
    type: str
    color: str
class Fruit:
    def __init__(self):
        self.name = "Little Apple"
        self.color = "Bright red"
        self.vitamins = ["A", "B1"]
        self.antioxidants = None
        self.worms = [
            Worm(name="Jimmy", type="Codling Moths", color="light brown"),
            Worm(name="Kim", type="Apple maggot", color="Whitish"),
        ]

ایجادشده توسط بررسی‌کنندهٔ design https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/design_analysis.py..SS too-many-locals / R0914

پیام صادرشده:

متغیرهای محلی بیش از حد (%s/%s)

توضیحات:

هنگامی استفاده می‌شود که یک تابع یا متد بیش از حد متغیر محلی داشته باشد.

کد مشکل‌دار:

from childhood import Child, Sweet
def handle_sweets(infos):  # [too-many-locals]
    # Create children
    children = [Child(info) for info in infos]
    number_of_sweets = 87
    sweets = [Sweet() * number_of_sweets]
    number_of_sweet_per_child = 5
    money = 45.0
    sweets_given = 0
    time_to_eat_sweet = 54
    price_of_sweet = 0.42
    # distribute sweet
    for child in children:
        sweets_given += number_of_sweet_per_child
        child.give(sweets[number_of_sweet_per_child:])
    # calculate prices
    cost_of_children = sweets_given * price_of_sweet
    # Calculate remaining money
    remaining_money = money - cost_of_children
    # Calculate time it took
    time_it_took_assuming_parallel_eating = (
        time_to_eat_sweet * number_of_sweet_per_child
    )
    print(
        f"{children} ate {cost_of_children}¤ of sweets in {time_it_took_assuming_parallel_eating}, "
        f"you still have {remaining_money}"
    )

کد صحیح:

from typing import NamedTuple
from childhood import Child, Sweet
class SweetDistrubutionCharacteristics(NamedTuple):
    number_of_sweets: int
    number_of_sweet_per_child: int
    number_of_children: int
    @property
    def sweets_given(self):
        return self.number_of_sweet_per_child * self.number_of_children
def handle_sweets(infos):
    children = [Child(info) for info in infos]
    characteristics = SweetDistrubutionCharacteristics(87, 5, len(children))
    _allocate_sweets_to_children(children, characteristics)
    financial_impact = _assess_financial_impact(characteristics)
    print(f"{children} ate {financial_impact}")
def _allocate_sweets_to_children(
    children, characteristics: SweetDistrubutionCharacteristics
) -> None:
    sweets = [Sweet() * characteristics.number_of_sweets]
    for child in children:
        child.give(sweets[characteristics.number_of_sweet_per_child :])
def _assess_financial_impact(characteristics: SweetDistrubutionCharacteristics) -> str:
    time_to_eat_sweet = 54
    money = 45.0
    price_of_sweet = 0.42
    cost_of_children = characteristics.sweets_given * price_of_sweet
    remaining_money = money - cost_of_children
    time_it_took_assuming_parallel_eating = (
        time_to_eat_sweet * characteristics.number_of_sweet_per_child
    )
    return (
        f"{cost_of_children}¤ of sweets in "
        f"{time_it_took_assuming_parallel_eating}, you still have {remaining_money}"
    )

فایل پیکربندی:

[design]
max-locals = 11

جزئیات بیشتر:

داشتن متغیرهای محلی بیش از حد ممکن است نشان‌دهنده این باشد که در یک تابع کارهای زیادی انجام می‌دهید و می‌توان کلاس‌هایی برای گروه‌بندی برخی از ویژگی‌ها ایجاد کرد. شاید بتوان عملیات را در چندین تابع تفکیک کرد. آیا واقعاً همه متغیرهای شما ارتباط نزدیکی با یکدیگر دارند؟

ایجاد شده توسط بررسی‌کننده design https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/design_analysis.py..SS too-many-nested-blocks / R1702

پیام صادرشده:

Too many nested blocks (%s/%s)

توضیحات:

زمانی استفاده می‌شود که یک تابع یا متد دارای بیش از حد بلوک‌های تو در تو باشد. این امر درک و نگهداری‌پذیری کد را دشوارتر می‌کند.

کد دارای مشکل:

def correct_fruits(fruits):
    if len(fruits) > 1:  # [too-many-nested-blocks]
        if "apple" in fruits:
            if "orange" in fruits:
                count = fruits["orange"]
                if count % 2:
                    if "kiwi" in fruits:
                        if count == 2:
                            return True
    return False

کد درست:

def correct_fruits(fruits):
    if len(fruits) > 1 and "apple" in fruits and "orange" in fruits:
        count = fruits["orange"]
        if count % 2 and "kiwi" in fruits and count == 2:
            return True
    return False

ایجادشده توسط بررسی‌کنندهٔ refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

Too many positional arguments (%s/%s)

توضیحات:

زمانی استفاده می‌شود که یک تابع بیش از حد آرگومان موقعیتی (positional) داشته باشد.

کد دارای مشکل:

# +1: [too-many-positional-arguments]
def calculate_drag_force(velocity, area, density, drag_coefficient):
    """Each argument is positional-or-keyword unless a `/` or `*` is present."""
    return 0.5 * drag_coefficient * density * area * velocity**2
drag_force = calculate_drag_force(30, 2.5, 1.225, 0.47)

کد درست:

def calculate_drag_force(*, velocity, area, density, drag_coefficient):
    """This function is 'Keyword only' for all args due to the '*'."""
    return 0.5 * drag_coefficient * density * area * velocity**2
# This is now impossible to do and will raise a TypeError:
# drag_force = calculate_drag_force(30, 2.5, 1.225, 0.47)
#              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# TypeError: calculate_drag_force() takes 0 positional arguments but 4 were given
# And this is the only way to call 'calculate_drag_force'
drag_force = calculate_drag_force(
    velocity=30, area=2.5, density=1.225, drag_coefficient=0.47
)

فایل پیکربندی:

[DESIGN]
max-positional-arguments=3

جزئیات بیشتر:

امضاهای مناسب تابع پارامترهای موقعیتی زیادی ندارند. در تقریباً تمام رابط‌ها، فراتر رفتن از چند آرگومان محدود به فهم‌پذیری کد آسیب می‌زند.

آرگومان‌های موقعیتی برای مواردی که نحوهٔ استفاده بدیهی و مشخص است به‌خوبی عمل می‌کنند؛ مانند assertEqual(first, second, "assert msg") در unittest یا zip(fruits, vegetables).

استثناهای اندکی وجود دارند که در آن‌ها چهار یا چند پارامتر موقعیتی منطقی است؛ برای نمونه rgba(1.0, 0.5, 0.3, 1.0)، زیرا از قراردادی بسیار شناخته‌شده و تثبیت‌شده پیروی می‌کند و استفادهٔ همیشگی از کلمات کلیدی، اتلاف وقت خواهد بود.

پیوندهای مرتبط:

•
پارامترهای ویژه در پایتون https://docs.python.org/3/tutorial/controlflow.html#special-parameters

ایجادشده توسط بررسی‌کنندهٔ design https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/design_analysis.py..SS too-many-public-methods / R0904

پیام صادرشده:

متدهای عمومی بیش از حد (%s/%s)

توضیحات:

زمانی استفاده می‌شود که یک کلاس بیش از حد متد عمومی داشته باشد؛ تلاش کنید این متدها را کاهش دهید تا به کلاسی ساده‌تر (و در نتیجه با استفاده آسان‌تر) دست یابید.

کد دارای مشکل:

class SpaceInvaders:  # [too-many-public-methods]
    def __init__(self):
        pass
    def fire_laser_beam(self):
        pass
    def deploy_shield(self):
        pass
    def launch_missile(self):
        pass
    def activate_super_laser(self):
        pass
    def summon_mothership(self):
        pass
    def destroy_planet(self):
        pass
    def teleport(self):
        pass
    def invoke_aliens(self):
        pass
    def invade_earth(self):
        pass
    def takeover_galaxy(self):
        pass

کد صحیح:

class LaserBeam:
    def __init__(self):
        pass
    def fire(self):
        pass
    def activate_super(self):
        pass
    def destroy_planet(self):
        pass
class Shield:
    def deploy(self):
        pass
class Missile:
    def launch(self):
        pass
class SpaceInvaders:
    def __init__(self):
        self.laser = LaserBeam()
        self.shield = Shield()
        self.missile = Missile()
    def summon_mothership(self):
        pass
    def destroy_planet(self):
        pass
    def teleport(self):
        pass
    def invoke_aliens(self):
        pass
    def invade_earth(self):
        pass
    def takeover_galaxy(self):
        pass

فایل پیکربندی:

[main]
max-public-methods=7

جزئیات تکمیلی:

داشتن متدهای عمومی بیش از حد نشان‌دهنده این است که احتمالاً اصل تک‌مسئولیتی (Single-responsibility principle یا همان S در SOLID) را رعایت نکرده‌اید.

کلاس باید تنها یک دلیل برای تغییر داشته باشد، اما در این مثال سفینه فضایی حداقل ۴ فرد یا نقش دارد که می‌توانند درخواست تغییر در آن را داشته باشند (مدیر لیزر، مدیر سپر دفاعی، مدیر موشک، مسئول دورنوردی...).

پیوندهای مرتبط:

•
اصل تک‌مسئولیتی (Single-responsibility principle) https://en.wikipedia.org/wiki/Single-responsibility_principle

ایجاد شده توسط بررسی‌کننده design https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/design_analysis.py..SS too-many-return-statements / R0911

پیام صادرشده:

تعداد بیش از حد دستورهای return (%s/%s)

توضیحات:

زمانی استفاده می‌شود که یک تابع یا متد بیش از حد دستور return داشته باشد که دنبال کردن آن را دشوار می‌سازد.

کد مشکل‌دار:

def to_string(x):  # [too-many-return-statements]
    # max of 6 by default, can be configured
    if x == 1:
        return "This is one."
    if x == 2:
        return "This is two."
    if x == 3:
        return "This is three."
    if x == 4:
        return "This is four."
    if x == 5:
        return "This is five."
    if x == 6:
        return "This is six."
    if x == 7:
        return "This is seven."

کد صحیح:

NUMBERS_TO_STRINGS = {
    1: "one",
    2: "two",
    3: "three",
    4: "four",
    5: "five",
    6: "six",
    7: "seven",
}
def to_string(x):
    return f"This is {NUMBERS_TO_STRINGS.get(x)}."

ایجادشده توسط بازبین design https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/design_analysis.py.

پیام صادرشده:

تعداد بیش از حد دستورها (%s/%s)

توضیحات:

زمانی استفاده می‌شود که یک تابع یا متد بیش از حد دستور داشته باشد. در این صورت باید آن را به توابع / متدهای کوچک‌تر تقسیم کنید.

کد مشکل‌دار:

import random
def distribute_candies(  # [too-many-statements]
    children: list[Child], candies_per_child: int
):
    # This function is a masterpiece of code that embodies the epitome of efficiency
    # it's also an essential part of a high-priority project with extremely tight deadlines
    # and there is absolutely no time to refactor it to make it more concise.
    # The lead developer on the project, who has decades of experience,
    # has personally reviewed this implementation and deemed it good enough as it is.
    # The person writing this code has a demanding job and multiple responsibilities,
    # and simply does not have the luxury of spending time making this code more readable.
    total_candies = len(children) * candies_per_child
    eaten_candies = 0
    # Counting candies given to each child
    for child in children:
        # If a child eat more than 1 candies they're going to eat all
        # the candies for sure
        eaten_for_child = random.choices([0, 1, candies_per_child])
        print(
            f"Child {child} gets {candies_per_child} candies and eat {eaten_for_child}"
        )
        remaining_candies_for_children = child.eat_candies(eaten_for_child)
        if remaining_candies_for_children == 0:
            print(f"All the candies have been devoured by {child.name}!")
        else:
            print(
                f"{child.name} still have {remaining_candies_for_children} candies left."
            )
        eaten_candies += eaten_for_child
    return eaten_candies, total_candies

کد صحیح:

import random
def distribute_candies(children: list[Child], candies_per_child: int):
    total_candies = len(children) * candies_per_child
    eaten_candies = 0
    for child in children:
        eaten_candies += _distribute_candies_to_child(candies_per_child, child)
    return eaten_candies, total_candies
def _distribute_candies_to_child(candies_per_child: int, child: Child):
    # If a child eat more than 1 candies they're going to eat all
    # the candies for sure
    eaten_for_child = random.choices([0, 1, candies_per_child])
    print(f"Child {child} gets {candies_per_child} candies and eat {eaten_for_child}")
    remaining_candies_for_children = child.eat_candies(eaten_for_child)
    if remaining_candies_for_children == 0:
        print(f"All the candies have been devoured by {child.name}!")
    else:
        print(f"{child.name} still have {remaining_candies_for_children} candies left.")
    return eaten_for_child

فایل پیکربندی:

[DESIGN]
max-statements=7

ایجادشده توسط بازبین design https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/design_analysis.py..SS trailing-comma-tuple / R1707

پیام صادرشده:

عدم مجاز بودن تاپل با ویرگول پایانی

توضیحات:

در پایتون، یک تاپل در واقع با نماد ویرگول ایجاد می‌شود، نه با پرانتزها. متأسفانه ممکن است با قرار دادن اشتباه یک ویرگول پایانی ندانسته یک تاپل ایجاد شود که می‌تواند منجر به باگ‌های عجیب بالقوه‌ای در کد شما گردد. همیشه باید برای ایجاد تاپل به‌طور صریح از پرانتز استفاده کنید.

کد دارای مشکل:

COMPASS = "north", "south", "east", "west",  # [trailing-comma-tuple]

کد درست:

COMPASS = ("north", "south", "east", "west")

ایجادشده توسط بررسی‌کنندهٔ refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

استفاده غیرضروری از comprehension، به جای آن از %s استفاده کنید.

توضیحات:

به جای استفاده از یک identity comprehension، استفاده از سازندهٔ list، dict یا set را در نظر بگیرید. این روش سریع‌تر و ساده‌تر است.

کد دارای مشکل:

NUMBERS = [1, 1, 2, 2, 3, 3]
UNIQUE_NUMBERS = {number for number in NUMBERS}  # [unnecessary-comprehension]

کد درست:

NUMBERS = [1, 1, 2, 2, 3, 3]
UNIQUE_NUMBERS = set(NUMBERS)

ایجادشده توسط بررسی‌کنندهٔ refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

نوع `%s` دارای آرگومان‌های نوع پیش‌فرض غیرضروری است. آن را به `%s` تغییر دهید.

توضیحات:

زمانی صادر می‌شود که نوع‌ها دارای آرگومان‌های نوع پیش‌فرضی باشند که می‌توان آن‌ها را حذف کرد. بیشتر برای `typing.Generator` و `typing.AsyncGenerator` استفاده می‌شود.

کد دارای مشکل:

from collections.abc import AsyncGenerator, Generator
a1: AsyncGenerator[int, None]  # [unnecessary-default-type-args]
b1: Generator[int, None, None]  # [unnecessary-default-type-args]

کد درست:

from collections.abc import AsyncGenerator, Generator
a1: AsyncGenerator[int]
b1: Generator[int]

فایل پیکربندی:

[main]
load-plugins=pylint.extensions.typing

جزئیات تکمیلی:

در حال حاضر، این بررسی تنها برای Generator و AsyncGenerator کار می‌کند.

از Python 3.13 به بعد، مقدار پیش‌فرض SendType و ReturnType برابر با None است. به همین دلیل، دیگر مشخص کردن آن‌ها ضروری نیست. گونه‌های collections.abc تعداد آرگومان‌های نوع را اعتبارسنجی نمی‌کنند؛ بنابراین مقادیر پیش‌فرض این موارد می‌تواند در نسخه‌های پیشین نیز استفاده شود.

پیوندهای مرتبط:

نکته:

این پیام توسط بررسی‌کنندهٔ اختیاری 'typing' <#pylint-extensions-typing> صادر می‌شود، که نیازمند بارگذاری پلاگین pylint.extensions.typing است.

ایجادشده توسط بررسی‌کنندهٔ typing https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/typing.py..SS unnecessary-dict-index-lookup / R1733

پیام صادرشده:

جستجوی غیرضروری اندیس دیکشنری، به‌جای آن از '%s' استفاده کنید

توضیحات:

هنگام پیمایش روی آیتم‌های دیکشنری (جفت‌های کلید-آیتم) و دسترسی به مقدار از طریق جستجوی اندیس صادر می‌شود. به‌جای این کار می‌توان مستقیماً به مقدار دسترسی داشت.

کد مشکل‌دار:

FRUITS = {"apple": 1, "orange": 10, "berry": 22}
for fruit_name, fruit_count in FRUITS.items():
    print(FRUITS[fruit_name])  # [unnecessary-dict-index-lookup]

کد صحیح:

FRUITS = {"apple": 1, "orange": 10, "berry": 22}
for fruit_name, fruit_count in FRUITS.items():
    print(fruit_count)

ایجادشده توسط بررسی‌کنندهٔ refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

جستجوی غیرضروری اندیس لیست، به‌جای آن از '%s' استفاده کنید

توضیحات:

هنگام پیمایش روی یک شمارش (enumeration) و دسترسی به مقدار از طریق جستجوی اندیس صادر می‌شود. به‌جای این کار می‌توان مستقیماً به مقدار دسترسی داشت.

کد مشکل‌دار:

letters = ["a", "b", "c"]
for index, letter in enumerate(letters):
    print(letters[index])  # [unnecessary-list-index-lookup]

کد صحیح:

letters = ["a", "b", "c"]
for index, letter in enumerate(letters):
    print(letter)

ایجادشده توسط بررسی‌کنندهٔ refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

به‌جای '%s(%s)' از یک مولد استفاده کنید

توضیحات:

استفاده از comprehension درون توابع 'any'، 'all'، 'max'، 'min' یا 'sum' غیرضروری است. یک مولد (generator) کافی بوده و سریع‌تر خواهد بود.

کد مشکل‌دار:

from random import randint
all([randint(-5, 5) > 0 for _ in range(10)])  # [use-a-generator]
any([randint(-5, 5) > 0 for _ in range(10)])  # [use-a-generator]

کد صحیح:

from random import randint
all(randint(-5, 5) > 0 for _ in range(10))
any(randint(-5, 5) > 0 for _ in range(10))

جزئیات تکمیلی:

با استفاده از یک مولد، می‌توانید درخت اجرا را کوتاه کرده و به‌جای محاسبهٔ همهٔ عناصر، مستقیماً در نخستین عنصری که برای all برابر با False یا برای any برابر با True است خارج شوید. به‌جز در بدترین حالت ممکن که در آن همچنان باید همه‌چیز ارزیابی شود (همهٔ مقادیر برای all برابر با True باشند یا همهٔ مقادیر برای any برابر با false باشند)، عملکرد بهتر خواهد بود.

پیوندهای مرتبط:

ایجادشده توسط بررسی‌کنندهٔ refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py..SS use-dict-literal / R1735

پیام صادرشده:

استفاده از '%s' را به‌جای فراخوانی 'dict' در نظر بگیرید.

توضیحات:

زمانی صادر می‌شود که برای ایجاد یک دیکشنری به‌جای لیترال '{ ... }' از ()dict استفاده شود. لیترال سریع‌تر است زیرا از یک فراخوانی تابع اضافی جلوگیری می‌کند.

کد دارای اشکال:

empty_dict.py:

empty_dict = dict()  # [use-dict-literal]

init_dict_from_another.py:

original_dict = {"name": "Sunny", "age": 10, "favorite_color": "yellow"}
copied_dict = dict(**original_dict)  # [use-dict-literal]

init_with_keyword.py:

response_dict = dict(answer="No")  # [use-dict-literal]

کد درست:

empty_dict.py:

empty_dict = {}

init_dict_from_another.py:

original_dict = {"name": "Sunny", "age": 10, "favorite_color": "yellow"}
# shallow copy a dict
copied_dict = {**original_dict}

init_with_literal.py:

response_dict = {"answer": "No"}

جزئیات بیشتر:

https://gist.github.com/hofrob/ad143aaa84c096f42489c2520a3875f9

این اسکریپت نمونه ۱۸٪ افزایش کارایی را هنگام استفاده از لیترال به‌جای سازنده در پایتون نسخهٔ 3.10.6 نشان می‌دهد.

پیوندهای مرتبط:

•
تحلیل کارایی ()dict در برابر لیترال دیکشنری در پایتون https://madebyme.today/blog/python-dict-vs-curly-brackets

ایجادشده توسط بازرس refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py..SS use-list-literal / R1734

پیام صادرشده:

استفاده از [] به‌جای ()list را در نظر بگیرید

توضیحات:

هنگامی صادر می‌شود که به‌جای لیترال []، از ()list برای ایجاد یک لیست خالی استفاده شود. لیترال سریع‌تر است زیرا از یک فراخوانی تابع اضافی جلوگیری می‌کند.

کد دارای مشکل:

empty_list = list()  # [use-list-literal]

کد درست:

empty_list = []

ایجادشده توسط بررسی‌کننده refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

استفاده از set را برای بررسی عضویت در نظر بگیرید

توضیحات:

بررسی‌های عضویت زمانی که روی یک نوع داده بهینه‌شده برای جستجو (مانند ``sets``) انجام شوند، کارآمدتر هستند.

کد دارای مشکل:

def fruit_is_dangerous_for_cat(fruit: str) -> bool:
    """This list is only a silly example, don't make decision regarding your cat diet based on it."""
    return fruit in ["cherry", "grapes"]  # [use-set-for-membership]

کد درست:

def fruit_is_dangerous_for_cat(fruit: str) -> bool:
    """This list is only a silly example, don't make decision regarding your cat diet based on it."""
    return fruit in {"cherry", "grapes"}

فایل پیکربندی:

[MAIN]
load-plugins=pylint.extensions.set_membership

نکته:

این پیام توسط بررسی‌کننده اختیاری 'set_membership' <#pylint-extensions-set-membership> صادر می‌شود، که نیازمند بارگذاری افزونه pylint.extensions.set_membership است.

ایجادشده توسط بررسی‌کننده set_membership https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/set_membership.py..SS use-yield-from / R1737

پیام صادرشده:

به‌جای بازگردانی تک‌تک عناصر، مستقیماً از 'yield from' استفاده کنید

توضیحات:

بازگردانی مستقیم از تکرارکننده (iterator) سریع‌تر بوده و مسلماً در مقایسه با بازگردانی تک‌تک عناصر در حلقه، کد تمیزتری است.

کد دارای مشکل:

def bad_yield_from(generator):
    for item in generator:  # [use-yield-from]
        yield item

کد درست:

def good_yield_from(generator):
    yield from generator

جزئیات تکمیلی:

می‌توان yield from را مانند حذف واسطه (حلقه for شما) میان فراخواننده تابع و مولد (generator) مورد درخواست دانست. این کار به فراخواننده امکان می‌دهد مستقیماً با مولد ارتباط برقرار کند (برای مثال با استفاده از send()). این ارتباط هنگام بازگردانی دستی تک‌تک عناصر در یک حلقه ممکن نیست.

سند PEP 380 امکان افزودن بهینه‌سازی‌های خاص به yield from را شرح می‌دهد. به نظر می‌رسد تا زمان نگارش این مطلب، این موارد پیاده‌سازی نشده‌اند. حتی بدون بهینه‌سازی‌های مذکور، قطعه‌کد زیر نشان می‌دهد که yield from اندکی سریع‌تر است.

$ python3 -m timeit "def yield_from(): yield from range(100)" "for _ in yield_from(): pass"
100000 loops, best of 5: 2.44 usec per loop
$ python3 -m timeit "def yield_loop():" "    for item in range(100): yield item" "for _ in yield_loop(): pass"
100000 loops, best of 5: 2.49 usec per loop

پیوندهای مرتبط:

ایجاد شده توسط بررسی‌کننده refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

پیام صادرشده:

کلاس %r از object ارث‌بری می‌کند، در python3 می‌توان با اطمینان آن را از پایه‌ها حذف کرد

توضیحات:

زمانی استفاده می‌شود که یک کلاس از object ارث‌بری کند؛ این مورد در python3 ضمنی است، بنابراین می‌توان با اطمینان آن را از کلاس‌های پایه حذف کرد.

کد دارای مشکل:

class Banana(object):  # [useless-object-inheritance]
    ...

کد درست:

class Banana: ...

ایجاد شده توسط بررسی‌کننده classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py..SS useless-return / R1711

پیام صادرشده:

دستور return بی‌فایده در پایان تابع یا متد

توضیحات:

زمانی صادر می‌شود که یک دستور مجزای "return" یا "return None" در انتهای تعریف تابع یا متد یافت شود. این دستور را می‌توان با اطمینان حذف کرد زیرا پایتون به‌طور ضمنی None را برمی‌گرداند.

کد دارای مشکل:

import sys
def print_python_version():  # [useless-return]
    print(sys.version)
    return None

کد صحیح:

import sys
def print_python_version():
    print(sys.version)

ایجادشده توسط بررسی‌کننده بازسازی ساختار (refactoring) https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.

تمام پیام‌های تغییرنام‌یافته در دسته‌بندی بازسازی ساختار (refactor):

پیام 'old-no-self-use' تغییر نام یافته است. پیام جدید را می‌توانید در اینجا بیابید:

پیام 'old-simplifiable-if-statement' تغییر نام یافته است. پیام جدید را می‌توانید در اینجا بیابید:

پیام 'old-too-many-nested-blocks' تغییر نام یافته است. پیام جدید را می‌توانید در اینجا بیابید:

تمام پیام‌ها در دسته‌بندی اطلاعات (information):

پیام صادرشده:

امکان در نظر گرفتن گزینه درون‌خطی %r وجود ندارد

توضیحات:

زمانی استفاده می‌شود که یک گزینه درون‌خطی قالب‌بندی نادرستی داشته باشد یا نتوان از آن در داخل ماژول‌ها استفاده کرد.

احتیاط:

این پیام به‌طور پیش‌فرض غیرفعال است. برای فعال‌سازی آن، bad-inline-option را به گزینه enable اضافه کنید.

احتیاط:

به‌طور پیش‌فرض، این پیام مانع از اجرای موفقیت‌آمیز نخواهد شد (pylint مقدار 0 را برمی‌گرداند). برای اینکه pylint با مواجهه با این پیام با خطا خارج شود، از گزینه --fail-on=I0010 یا --fail-on=I جهت توقف با تمام پیام‌های اطلاعاتیِ فعال‌شده استفاده کنید.

کد دارای مشکل:

# 2:[bad-inline-option]
# pylint: disable line-too-long

کد صحیح:

# pylint: disable=line-too-long

ایجادشده توسط بررسی‌کننده اصلی https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py..SS c-extension-no-member / I1101

پیام صادرشده:

عضو %r در %s %r وجود ندارد%s، اما کد منبع در دسترس نیست. اگر می‌خواهید تحلیل را بر پایهٔ درون‌نگری زمان اجرای اشیاء زنده انجام دهید، افزودن این ماژول به extension-pkg-allow-list را در نظر بگیرید.

توضیحات:

هنگامی استفاده می‌شود که از طریق یک متغیر، به عضوی ناموجود از یک افزونهٔ C دسترسی پیدا شود. به دلیل در دسترس نبودن کد منبع، تحلیل ایستا غیرممکن است، اما می‌تواند با درون‌نگری اشیاء زنده در زمان اجرا انجام شود.

هشدار:

به‌طور پیش‌فرض، این پیام مانع از اجرای موفق نخواهد شد (pylint مقدار 0 را برمی‌گرداند). برای اینکه pylint به ازای این پیام با خطا خارج شود، از گزینهٔ --fail-on=I1101 یا --fail-on=I برای خروج همراه با خطا در تمام پیام‌های اطلاعاتی فعال‌شده استفاده کنید.

جزئیات بیشتر:

c-extension-no-member یک گونهٔ اطلاعاتی از no-member است تا اجازه دادن به درون‌نگری افزونه‌های C را طبق آنچه در صفحهٔ https://pylint.readthedocs.io/en/latest/user_guide/messages/error/no-member.html برای no-member شرح داده شده، توصیه کند.

ایجادشده توسط بررسی‌کنندهٔ typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.

پیام صادرشده:

پراگمای "%s" منسوخ شده است، به‌جای آن از "%s" استفاده کنید

توضیحات:

برخی از گزینه‌های درون‌خطی pylint تغییر نام یافته یا بازنگری شده‌اند؛ فقط باید از جدیدترین شکل آن استفاده شود. یادداشت: skip-all فقط در pylint >= 0.26 در دسترس است

هشدار:

این پیام به‌طور پیش‌فرض غیرفعال است. برای فعال کردن آن، deprecated-pragma را به گزینهٔ enable اضافه کنید.

هشدار:

به‌طور پیش‌فرض، این پیام مانع از اجرای موفق نخواهد شد (pylint مقدار 0 را برمی‌گرداند). برای اینکه pylint به ازای این پیام با خطا خارج شود، از گزینهٔ --fail-on=I0022 یا --fail-on=I برای خروج همراه با خطا در تمام پیام‌های اطلاعاتی فعال‌شده استفاده کنید.

کد دارای مشکل:

# pylint: disable-msg=eval-used # [deprecated-pragma]

کد صحیح:

# pylint: disable = eval-used

ایجادشده توسط بررسی‌کنندهٔ اصلی https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py.

پیام صادرشده:

نادیده گرفتن کل فایل

توضیحات:

برای اعلام این‌که فایل بررسی نخواهد شد استفاده می‌شود

هشدار:

این پیام به‌طور پیش‌فرض غیرفعال است. برای فعال کردن آن، file-ignored را به گزینهٔ enable اضافه کنید.

هشدار:

به‌طور پیش‌فرض، این پیام مانع از اجرای موفق نخواهد شد (pylint مقدار 0 را برمی‌گرداند). برای اینکه pylint به ازای این پیام با خطا خارج شود، از گزینهٔ --fail-on=I0013 یا --fail-on=I برای خروج همراه با خطا در تمام پیام‌های اطلاعاتی فعال‌شده استفاده کنید.

کد دارای مشکل:

# pylint: skip-file
# -1: [file-ignored]

کد صحیح:

جزئیات بیشتر:

اگر فایلی با # pylint: skip-file شروع شود، اصلاً هیچ بررسی‌ای روی آن انجام نمی‌گیرد.

ایجادشده توسط بررسی‌کنندهٔ اصلی https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py..SS locally-disabled / I0011

پیام صادرشده:

غیرفعال‌سازی محلی %s (%s)

توضیحات:

زمانی استفاده می‌شود که یک گزینهٔ درون‌خطی یک پیام یا یک دسته از پیام‌ها را غیرفعال کند.

هشدار:

این پیام به‌طور پیش‌فرض غیرفعال است. برای فعال کردن آن، locally-disabled را به گزینهٔ enable اضافه کنید.

هشدار:

به‌طور پیش‌فرض، این پیام مانع از اجرای موفق نخواهد شد (pylint مقدار 0 را برمی‌گرداند). برای خروج با خطا در مواجهه با این پیام از گزینهٔ --fail-on=I0011 یا --fail-on=I برای خروج با خطا روی تمام پیام‌های اطلاعاتی فعال‌شده استفاده کنید.

کد دارای مشکل:

def wizard_spells(spell_book):
    # pylint: disable=maybe-no-member # [locally-disabled]
    for spell in spell_book:
        print(f"Abracadabra! {spell}.")
spell_list = ["Levitation", "Invisibility", "Fireball", "Teleportation"]
wizard_spells(spell_list)

کد صحیح:

def wizard_spells(spell_book):
    for spell in spell_book:
        print(f"Abracadabra! {spell}.")
spell_list = ["Levitation", "Invisibility", "Fireball", "Teleportation"]
wizard_spells(spell_list)

ایجادشده توسط بررسی‌کنندهٔ اصلی https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py.

پیام صادرشده:

عدم امکان اجرای بررسی‌کننده‌های خام روی ماژول توکار %s

توضیحات:

برای اطلاع از این‌که یک ماژول توکار توسط بررسی‌کننده‌های خام بررسی نشده است، استفاده می‌شود.

هشدار:

این پیام به‌طور پیش‌فرض غیرفعال است. برای فعال کردن آن، raw-checker-failed را به گزینهٔ enable اضافه کنید.

هشدار:

به‌طور پیش‌فرض، این پیام مانع از اجرای موفق نخواهد شد (pylint مقدار 0 را برمی‌گرداند). برای خروج با خطا در مواجهه با این پیام از گزینهٔ --fail-on=I0001 یا --fail-on=I برای خروج با خطا روی تمام پیام‌های اطلاعاتی فعال‌شده استفاده کنید.

جزئیات تکمیلی:

این پیام هشدار می‌دهد که تحلیل یک ماژول توکار غیرممکن بوده است (یک گره ast از نوع پایتون خالص نیست). نیازی به تغییر چیزی در کد شما نیست؛ این هشداری دربارهٔ محدودیت‌های astroid و pylint است.

ایجادشده توسط بررسی‌کنندهٔ اصلی https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py..SS suppressed-message / I0020

پیام صادرشده:

Suppressed %s (from line %d)

توضیحات:

پیامی روی یک سطر فعال شده، اما صریحاً توسط یک کامنت disable= در فایل سرکوب شده است. این پیام برای پیام‌هایی که به دلیل تنظیمات پیکربندی نادیده گرفته می‌شوند، تولید نمی‌شود.

هشدار:

این پیام به‌طور پیش‌فرض غیرفعال است. برای فعال‌سازی آن، suppressed-message را به گزینهٔ enable اضافه کنید.

هشدار:

به‌طور پیش‌فرض، این پیام مانع از اجرای موفق نخواهد شد (pylint مقدار 0 را برمی‌گرداند). برای اینکه pylint به ازای این پیام با خطا مواجه شود، از گزینهٔ --fail-on=I0020 یا --fail-on=I جهت توقف با خطا روی تمامی پیام‌های اطلاعاتی فعال‌شده استفاده کنید.

کد دارای مشکل:

### This is a contrived example, to show how suppressed-message works.
### First we enable all messages
# pylint: enable=all
### Here we disable two messages so we get two warnings
# pylint: disable=locally-disabled, useless-suppression # [suppressed-message, suppressed-message]
### Here we disable a message, so we get a warning for suppressed-message again.
"A"  # pylint: disable=pointless-statement # [suppressed-message, suppressed-message]

کد تصحیح‌شده:

"""Instead of a single string somewhere in the file, write a module docstring!"""

جزئیات تکمیلی:

suppressed-message صرفاً روشی برای مشاهدهٔ پیام‌هایی است که در صورت عدم وجود disable در پایگاه کد شما نمایش داده می‌شدند. در بیشتر موارد نیازی به فعال‌سازی آن نیست. همچنین اگر می‌خواهید پیام‌هایی را مشاهده کنید که بدون دلیل غیرفعال شده‌اند، useless-suppression را ببینید.

ایجادشده توسط بازبین اصلی (checker) در https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py.

پیام صادرشده:

%s

توضیحات:

زمانی استفاده می‌شود که یک پیام بر اساس شناسه (id) فعال یا غیرفعال شده باشد.

هشدار:

این پیام به‌طور پیش‌فرض غیرفعال است. برای فعال‌سازی آن، use-symbolic-message-instead را به گزینهٔ enable اضافه کنید.

هشدار:

به‌طور پیش‌فرض، این پیام مانع از اجرای موفق نخواهد شد (pylint مقدار 0 را برمی‌گرداند). برای اینکه pylint به ازای این پیام با خطا مواجه شود، از گزینهٔ --fail-on=I0023 یا --fail-on=I جهت توقف با خطا روی تمامی پیام‌های اطلاعاتی فعال‌شده استفاده کنید.

کد دارای مشکل:

fruit_name = "plum"
# pylint: disable-next=W0621
def eat(fruit_name: str):  # [use-symbolic-message-instead]
    ...

کد تصحیح‌شده:

fruit_name = "plum"
# pylint: disable-next=redefined-outer-name
def eat(fruit_name: str): ...

ایجادشده توسط بازبین متفرقه (miscellaneous) در https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/misc.py..SS useless-suppression / I0021

پیام صادرشده:

فرونشانی بی‌استفاده از %s

توضیحات:

زمانی گزارش می‌شود که پیامی به‌طور صریح برای یک خط یا بلوکی از کد غیرفعال شده باشد، اما هرگز رخ ندهد.

هشدار:

این پیام به‌طور پیش‌فرض غیرفعال است. برای فعال‌سازی آن، useless-suppression را به گزینهٔ enable اضافه کنید.

هشدار:

به‌طور پیش‌فرض، این پیام موجب شکست در اجرا نخواهد شد (pylint مقدار 0 را بازمی‌گرداند). برای اینکه pylint به دلیل این پیام با خطا متوقف شود از گزینهٔ --fail-on=I0021 یا --fail-on=I جهت شکست در صورت وقوع تمامی پیام‌های اطلاعاتیِ فعال‌شده استفاده کنید.

کد دارای مشکل:

fruit_counter = 0
# pylint: disable-next=redefined-outer-name
def eat(fruit_name: str):  # [useless-suppression]
    ...

کد درست:

fruit_counter = 0
def eat(fruit_name: str): ...

ایجادشده توسط بررسی‌کنندهٔ اصلی https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py.

تمامی پیام‌های تغییرنام‌یافته در دسته‌بندی اطلاعات:

پیام 'deprecated-disable-all' تغییر نام یافته است. پیام جدید را می‌توانید در این آدرس بیابید:

به منظور کنترل پیام‌ها، pylint مقادیر زیر را می‌پذیرد:

  • یک پیام نمادین: no-member، undefined-variable و غیره.
  • یک شناسهٔ عددی: E1101، E1102 و غیره.
  • نام گروهی از بررسی‌ها. می‌توانید آن‌ها را با pylint --list-groups به دست آورید. برای مثال، می‌توانید تمام بررسی‌های مربوط به بررسی نوع را با typecheck یا تمام بررسی‌های مربوط به متغیرها را با variables غیرفعال / فعال کنید.
  • دسته‌بندی متناظر بررسی‌ها
  • C بررسی‌های مربوط به شیوه‌نامه‌ها و قراردادها (convention)
  • R بررسی‌های مربوط به بازنویسی و بازسازی کد (refactoring)
  • W هشدارهای گوناگون (warnings)
  • E خطاها، برای باگ‌های احتمالی در کد (errors)
  • F خطای مهلک (fatal)، در صورتی که خطایی مانع از ادامهٔ پردازش توسط pylint شود.
•
تمامی بررسی‌ها با all

این بخش نحوهٔ عملکرد کنترل‌های پراگما را در سطح کد شرح می‌دهد.

کنترل‌های پراگما می‌توانند موارد زیر را غیرفعال / فعال کنند:

•
تمامی تخطی‌ها در یک خط واحد
a, b = ... # pylint: disable=unbalanced-tuple-unpacking
•
تمامی تخطی‌ها در خط بعدی
# pylint: disable-next=unbalanced-tuple-unpacking
a, b = ...
•
تمامی تخطی‌ها در یک حوزه (scope)
def test():
    # Disable all the no-member violations in this function
    # pylint: disable=no-member
    ...
•
تمامی تخطی‌ها در یک بلوک. برای نمونه، هر شاخهٔ مجزا از یک دستور if یک بلوک جداگانه در نظر گرفته می‌شود، همان‌طور که در مثال زیر آمده است:
def meth5(self):
    # pylint: disable=no-member
    # no error
    print(self.bla)
    if self.blop:
        # pylint: enable=no-member
        # enable all no-members for this block
        print(self.blip)
    else:
        # This is affected by the scope disable
        print(self.blip)
    # pylint: enable=no-member
    print(self.blip)
    if self.blop:
        # pylint: disable=no-member
        # disable all no-members for this block
        print(self.blip)
    else:
        # This emits a violation
        print(self.blip)
•
اگر تخطی در خط آغازین یک بلوک رخ دهد، تنها بر همان خط اعمال می‌شود
if self.blop: # pylint: disable=no-member; applies only to this line
    # Here we get an error
    print(self.blip)
else:
    # error
    print(self.blip)

در اینجا مثالی آورده شده است که تمام این قواعد را یک‌جا نشان می‌دهد:

"""pylint option block-disable"""
__revision__ = None
class Foo(object):
    """block-disable test"""
    def __init__(self):
        pass
    def meth1(self, arg):
        """this issues a message"""
        print(self)
    def meth2(self, arg):
        """and this one not"""
        # pylint: disable=unused-argument
        print(self\
              + "foo")
    def meth3(self):
        """test one line disabling"""
        # no error
        print(self.bla) # pylint: disable=no-member
        # error
        print(self.blop)
    def meth4(self):
        """test re-enabling"""
        # pylint: disable=no-member
        # no error
        print(self.bla)
        print(self.blop)
        # pylint: enable=no-member
        # error
        print(self.blip)
    def meth5(self):
        """test IF sub-block re-enabling"""
        # pylint: disable=no-member
        # no error
        print(self.bla)
        if self.blop:
            # pylint: enable=no-member
            # error
            print(self.blip)
        else:
            # no error
            print(self.blip)
        # no error
        print(self.blip)
    def meth6(self):
        """test TRY/EXCEPT sub-block re-enabling"""
        # pylint: disable=no-member
        # no error
        print(self.bla)
        try:
            # pylint: enable=no-member
            # error
            print(self.blip)
        except UndefinedName: # pylint: disable=undefined-variable
            # no error
            print(self.blip)
        # no error
        print(self.blip)
    def meth7(self):
        """test one line block opening disabling"""
        if self.blop: # pylint: disable=no-member
            # error
            print(self.blip)
        else:
            # error
            print(self.blip)
        # error
        print(self.blip)
    def meth8(self):
        """test late disabling"""
        # error
        print(self.blip)
        # pylint: disable=no-member
        # no error
        print(self.bla)
        print(self.blop)
    def meth9(self):
        """test next line disabling"""
        # no error
        # pylint: disable-next=no-member
        print(self.bla)
        # error
        print(self.blop)

همان‌طور که pylint بهبود می‌یابد و موارد مثبت کاذب (false positives) برطرف می‌شوند، غیرفعال‌سازی‌هایی که بی‌استفاده شده‌اند می‌توانند انباشته شده و کد را نامرتب کنند. به منظور پاک‌سازی آن‌ها، می‌توانید هشدار useless-suppression را فعال کنید.

ابزار Pylint می‌تواند پیام‌های گوناگونی صادر کند. این پیام‌ها بر اساس دسته‌های متناظر با کدهای خروج کدگذاری‌شده با بیت (bit-encoded) طبقه‌بندی می‌شوند:

  • Fatal <#fatal-category> (1)
  • Error <#error-category> (2)
  • Warning <#warning-category> (4)
  • Convention <#convention-category> (8)
  • Refactor <#refactor-category> (16)
  • Information <#information-category> (NA)

نمای کلی این پیام‌ها را می‌توان در بخش Messages overview <#messages-overview> یافت.

ابزار pylint سازوکار پیشرفته‌ای برای کنترل پیام‌های بررسی‌های خود دارد و امکان فعال یا غیرفعال کردن پیام‌ها را چه از خط فرمان، چه از فایل پیکربندی و همچنین از داخل خود کد فراهم می‌کند.

برای جزئیات بیشتر Messages control <#message-control> را ببینید.

ابزار Pylint بسیار پیکربندی‌پذیر است. گزینه‌های فراوانی برای برآورده کردن نیازهای پروژه‌های گوناگون و بررسی‌های پرشماری برای فعال‌سازی در صورت سازگاری با شیوه نگارش شما وجود دارد.

می‌توانید یک فایل پیکربندی نمونه را با --generate-toml-config یا --generate-rcfile ایجاد کنید. هر گزینه‌ای که پیش از این در خط فرمان مشخص شده باشد، در این فایل گنجانده خواهد شد.

برای نمونه:

pylint --disable=bare-except,invalid-name --class-rgx='[A-Z][a-z]+' --generate-toml-config

در عمل، اغلب بهتر است یک فایل پیکربندی حداقلی بسازید که تنها شامل بازنویسی‌های پیکربندی (overrides) باشد. برای سایر گزینه‌ها، Pylint از مقادیر پیش‌فرض خود استفاده خواهد کرد.

نکته:

سازوکارهای درونی که فایل‌های پیکربندی را می‌سازند، در صورتی که مقدار دیگری تعیین نشده باشد، به مقادیر پیش‌فرض بازمی‌گردند. این بدان معناست که برخی مقادیر به مفسری که برای ایجاد فایل استفاده شده است بستگی دارند؛ به‌ویژه py-version که پیش‌فرض آن مفسر کنونی است.

تحلیل بلوک‌های جایگزین وارد کردن (import fallback blocks). این گزینه می‌تواند برای پشتیبانی از کدهای سازگار با هر دو نسخه پایتون ۲ و ۳ استفاده شود، به این معنی که بلوک ممکن است کدی داشته باشد که فقط در یکی از مفسرها وجود دارد و هنگام تحلیل، منجر به موارد مثبت کاذب شود.

پیش‌فرض: False

پاک‌سازی حافظه‌های موقت درون‌حافظه‌ای (in-memory caches) پس از پایان بررسی کد (linting). در صورت اجرای pylint در حالتی شبیه به سرور مفید است.

پیش‌فرض: False

تنها نمایش هشدارهایی با سطوح اطمینان فهرست‌شده. برای نمایش همه، این مقدار را خالی بگذارید. سطوح معتبر: HIGH، CONTROL_FLOW، INFERENCE، INFERENCE_FAILURE، UNDEFINED.

پیش‌فرض: ['HIGH', 'CONTROL_FLOW', 'INFERENCE', 'INFERENCE_FAILURE', 'UNDEFINED'].SS --disable

پیام، گزارش، دسته‌بندی یا بررسی‌کننده (checker) با شناسه‌(های) داده‌شده را غیرفعال می‌کند. می‌توانید چندین شناسه را با ویرگول (,) جدا کنید یا این گزینه را چندین بار به کار ببرید (تنها در خط فرمان، نه در فایل پیکربندی که در آن باید فقط یک بار بیاید). همچنین می‌توانید از "--disable=all" برای غیرفعال‌سازی همه‌چیز در ابتدا و سپس فعال‌سازی مجدد بررسی‌های مشخص استفاده کنید. به عنوان مثال، اگر می‌خواهید تنها بررسی‌کننده شباهت‌ها را اجرا کنید، می‌توانید از "--disable=all --enable=similarities" بهره ببرید. اگر می‌خواهید تنها بررسی‌کننده کلاس‌ها اجرا شود اما هیچ پیامی در سطح Warning نمایش داده نشود، از "--disable=all --enable=classes --disable=W" استفاده کنید.

پیش‌فرض: ()

پیام، گزارش، دسته‌بندی یا بررسی‌کننده با شناسه‌(های) داده‌شده را فعال می‌کند. می‌توانید چندین شناسه را با ویرگول (,) جدا کرده یا این گزینه را چندین بار درج کنید (تنها در خط فرمان، نه در فایل پیکربندی که در آن باید فقط یک بار بیاید). برای مثال‌ها گزینه "--disable" را نیز ببینید.

پیش‌فرض: ()

عبارت پایتونی که باید امتیازی کمتر یا مساوی ۱۰ بازگرداند. شما به متغیرهای 'fatal'، 'error'، 'warning'، 'refactor'، 'convention' و 'info' که شامل تعداد پیام‌ها در هر دسته‌بندی هستند، و همچنین 'statement' که تعداد کل دستورهای تحلیل‌شده است دسترسی دارید. این امتیاز توسط گزارش ارزیابی سراسری (RP0004) استفاده می‌شود.

پیش‌فرض: max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10))

همیشه یک کد وضعیت 0 (غیرخطا) بازمی‌گرداند، حتی اگر خطاهای lint پیدا شوند. این قابلیت اساساً در اسکریپت‌های یکپارچه‌سازی مداوم (CI) مفید است.

پیش‌فرض: False

فهرستی جداشده با ویرگول از نام بسته‌ها یا ماژول‌هایی که افزونه‌های C ممکن است از آن‌ها بارگذاری شوند. افزونه‌ها در مفسر فعال پایتون بارگذاری می‌شوند و ممکن است کدهای دلخواه را اجرا کنند.

پیش‌فرض: []

فهرستی جداشده با ویرگول از نام بسته‌ها یا ماژول‌هایی که افزونه‌های C ممکن است از آن‌ها بارگذاری شوند. افزونه‌ها در مفسر فعال پایتون بارگذاری می‌شوند و ممکن است کدهای دلخواه را اجرا کنند. (این نامی جایگزین برای extension-pkg-allow-list جهت سازگاری با نسخه‌های پیشین است.)

پیش‌فرض: []

اگر هر یک از این پیام‌ها/دسته‌بندی‌ها شناسایی شوند، کد خروج غیرصفر بازمی‌گرداند، حتی اگر امتیاز بالاتر از مقدار --fail-under باشد. نحو نگارش آن مشابه enable است. پیام‌های مشخص‌شده فعال می‌شوند، در حالی که دسته‌بندی‌ها تنها پیام‌های از پیش فعال‌شده را بررسی می‌کنند.

پیش‌فرض: ""

آستانه امتیازی را مشخص می‌کند که پایین‌تر از آن، برنامه با خطا خارج خواهد شد.

پیش‌فرض: 10

ورودی استاندارد (stdin) را به عنوان یک اسکریپت پایتون تفسیر می‌کند که نام فایل آن باید به عنوان آرگومان module_or_package فرستاده شود.

پیش‌فرض: False

فایل‌ها یا دایرکتوری‌هایی که باید نادیده گرفته شوند. این موارد باید نام پایه (base name) باشند، نه مسیر کامل.

پیش‌فرض: ('CVS',)

افزودن فایل‌ها یا دایرکتوری‌های منطبق بر الگوهای عبارات منظم (regex) به فهرست نادیده‌گرفته‌شده‌ها (ignore-list). عبارت منظم در برابر مسیرها سنجیده می‌شود و می‌تواند در قالب Posix یا Windows باشد. از آنجا که '\' در سامانه‌های Windows نشان‌دهنده جداکننده دایرکتوری است، نمی‌تواند به عنوان نویسه گریز (escape character) استفاده شود.

پیش‌فرض: []

فایل‌ها یا دایرکتوری‌های منطبق بر الگوهای عبارات منظم نادیده گرفته می‌شوند. عبارت منظم با نام‌های پایه سنجیده می‌شود، نه مسیرها. مقدار پیش‌فرض، قفل‌های فایل Emacs را نادیده می‌گیرد.

پیش‌فرض: (re.compile('^\\.#'),)

فهرستی از نام ماژول‌هایی که صفت‌های عضو آن‌ها نباید بررسی شود و وارد (import) نخواهند شد (برای ماژول‌ها/پروژه‌هایی که در آن‌ها فضاهای نام در زمان اجرا دستکاری می‌شوند و بنابراین صفت‌های عضو موجود از طریق تحلیل ایستا قابل استنتاج نیستند مفید است). این گزینه از نام‌های واجد شرایط (qualified) ماژول و همچنین تطبیق الگوی یونیکس پشتیبانی می‌کند.

پیش‌فرض: ()

استفاده از چند پردازش برای افزایش سرعت Pylint. مشخص کردن 0 باعث شناسایی خودکار تعداد پردازنده‌های در دسترس برای استفاده می‌شود و در Windows تعداد را محدود می‌کند تا از قفل شدن برنامه جلوگیری شود.

پیش‌فرض: 1

مهار تعداد مقادیر استنتاج‌شده بالقوه هنگام استنتاج یک شیء منفرد. این کار می‌تواند به بهبود عملکرد هنگام کار با توابع بزرگ یا شرایط تودرتو و پیچیده کمک کند.

پیش‌فرض: 100

فهرستی از پلاگین‌ها (به صورت مقادیر جداشده با ویرگول از نام ماژول‌های پایتون) برای بارگذاری، معمولاً جهت ثبت بررسی‌کننده‌های اضافی.

پیش‌فرض: ().SS --msg-template

قالب مورد استفاده برای نمایش پیام‌ها. این یک رشته قالب‌بندی سبک جدید پایتون (new-style format string) است که برای قالب‌بندی اطلاعات پیام استفاده می‌شود. برای تمام جزئیات به مستندات مراجعه کنید.

پیش‌فرض: ""

تعیین قالب خروجی. قالب‌های موجود عبارتند از: 'text'، 'parseable'، 'colorized'، 'json2' (قالب json بهبودیافته)، 'json' (قالب json قدیمی)، msvs (ویژوال استودیو) و 'github' (GitHub actions). همچنین می‌توانید یک کلاس گزارش‌گر مشخص کنید، به عنوان مثال mypackage.mymodule.MyReporterClass.

پیش‌فرض: text

ذخیره (pickle) داده‌های جمع‌آوری‌شده برای مقایسه‌های بعدی.

پیش‌فرض: True

ارجاع واردسازی‌ها (imports) به استاب‌های pyi. در صورت موجود بودن. ممکن است پیام‌های no-member را کاهش داده و پیام‌های not-an-iterable را افزایش دهد.

پیش‌فرض: False

حداقل نسخه پایتون جهت استفاده در بررسی‌های وابسته به نسخه. پیش‌فرض، نسخه‌ای است که برای اجرای pylint استفاده شده است.

پیش‌فرض: sys.version_info[:2]

کشف و شناسایی ماژول‌ها و بسته‌های پایتون در زیردرخت سیستم فایل.

پیش‌فرض: False

مشخص می‌کند که آیا یک گزارش کامل نمایش داده شود یا فقط پیام‌ها.

پیش‌فرض: False

فعال کردن امتیاز ارزیابی.

پیش‌فرض: True

افزودن مسیرها به فهرست ریشه‌های سورس (source roots). از الگوهای تطبیق مسیر (globbing) پشتیبانی می‌کند. ریشه سورس یک مسیر مطلق یا نسبی نسبت به دایرکتوری کاری فعلی است که برای تعیین فضای‌نام بسته (package namespace) برای ماژول‌های واقع در زیر آن ریشه استفاده می‌شود.

پیش‌فرض: ()

اجازه بارگذاری افزونه‌های دلخواه C. افزونه‌ها به درون مفسر فعال پایتون وارد شده (import) و ممکن است کدهای دلخواه را اجرا کنند.

پیش‌فرض: False

نکته: فقط tool.pylint الزامی است، عنوان بخش الزامی نیست. این‌ها مقادیر پیش‌فرض هستند.

[tool.pylint.main]
analyse-fallback-blocks = false
clear-cache-post-run = false
confidence = ["HIGH", "CONTROL_FLOW", "INFERENCE", "INFERENCE_FAILURE", "UNDEFINED"]
disable = ["bad-inline-option", "consider-using-augmented-assign", "deprecated-pragma", "file-ignored", "locally-disabled", "prefer-typing-namedtuple", "raw-checker-failed", "suppressed-message", "use-implicit-booleaness-not-comparison-to-string", "use-implicit-booleaness-not-comparison-to-zero", "use-symbolic-message-instead", "useless-suppression"]
enable = []
evaluation = "max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10))"
exit-zero = false
extension-pkg-allow-list = []
extension-pkg-whitelist = []
fail-on = []
fail-under = 10
from-stdin = false
ignore = ["CVS"]
ignore-paths = []
ignore-patterns = ["^\\.#"]
ignored-modules = []
jobs = 1
limit-inference-results = 100
load-plugins = []
msg-template = ""
# output-format =
persistent = true
prefer-stubs = false
py-version = "sys.version_info[:2]"
recursive = false
reports = false
score = true
source-roots = []
unsafe-load-any-extension = false

سبک نام‌گذاری منطبق با نام‌های صحیح آرگومان.

پیش‌فرض: snake_case

عبارت باقاعده منطبق با نام‌های صحیح آرگومان. بر argument-naming-style اولویت دارد. در صورت خالی ماندن، نام‌های آرگومان با سبک نام‌گذاری تعیین‌شده بررسی خواهند شد.

پیش‌فرض: None

سبک نام‌گذاری منطبق با نام‌های صحیح صفت‌ها.

پیش‌فرض: snake_case

عبارت باقاعده منطبق با نام‌های صحیح صفت‌ها. بر attr-naming-style اولویت دارد. در صورت خالی ماندن، نام‌های صفت با سبک نام‌گذاری تعیین‌شده بررسی خواهند شد.

پیش‌فرض: None

نام‌های نامناسب متغیر که همیشه باید رد شوند، جداشده با کاما.

پیش‌فرض: ('foo', 'bar', 'baz', 'toto', 'tutu', 'tata')

عبارت‌های باقاعده نام‌های نامناسب متغیر، جداشده با کاما. در صورتی که نام‌ها با هر عبارت باقاعده‌ای تطابق داشته باشند، همواره رد خواهند شد

پیش‌فرض: ""

سبک نام‌گذاری منطبق با نام‌های صحیح صفت‌های کلاس.

پیش‌فرض: any

عبارت باقاعده منطبق با نام‌های صحیح صفت‌های کلاس. بر class-attribute-naming-style اولویت دارد. در صورت خالی ماندن، نام‌های صفت کلاس با سبک نام‌گذاری تعیین‌شده بررسی خواهند شد.

پیش‌فرض: None

سبک نام‌گذاری منطبق با نام‌های صحیح ثابت‌های کلاس.

پیش‌فرض: UPPER_CASE

عبارت باقاعده منطبق با نام‌های صحیح ثابت‌های کلاس. بر class-const-naming-style اولویت دارد. در صورت خالی ماندن، نام‌های ثابت کلاس با سبک نام‌گذاری تعیین‌شده بررسی خواهند شد.

پیش‌فرض: None

سبک نام‌گذاری منطبق با نام‌های صحیح کلاس.

پیش‌فرض: PascalCase

عبارت باقاعده منطبق با نام‌های صحیح کلاس. بر class-naming-style اولویت دارد. در صورت خالی ماندن، نام‌های کلاس با سبک نام‌گذاری تعیین‌شده بررسی خواهند شد.

پیش‌فرض: None

سبک نام‌گذاری منطبق با نام‌های صحیح ثابت‌ها.

پیش‌فرض: UPPER_CASE

عبارت باقاعده منطبق با نام‌های صحیح ثابت‌ها. بر const-naming-style اولویت دارد. در صورت خالی ماندن، نام‌های ثابت با سبک نام‌گذاری تعیین‌شده بررسی خواهند شد.

پیش‌فرض: None

حداقل طول خطوط برای توابع/کلاس‌هایی که نیازمند docstring هستند؛ موارد کوتاه‌تر معاف هستند.

پیش‌فرض: -1

سبک نام‌گذاری منطبق با نام‌های صحیح توابع.

پیش‌فرض: snake_case.SS --function-rgx

عبارت باقاعده منطبق بر نام‌های صحیح توابع. بر function-naming-style ارجحیت دارد. در صورت خالی ماندن، نام‌های توابع با سبک نام‌گذاری تعیین‌شده بررسی خواهند شد.

پیش‌فرض: None

نام‌های متغیر مناسب که همواره باید پذیرفته شوند، جداشده با کاما.

پیش‌فرض: ('i', 'j', 'k', 'ex', 'Run', '_')

عبارت‌های باقاعده نام‌های متغیر مناسب، جداشده با کاما. در صورتی که نام‌ها با هر یک از عبارت‌های باقاعده مطابقت داشته باشند، همواره پذیرفته خواهند شد.

پیش‌فرض: ""

گنجاندن یک راهنما برای قالب نام‌گذاری صحیح همراه با invalid-name.

پیش‌فرض: False

سبک نام‌گذاری منطبق بر نام‌های صحیح تکرار درون‌خطی (inline iteration).

پیش‌فرض: any

عبارت باقاعده منطبق بر نام‌های صحیح تکرار درون‌خطی. بر inlinevar-naming-style ارجحیت دارد. در صورت خالی ماندن، نام‌های تکرار درون‌خطی با سبک نام‌گذاری تعیین‌شده بررسی خواهند شد.

پیش‌فرض: None

سبک نام‌گذاری منطبق بر نام‌های صحیح متدها.

پیش‌فرض: snake_case

عبارت باقاعده منطبق بر نام‌های صحیح متدها. بر method-naming-style ارجحیت دارد. در صورت خالی ماندن، نام‌های متدها با سبک نام‌گذاری تعیین‌شده بررسی خواهند شد.

پیش‌فرض: None

سبک نام‌گذاری منطبق بر نام‌های صحیح ماژول‌ها.

پیش‌فرض: snake_case

عبارت باقاعده منطبق بر نام‌های صحیح ماژول‌ها. بر module-naming-style ارجحیت دارد. در صورت خالی ماندن، نام‌های ماژول‌ها با سبک نام‌گذاری تعیین‌شده بررسی خواهند شد.

پیش‌فرض: None

مجموعه‌هایی از نام‌ها که با دو‌نقطه از هم جدا شده‌اند و هنگامی که عبارت‌های باقاعده نام، چندین سبک را مجاز می‌دانند، سبک نام‌گذاری یکدیگر را تعیین می‌کنند.

پیش‌فرض: ()

عبارت باقاعده‌ای که تنها باید با نام‌های توابع یا کلاس‌هایی مطابقت داشته باشد که نیازی به docstring ندارند.

پیش‌فرض: re.compile('^_')

عبارت باقاعده منطبق بر نام‌های صحیح متغیرهای مشخصات پارامتر (parameter specification). در صورت خالی ماندن، نام‌های متغیر مشخصات پارامتر با سبک نام‌گذاری تعیین‌شده بررسی خواهند شد.

پیش‌فرض: None

فهرستی از دکوراتورها که ویژگی (property) تولید می‌کنند، مانند abc.abstractproperty. برای ثبت دکوراتورهای دیگری که ویژگی‌های معتبر ایجاد می‌کنند به این فهرست اضافه کنید. این دکوراتورها فقط برای invalid-name در نظر گرفته می‌شوند.

پیش‌فرض: ('abc.abstractproperty',)

عبارت باقاعده منطبق بر نام‌های صحیح نام‌های مستعار نوع (type alias). در صورت خالی ماندن، نام‌های مستعار نوع با سبک نام‌گذاری تعیین‌شده بررسی خواهند شد.

پیش‌فرض: None

عبارت باقاعده منطبق بر نام‌های صحیح متغیرهای نوع (type variable). در صورت خالی ماندن، نام‌های متغیرهای نوع با سبک نام‌گذاری تعیین‌شده بررسی خواهند شد.

پیش‌فرض: None.SS --typevartuple-rgx

عبارت باقاعده برای تطبیق با نام‌های درست چندتایی متغیر نوع (type variable tuple). اگر خالی رها شود، نام‌های چندتایی متغیر نوع با سبک نام‌گذاری تعیین‌شده بررسی خواهند شد.

پیش‌فرض: None

سبک نام‌گذاری منطبق با نام‌های درست متغیر.

پیش‌فرض: snake_case

عبارت باقاعده برای تطبیق با نام‌های درست متغیر. بر variable-naming-style ارجحیت دارد. اگر خالی رها شود، نام‌های متغیر با سبک نام‌گذاری تعیین‌شده بررسی خواهند شد.

پیش‌فرض: None

نکته: تنها tool.pylint الزامی است، عنوان بخش الزامی نیست. این‌ها مقادیر پیش‌فرض هستند.

[tool.pylint.basic]
# Possible choices: ['snake_case', 'camelCase', 'PascalCase', 'UPPER_CASE', 'any']
argument-naming-style = "snake_case"
# argument-rgx =
# Possible choices: ['snake_case', 'camelCase', 'PascalCase', 'UPPER_CASE', 'any']
attr-naming-style = "snake_case"
# attr-rgx =
bad-names = ["foo", "bar", "baz", "toto", "tutu", "tata"]
bad-names-rgxs = []
# Possible choices: ['snake_case', 'camelCase', 'PascalCase', 'UPPER_CASE', 'any']
class-attribute-naming-style = "any"
# class-attribute-rgx =
# Possible choices: ['snake_case', 'camelCase', 'PascalCase', 'UPPER_CASE', 'any']
class-const-naming-style = "UPPER_CASE"
# class-const-rgx =
# Possible choices: ['snake_case', 'camelCase', 'PascalCase', 'UPPER_CASE', 'any']
class-naming-style = "PascalCase"
# class-rgx =
# Possible choices: ['snake_case', 'camelCase', 'PascalCase', 'UPPER_CASE', 'any']
const-naming-style = "UPPER_CASE"
# const-rgx =
docstring-min-length = -1
# Possible choices: ['snake_case', 'camelCase', 'PascalCase', 'UPPER_CASE', 'any']
function-naming-style = "snake_case"
# function-rgx =
good-names = ["i", "j", "k", "ex", "Run", "_"]
good-names-rgxs = []
include-naming-hint = false
# Possible choices: ['snake_case', 'camelCase', 'PascalCase', 'UPPER_CASE', 'any']
inlinevar-naming-style = "any"
# inlinevar-rgx =
# Possible choices: ['snake_case', 'camelCase', 'PascalCase', 'UPPER_CASE', 'any']
method-naming-style = "snake_case"
# method-rgx =
# Possible choices: ['snake_case', 'camelCase', 'PascalCase', 'UPPER_CASE', 'any']
module-naming-style = "snake_case"
# module-rgx =
name-group = []
no-docstring-rgx = "^_"
# paramspec-rgx =
property-classes = ["abc.abstractproperty"]
# typealias-rgx =
# typevar-rgx =
# typevartuple-rgx =
# Possible choices: ['snake_case', 'camelCase', 'PascalCase', 'UPPER_CASE', 'any']
variable-naming-style = "snake_case"
# variable-rgx =

هشدار درباره دسترسی به مشخصه‌های محافظت‌شده درون متدهای ویژه

پیش‌فرض: False

فهرست نام‌های متدهایی که برای تعریف (یعنی مقداردهی) مشخصه‌های نمونه به کار می‌روند.

پیش‌فرض: ('__init__', '__new__', 'setUp', 'asyncSetUp', '__post_init__')

فهرست نام‌های اعضایی که باید از هشدار دسترسی محافظت‌شده مستثنی شوند.

پیش‌فرض: ('_asdict', '_fields', '_replace', '_source', '_make', 'os._exit')

فهرست نام‌های معتبر برای آرگومان نخست در یک متد کلاس (classmethod).

پیش‌فرض: ('cls',)

فهرست نام‌های معتبر برای آرگومان نخست در متد کلاس یک متاکلاس.

پیش‌فرض: ('mcs',)

نکته: تنها tool.pylint الزامی است و عنوان بخش لازم نیست. این‌ها مقادیر پیش‌فرض هستند.

[tool.pylint.classes]
check-protected-access-in-special-methods = false
defining-attr-methods = ["__init__", "__new__", "setUp", "asyncSetUp", "__post_init__"]
exclude-protected = ["_asdict", "_fields", "_replace", "_source", "_make", "os._exit"]
valid-classmethod-first-arg = ["cls"]
valid-metaclass-classmethod-first-arg = ["mcs"]

فهرست عبارت‌های باقاعده از نام‌های اجداد کلاس برای نادیده‌گرفتن هنگام شمارش متدهای عمومی (مشاهده R0903)

پیش‌فرض: []

فهرست نام‌های کامل کلاس‌ها برای نادیده‌گرفتن هنگام شمارش والدین کلاس (مشاهده R0901)

پیش‌فرض: ()

حداکثر تعداد آرگومان‌ها برای تابع / متد.

پیش‌فرض: 5

حداکثر تعداد مشخصه‌ها برای یک کلاس (مشاهده R0902).

پیش‌فرض: 7

حداکثر تعداد عبارت‌های بولی در یک دستور if (مشاهده R0916).

پیش‌فرض: 5

حداکثر تعداد شاخه‌ها برای بدنه تابع / متد.

پیش‌فرض: 12

آستانه پیچیدگی سیکلوماتیک McCabe

پیش‌فرض: 10.SS --max-locals

حداکثر تعداد متغیرهای محلی برای بدنه تابع / متد.

پیش‌فرض: 15

حداکثر تعداد والدها برای یک کلاس (R0901 را ببینید).

پیش‌فرض: 7

حداکثر تعداد آرگومان‌های مکانی برای تابع / متد.

پیش‌فرض: 5

حداکثر تعداد متدهای عمومی برای یک کلاس (R0904 را ببینید).

پیش‌فرض: 20

حداکثر تعداد return / yield برای بدنه تابع / متد.

پیش‌فرض: 6

حداکثر تعداد دستورات در بدنه تابع / متد.

پیش‌فرض: 50

حداقل تعداد متدهای عمومی برای یک کلاس (R0903 را ببینید).

پیش‌فرض: 2

نکته: فقط tool.pylint الزامی است، عنوان بخش الزامی نیست. این‌ها مقادیر پیش‌فرض هستند.

[tool.pylint.design]
exclude-too-few-public-methods = []
ignored-parents = []
max-args = 5
max-attributes = 7
max-bool-expr = 5
max-branches = 12
max-complexity = 10
max-locals = 15
max-parents = 7
max-positional-arguments = 5
max-public-methods = 20
max-returns = 6
max-statements = 50
min-public-methods = 2

استثناهایی که هنگام گرفته‌شدن (catch)، یک هشدار صادر می‌کنند.

پیش‌فرض: ('builtins.BaseException', 'builtins.Exception')

نکته: فقط tool.pylint الزامی است، عنوان بخش الزامی نیست. این‌ها مقادیر پیش‌فرض هستند.

[tool.pylint.exceptions]
overgeneral-exceptions = ["builtins.BaseException", "builtins.Exception"]

قالب مورد انتظار برای پایان خط؛ برای نمونه خالی (هر پایان خطی)، LF یا CRLF.

پیش‌فرض: ""

عبارت باقاعده (Regexp) برای خطی که مجاز است از حد تعیین‌شده طولانی‌تر باشد.

پیش‌فرض: ^\s*(# )?<?https?://\S+>?$

تعداد فاصله‌های تورفتگی مورد نیاز درون یک خط معلق (hanging) یا ادامه‌دار.

پیش‌فرض: 4

رشته‌ای که به عنوان واحد تورفتگی استفاده می‌شود. این مقدار معمولاً " " (۴ فاصله) یا "t" (۱ تب) است.

پیش‌فرض: `` ``

بیشینهٔ تعداد نویسه‌ها در یک خط منفرد. مقدار پیش‌فرض ۱۰۰ در Pylint بر اساس رهنمود PEP 8 است که بیان می‌کند تیم‌ها می‌توانند طول خط را تا ۹۹ نویسه انتخاب کنند.

پیش‌فرض: 100

بیشینهٔ تعداد خط‌ها در یک ماژول.

پیش‌فرض: 1000

اجازه دادن به قرارگیری بدنهٔ کلاس در همان خط اعلان، در صورتی که بدنه تنها شامل یک عبارت باشد.

پیش‌فرض: False

اجازه دادن به قرارگیری بدنهٔ دستور if در همان خط شرط (test)، در صورتی که else وجود نداشته باشد.

پیش‌فرض: False

نکته: تنها tool.pylint الزامی است و عنوان بخش ضروری نیست. این‌ها مقادیر پیش‌فرض هستند.

[tool.pylint.format]
# Possible choices: ['', 'LF', 'CRLF']
expected-line-ending-format = ""
ignore-long-lines = "^\\s*(# )?<?https?://\\S+>?$"
indent-after-paren = 4
indent-string = "    "
max-line-length = 100
max-module-lines = 1000
single-line-class-stmt = false
single-line-if-stmt = false

فهرستی از ماژول‌هایی که می‌توان آن‌ها را در هر سطحی، و نه فقط در بالاترین سطح (top level)، وارد (import) کرد.

پیش‌فرض: ()

اجازه دادن به بازصادرات (re-export) صریح از طریق نام مستعار (alias) از __init__ یک بسته.

پیش‌فرض: False

اجازه دادن به واردسازی‌های عامه‌نما (wildcard imports) از ماژول‌هایی که __all__ را تعریف کرده‌اند.

پیش‌فرض: False.SS --deprecated-modules

ماژول‌های منسوخ‌شده‌ای که نباید استفاده شوند، که با کاما از هم جدا شده‌اند.

پیش‌فرض: ()

خروجی دادن یک نمودار (با فرمت .gv یا هر قالب تصویر پشتیبانی‌شده) از وابستگی‌های خارجی در فایل مشخص‌شده (گزارش RP0402 نباید غیرفعال باشد).

پیش‌فرض: ""

خروجی دادن یک نمودار (با فرمت .gv یا هر قالب تصویر پشتیبانی‌شده) از تمامی وابستگی‌ها (یعنی داخلی و خارجی) در فایل مشخص‌شده (گزارش RP0402 نباید غیرفعال باشد).

پیش‌فرض: ""

خروجی دادن یک نمودار (با فرمت .gv یا هر قالب تصویر پشتیبانی‌شده) از وابستگی‌های داخلی در فایل مشخص‌شده (گزارش RP0402 نباید غیرفعال باشد).

پیش‌فرض: ""

اجبار ترتیب واردسازی (import) برای شناختن یک ماژول به عنوان بخشی از کتابخانه‌های استاندارد سازگاری.

پیش‌فرض: ()

اجبار ترتیب واردسازی (import) برای شناختن یک ماژول به عنوان بخشی از یک کتابخانه شخص ثالث (third-party).

پیش‌فرض: ('enchant',)

جفت‌هایی از ماژول‌ها و ماژول‌های ترجیحی، که با کاما از هم جدا شده‌اند.

پیش‌فرض: ()

نکته: تنها tool.pylint الزامی است، عنوان بخش الزامی نیست. این‌ها مقادیر پیش‌فرض هستند.

[tool.pylint.imports]
allow-any-import-level = []
allow-reexport-from-package = false
allow-wildcard-with-all = false
deprecated-modules = []
ext-import-graph = ""
import-graph = ""
int-import-graph = ""
known-standard-library = []
known-third-party = ["enchant"]
preferred-modules = []

نوع قالب‌بندی رشته‌ای که متدهای logging انجام می‌دهند. `old` به معنای استفاده از قالب‌بندی % است، و `new` برای قالب‌بندی `{}` به کار می‌رود.

پیش‌فرض: old

ماژول‌های logging برای بررسی اینکه آرگومان‌های قالب رشته در قالب پارامترهای تابع logging باشند.

پیش‌فرض: ('logging',)

نکته: تنها tool.pylint الزامی است، عنوان بخش الزامی نیست. این‌ها مقادیر پیش‌فرض هستند.

[tool.pylint.logging]
# Possible choices: ['old', 'new']
logging-format-style = "old"
logging-modules = ["logging"]

فهرستی از نام‌های کامل (مانند library.method) که نیازمند پارامتر timeout هستند؛ مانند 'requests.api.get,requests.api.post'

پیش‌فرض: ('requests.api.delete', 'requests.api.get', 'requests.api.head', 'requests.api.options', 'requests.api.patch', 'requests.api.post', 'requests.api.put', 'requests.api.request')

نکته: فقط tool.pylint الزامی است، عنوان بخش لازم نیست. این‌ها مقادیر پیش‌فرض هستند.

[tool.pylint.method_args]
timeout-methods = ["requests.api.delete", "requests.api.get", "requests.api.head", "requests.api.options", "requests.api.patch", "requests.api.post", "requests.api.put", "requests.api.request"]

آیا در docstringها به دنبال fixmeها جستجو شود یا خیر.

پیش‌فرض: False

فهرستی از برچسب‌های یادداشت جهت در نظر گرفتن، جداشده با کاما.

پیش‌فرض: ('FIXME', 'XXX', 'TODO')

عبارت باقاعده (Regex) برچسب‌های یادداشت جهت در نظر گرفتن.

پیش‌فرض: ""

نکته: فقط tool.pylint الزامی است، عنوان بخش لازم نیست. این‌ها مقادیر پیش‌فرض هستند.

[tool.pylint.miscellaneous]
check-fixme-in-docstring = false
notes = ["FIXME", "XXX", "TODO"]
notes-rgx = ""

حداکثر تعداد بلوک‌های تو در تو برای بدنهٔ تابع / متد

پیش‌فرض: 5

نام کامل توابعی که هرگز بازنمی‌گردند. هنگام بررسی inconsistent-return-statements، اگر تابعی فراخوانی شود که هرگز بازگشت ندارد، به عنوان یک دستور return صریح در نظر گرفته شده و هیچ پیامی چاپ نخواهد شد.

پیش‌فرض: ('sys.exit', 'argparse.parse_error')

صادر شدن هشدار 'consider-using-join' هنگامی که جداکنندهٔ مورد استفاده برای اتصال (join) غیرخالی باشد (منجر به اصلاحات مورد انتظار از این دست: ``"- " + " - ".join(items)``)

پیش‌فرض: True

نکته: فقط tool.pylint الزامی است، عنوان بخش لازم نیست. این‌ها مقادیر پیش‌فرض هستند.

[tool.pylint.refactoring]
max-nested-blocks = 5
never-returning-functions = ["sys.exit", "argparse.parse_error"]
suggest-join-with-non-empty-separator = true

کامنت‌ها از محاسبهٔ شباهت حذف می‌شوند

پیش‌فرض: True

رشته‌های مستندات (docstringها) از محاسبهٔ شباهت حذف می‌شوند

پیش‌فرض: True

واردکردن‌ها (imports) از محاسبهٔ شباهت حذف می‌شوند

پیش‌فرض: True

امضاها (signatures) از محاسبهٔ شباهت حذف می‌شوند

پیش‌فرض: True

حداقل تعداد خطوط برای یک شباهت.

پیش‌فرض: 4

نکته: تنها tool.pylint الزامی است، عنوان بخش لازم نیست. این‌ها مقادیر پیش‌فرض هستند.

[tool.pylint.similarities]
ignore-comments = true
ignore-docstrings = true
ignore-imports = true
ignore-signatures = true
min-similarity-lines = 4

تعداد پیشنهادهای ارائه‌شده برای غلط‌های املایی را محدود می‌کند.

پیش‌فرض: 4

نام لغت‌نامهٔ املایی. لغت‌نامه‌های موجود به نصب محلی enchant شما بستگی دارد.

پیش‌فرض: ""

فهرستی از کلمات جداشده با کاما که در صورت قرار گرفتن در ابتدای یک کامنت، باید به‌عنوان دستورالعمل (directive) در نظر گرفته شوند و بررسی نشوند.

پیش‌فرض: fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy:

فهرستی از کلمات جداشده با کاما که نباید بررسی شوند.

پیش‌فرض: ""

مسیری به فایلی که شامل لغت‌نامهٔ اختصاصی است؛ یک کلمه در هر خط.

پیش‌فرض: ""

تعیین می‌کند که آیا کلمات ناشناخته به جای صدور پیام، در لغت‌نامهٔ اختصاصی ذخیره شوند یا خیر (گزینهٔ --spelling-private-dict-file را ببینید).

پیش‌فرض: n

نکته: تنها tool.pylint الزامی است، عنوان بخش لازم نیست. این‌ها مقادیر پیش‌فرض هستند.

[tool.pylint.spelling]
max-spelling-suggestions = 4
# Possible choices: Values from 'enchant.Broker().list_dicts()' depending on your local enchant installation
spelling-dict = ""
spelling-ignore-comment-directives = "fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy:"
spelling-ignore-words = ""
spelling-private-dict-file = ""
spelling-store-unknown-words = false

این پرچم مشخص می‌کند که آیا در صورت استفادهٔ ناهمگون از نویسهٔ جداکنندهٔ نقل‌قول در یک پودمان، هشدار inconsistent-quotes صادر شود یا خیر.

پیش‌فرض: False

این پرچم مشخص می‌کند که آیا برای الحاق ضمنی رشته‌ها در دنباله‌هایی که در چندین سطر تعریف شده‌اند، هشدار implicit-str-concat صادر شود یا خیر.

پیش‌فرض: False

نکته: تنها بخش tool.pylint مورد نیاز است و عنوان بخش الزامی نیست. این مقادیر، مقادیر پیش‌فرض هستند.

[tool.pylint.string]
check-quote-consistency = false
check-str-concat-over-line-jumps = false

فهرستی از دکوراتورهایی که مدیر زمینه (context manager) ایجاد می‌کنند، مانند contextlib.contextmanager. برای ثبت دکوراتورهای دیگری که مدیران زمینهٔ معتبر تولید می‌کنند، آن‌ها را به این فهرست اضافه کنید.

پیش‌فرض: ['contextlib.contextmanager']

فهرستی از اعضایی که به‌صورت پویا تنظیم شده و توسط سامانهٔ استنتاج pylint شناسایی نمی‌شوند، بنابراین هنگام دسترسی نباید خطای E1101 را فعال کنند. عبارات باقاعدهٔ پایتون پذیرفته می‌شوند.

پیش‌فرض: ()

مشخص می‌کند که آیا اعضای مفقودی که در کلاس mixin مورد دسترسی قرار گرفته‌اند باید نادیده گرفته شوند یا خیر. کلاسی mixin در نظر گرفته می‌شود که نام آن با گزینهٔ mixin-class-rgx مطابقت داشته باشد.

پیش‌فرض: True

مشخص می‌کند که آیا در صورت استنتاج None برای مالک صفت (attribute)، هشداری در مورد اعضای ناموجود صادر شود یا خیر.

پیش‌فرض: True

این پرچم کنترل می‌کند که آیا pylint باید در صورت بازگردانده شدن یک شیء کدر (opaque) هنگام استنتاج، دربارهٔ no-member و بررسی‌های مشابه هشدار دهد یا خیر. فرایند استنتاج می‌تواند هنگام ارزیابی یک شیء پایتون چندین نتیجهٔ محتمل ارائه دهد، اما ممکن است برخی شاخه‌ها ارزیابی نشوند که به استنتاج جزئی می‌انجامد. در چنین حالتی، ممکن است همچنان صدور هشدار no-member و سایر بررسی‌ها برای باقی اشیاء استنتاج‌شده مفید باشد.

پیش‌فرض: True

فهرستی از نام‌های نمادین پیام‌ها که باید برای اعضای Mixin نادیده گرفته شوند.

پیش‌فرض: ['no-member', 'not-async-context-manager', 'not-context-manager', 'attribute-defined-outside-init']

فهرستی از نام‌های کلاس‌هایی که صفات عضو آن‌ها نباید بررسی شوند (مفید برای کلاس‌هایی با صفات تنظیم‌شده به‌صورت پویا). این گزینه از نام‌های واجد شرایط (qualified names) پشتیبانی می‌کند.

پیش‌فرض: ('optparse.Values', 'thread._local', '_thread._local', 'argparse.Namespace')

هنگامی که نام یک عضو پیدا نمی‌شود، راهنمایی حاوی نام‌های احتمالی را نمایش می‌دهد. نحوهٔ یافتن این راهنما بر پایهٔ فاصلهٔ ویرایش (edit distance) است.

پیش‌فرض: True

حداکثر فاصلهٔ ویرایشی که یک نام می‌تواند داشته باشد تا به‌عنوان گزینه‌ای مشابه برای نام عضو مفقود در نظر گرفته شود.

پیش‌فرض: 1

تعداد کل نام‌های مشابهی که باید هنگام نمایش راهنما برای یک عضو مفقود مد نظر قرار گیرند.

پیش‌فرض: 1

الگوی عبارت باقاعده (Regex) برای تعیین این‌که کدام کلاس‌ها mixin در نظر گرفته می‌شوند.

پیش‌فرض: .*[Mm]ixin.SS --signature-mutators

فهرستی از دکوراتورهایی که امضای تابع تزیین‌شده را تغییر می‌دهند.

پیش‌فرض: []

نکته: تنها tool.pylint الزامی است، عنوان بخش لازم نیست. این‌ها مقدارهای پیش‌فرض هستند.

[tool.pylint.typecheck]
contextmanager-decorators = ["contextlib.contextmanager"]
generated-members = []
ignore-mixin-members = true
ignore-none = true
ignore-on-opaque-inference = true
ignored-checks-for-mixins = ["no-member", "not-async-context-manager", "not-context-manager", "attribute-defined-outside-init"]
ignored-classes = ["optparse.Values", "thread._local", "_thread._local", "argparse.Namespace"]
missing-member-hint = true
missing-member-hint-distance = 1
missing-member-max-choices = 1
mixin-class-rgx = ".*[Mm]ixin"
signature-mutators = []

فهرستی از نام‌های اضافی که فرض می‌شود در builtins تعریف شده‌اند. به یاد داشته باشید که در صورت امکان باید از تعریف builtins جدید خودداری کنید.

پیش‌فرض: ()

مشخص می‌کند که آیا متغیرهای سراسری استفاده‌نشده باید به عنوان تخطی در نظر گرفته شوند یا خیر.

پیش‌فرض: True

فهرستی از نام‌هایی که مجازند بر builtins سایه بیندازند (آن‌ها را shadow کنند)

پیش‌فرض: ()

فهرستی از رشته‌ها که می‌توانند یک تابع بازخورد (callback) را بر اساس نام شناسایی کنند. نام یک callback باید با یکی از این رشته‌ها شروع شده یا پایان یابد.

پیش‌فرض: ('cb_', '_cb')

یک عبارت باقاعده (regular expression) برای تطبیق با نام متغیرهای صوری (dummy)، یعنی متغیرهایی که انتظار نمی‌رود استفاده شوند.

پیش‌فرض: _+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_

نام‌های آرگومانی که با این عبارت مطابقت داشته باشند نادیده گرفته خواهند شد.

پیش‌فرض: re.compile('_.*|^ignored_|^unused_')

مشخص می‌کند که آیا واردکردن‌های (import) استفاده‌نشده در فایل‌های __init__ باید بررسی شوند یا خیر.

پیش‌فرض: False

فهرستی از نام‌های واجد شرایط ماژول‌ها (qualified module names) که می‌توانند اشیایی برای بازتعریف builtins داشته باشند.

پیش‌فرض: ('six.moves', 'past.builtins', 'future.builtins', 'builtins', 'io')

نکته: تنها tool.pylint الزامی است، عنوان بخش لازم نیست. این‌ها مقدارهای پیش‌فرض هستند.

[tool.pylint.variables]
additional-builtins = []
allow-global-unused-variables = true
allowed-redefined-builtins = []
callbacks = ["cb_", "_cb"]
dummy-variables-rgx = "_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_"
ignored-argument-names = "_.*|^ignored_|^unused_"
init-import = false
redefining-builtins-modules = ["six.moves", "past.builtins", "future.builtins", "builtins", "io"]

حداکثر تعداد دستورهای مجاز در یک عبارت try

پیش‌فرض: 1

نکته: تنها tool.pylint الزامی است، عنوان بخش لازم نیست. این‌ها مقادیر پیش‌فرض هستند.

[tool.pylint.broad_try_clause]
max-try-statements = 1

حداکثر طول خطی که همچنان برای آن پیشنهادها ارائه می‌شوند. برای جلوگیری از پیشنهادهای اختیاری که ممکن است توسط یک قالب‌بند کد (مانند black) شکسته شوند استفاده می‌شود. مقدار پیش‌فرض آن مطابق تنظیمات ``max-line-length`` خواهد بود.

پیش‌فرض: 0

نکته: تنها tool.pylint الزامی است، عنوان بخش لازم نیست. این‌ها مقادیر پیش‌فرض هستند.

[tool.pylint.code_style]
max-line-length-suggestions = 0

فهرستی از نام‌های توابع توکار (builtins) که نباید استفاده شوند، جداشده با کاما

پیش‌فرض: ['map', 'filter']

نکته: تنها tool.pylint الزامی است، عنوان بخش لازم نیست. این‌ها مقادیر پیش‌فرض هستند.

[tool.pylint.deprecated_builtins]
bad-functions = ["map", "filter"]

نام‌های dunder مناسبی که همیشه باید پذیرفته شوند.

پیش‌فرض: []

نکته: تنها tool.pylint الزامی است، عنوان بخش لازم نیست. این‌ها مقادیر پیش‌فرض هستند.

[tool.pylint.dunder]
good-dunder-names = []

فهرستی از مقادیر جادویی معتبر که `magic-value-compare` آن‌ها را شناسایی نخواهد کرد. از اعداد صحیح، اعشاری و اعداد منفی پشتیبانی می‌کند؛ برای رشتهٔ خالی ``''`` را وارد کنید، برای مقادیر دارای بک‌اسلش تنها از یک بک‌اسلش استفاده کنید، مانند n.

پیش‌فرض: (0, -1, 1, '', '__main__')

نکته: تنها tool.pylint الزامی است، عنوان بخش لازم نیست. این‌ها مقادیر پیش‌فرض هستند.

[tool.pylint.magic-value]
valid-magic-values = [0, -1, 1, "", "__main__"]

اینکه آیا فقدان کامل مستندات پارامتر در docstring تابعی که دارای پارامتر است پذیرفته شود یا خیر.

پیش‌فرض: True

اینکه آیا فقدان کامل مستندات استثناها (raises) در docstring تابعی که استثنا پرتاب می‌کند پذیرفته شود یا خیر.

پیش‌فرض: True

اینکه آیا فقدان کامل مستندات بازگشت (return) در docstring تابعی که عبارت بازگشتی دارد پذیرفته شود یا خیر.

پیش‌فرض: True

اینکه آیا فقدان کامل مستندات تولید مقادیر (yields) در docstring یک مولد (generator) پذیرفته شود یا خیر.

پیش‌فرض: True

اگر نوع docstring قابل حدس زدن نباشد، نوع مشخص‌شده برای docstring استفاده خواهد شد.

پیش‌فرض: default

نکته: فقط tool.pylint لازم است، عنوان بخش الزامی نیست. این مقادیر پیش‌فرض هستند.

[tool.pylint.parameter_documentation]
accept-no-param-doc = true
accept-no-raise-doc = true
accept-no-return-doc = true
accept-no-yields-doc = true
# Possible choices: ['sphinx', 'epytext', 'google', 'numpy', 'default']
default-docstring-type = "default"

اگر برنامه / کتابخانه نیازی به پشتیبانی از درون‌نگری زمان اجرای حاشیه‌نویسی‌های نوع (type annotations) ندارد، روی ``no`` تنظیم کنید. اگر از حاشیه‌نویسی‌های نوع صرفاً برای بررسی نوع یک برنامه استفاده می‌کنید، احتمالاً مشکلی نخواهید داشت. برای کتابخانه‌ها، ابتدا ارزیابی کنید که آیا برخی کاربران می‌خواهند در زمان اجرا به نکات نوع (type hints) دسترسی داشته باشند یا خیر، مثلاً از طریق typing.get_type_hints. برای نسخه‌های پایتون 3.7 - 3.9 اعمال می‌شود.

پیش‌فرض: True

نکته: فقط tool.pylint لازم است، عنوان بخش الزامی نیست. این مقادیر پیش‌فرض هستند.

[tool.pylint.typing]
runtime-typing = true

بررسی‌کننده‌های Pylint می‌توانند سه دسته از امکانات را ارائه دهند:

  • گزینه‌هایی که اجرای آن‌ها را کنترل می‌کنند،
  • پیام‌هایی که می‌توانند صادر کنند،
  • گزارش‌هایی که می‌توانند تولید کنند.

در زیر فهرستی از تمام بررسی‌کننده‌ها و قابلیت‌های آن‌ها آمده است.

نام دقیق این بررسی‌کننده async است..SS پیام‌های بررسی‌کننده Async

دستور Yield درون تابع async زمانی استفاده می‌شود که یک دستور yield یا yield from درون یک تابع async یافت شود. این پیام هنگام استفاده از Python < 3.5 نمی‌تواند صادر شود.
مدیر بافت ناهمگام '%s' متدهای __aenter__ و __aexit__ را پیاده‌سازی نمی‌کند. زمانی استفاده می‌شود که یک مدیر بافت ناهمگام با شیئی به کار رود که پروتکل مدیریت بافت ناهمگام را پیاده‌سازی نمی‌کند. این پیام هنگام استفاده از Python < 3.5 نمی‌تواند صادر شود.

نام دقیق بررسی‌کننده bad-chained-comparison است.

مقایسه زنجیره‌ای چندبخشی (%s) مشکوک با استفاده از عملگرهای ناسازگار از نظر معنایی (%s) زمانی استفاده می‌شود که یک مقایسه زنجیره‌ای وجود دارد که در آن یک عبارت، بخشی از دو مقایسه است که به گروه‌های معنایی متفاوتی تعلق دارند ("<" همان معنای "is" را نمی‌دهد، زنجیره‌سازی آن‌ها در عبارت "0 < x is None" احتمالاً یک اشتباه است).

نام دقیق بررسی‌کننده basic است.

همچنین مستندات گزینه‌های بررسی‌کننده basic را ببینید: <#basic-options>

متد __init__ یک مولد (generator) است زمانی استفاده می‌شود که متد ویژه کلاسی __init__ به دلیل وجود yield در بدنه خود به یک مولد تبدیل شده باشد.
دستور صریح return در __init__ زمانی استفاده می‌شود که متد ویژه کلاسی __init__ دارای یک مقدار بازگشتی صریح باشد.
مورد %s از قبل در خط %s تعریف شده است زمانی استفاده می‌شود که یک تابع / کلاس / متد دوباره تعریف شود.
دستور %r به‌درستی درون حلقه قرار نگرفته است زمانی استفاده می‌شود که کلمات کلیدی break یا continue خارج از یک حلقه به کار روند.
دستور Return خارج از تابع زمانی استفاده می‌شود که یک دستور "return" در خارج از تابع یا متد یافت شود.
دستور Yield خارج از تابع زمانی استفاده می‌شود که یک دستور "yield" در خارج از تابع یا متد یافت شود.
دستور Return همراه با آرگومان درون مولد زمانی استفاده می‌شود که یک دستور "return" همراه با آرگومان درون یک تابع یا متد مولد (مثلاً دارای چند دستور "yield") پیدا شود. این پیام هنگام استفاده از Python >= 3.3 نمی‌تواند صادر شود.
استفاده از عملگر ناموجود %s زمانی استفاده می‌شود که تلاش کنید از عملگرهای پیش‌افزایش یا پیش‌کاهش به سبک زبان C شامل -- و ++ استفاده کنید، در حالی که در Python وجود ندارند.
نام آرگومان تکراری %r در تعریف تابع نام‌های آرگومان تکراری در تعریف توابع خطای نحوی (SyntaxError) هستند.
کلاس انتزاعی %r با متدهای انتزاعی نمونه‌سازی شده است زمانی استفاده می‌شود که از یک کلاس انتزاعی با متاکلاس abc.ABCMeta که دارای متدهای انتزاعی است، نمونه‌سازی شود.
اولین آرگومان reversed() یک دنباله نیست زمانی استفاده می‌شود که اولین آرگومان تابع توکار reversed() یک دنباله نباشد (متدهای __reversed__، یا __getitem__ و __len__ را پیاده‌سازی نکرده باشد).
بیش از یک عبارت ستاره‌دار در انتساب هنگامی صادر می‌شود که بیش از یک عبارت ستاره‌دار (*x) در انتساب وجود داشته باشد. این یک SyntaxError است.
مقصد انتساب ستاره‌دار باید درون یک لیست یا تاپل باشد هنگامی صادر می‌شود که یک عبارت ستاره‌دار به عنوان مقصد انتساب ستاره‌دار استفاده شود.
عبارت ستاره‌دار فقط در مقصد انتساب قابل استفاده است هنگامی صادر می‌شود که از یک عبارت ستاره‌دار در مقصد انتساب استفاده نشده باشد.
نام %r هم nonlocal و هم global است هنگامی صادر می‌شود که یک نام، هم nonlocal و هم global باشد.
نام nonlocal مربوط به %s بدون انتساب یافت شد هنگامی صادر می‌شود که یک متغیر nonlocal نام متناظری در دامنه‌های والد نداشته باشد.
نام %r قبل از اعلان global استفاده شده است هنگامی صادر می‌شود که یک نام پیش از اعلان global به کار رود، که این عمل از نسخه Python 3.6 منجر به خطا می‌شود. این پیام هنگام استفاده از Python < 3.6 نمی‌تواند صادر شود.
تابع format روی str فراخوانی نشده است هنگامی صادر می‌شود که تابع format روی شیء str فراخوانی نشود؛ مثلاً اجرای print("value: {}").format(123) به جای print("value: {}".format(123)). این احتمالاً چیزی نبوده که کاربر مد نظر داشته است.
کد دست‌نیافتنی زمانی استفاده می‌شود که مقداری کد پس از یک دستور "return" یا "raise" وجود داشته باشد که هرگز اجرا نخواهد شد.
مقدار پیش‌فرض خطرناک %s به عنوان آرگومان زمانی استفاده می‌شود که یک مقدار تغییرپذیر (mutable) مانند list یا dictionary در مقدار پیش‌فرض یک آرگومان شناسایی شود.
به نظر می‌رسد دستور هیچ تاثیری ندارد زمانی استفاده می‌شود که یک دستور هیچ اثری نداشته باشد (یا دست‌کم این‌گونه به نظر برسد).
دستور رشته‌ای هیچ تاثیری ندارد زمانی استفاده می‌شود که از یک رشته به عنوان دستور استفاده شود (که طبیعتاً هیچ تاثیری ندارد). این یک مورد خاص از W0104 با پیام مستقل خود است تا در صورت استفاده از این رشته‌ها به عنوان مستندات به جای کامنت، بتوانید به آسانی آن را غیرفعال کنید.
عبارت "%s" به چیزی منتسب نشده است زمانی استفاده می‌شود که عبارتی که فراخوانی تابع نیست، به چیزی منتسب نشود. احتمالاً هدف چیز دیگری بوده است.
دستور pass غیرضروری زمانی استفاده می‌شود که یک دستور "pass" بتواند بدون تغییر در رفتار کد حذف شود.
عبارت Lambda ممکن است غیرضروری باشد زمانی استفاده می‌شود که بدنه یک عبارت lambda یک فراخوانی تابع با همان فهرست آرگومان‌های خودِ lambda باشد؛ چنین عبارات lambda در اکثر موارد، با تابعی که درون بدنه فراخوانی می‌شود قابل جایگزینی هستند.
کلید تکراری %r در دیکشنری زمانی استفاده می‌شود که یک عبارت دیکشنری، یک کلید یکسان را چندین بار مقید (bind) کند.
بند else در حلقه‌ای بدون دستور break؛ بند else را حذف کرده و دندانه‌گذاری کدهای درون آن را بردارید حلقه‌ها تنها در صورتی باید بند else داشته باشند که امکان خروج زودهنگام از آن‌ها با دستور break وجود داشته باشد؛ در غیر این صورت دستورات زیر else باید در همان دامنه خودِ حلقه قرار گیرند.
استفاده از exec هنگامی صادر می‌شود که از دستور 'exec' استفاده شود. استفاده از این تابع برای ورودی کاربر خطرناک است و همچنین به‌طور کلی کندتر از کد واقعی است. این بدان معنا نیست که هرگز نباید از آن استفاده کنید، بلکه ابتدا باید گزینه‌های جایگزین را در نظر گرفته و توابع در دسترس را محدود کنید.
استفاده از eval زمانی استفاده می‌شود که از تابع "eval" استفاده کنید، تا شما را از به کار بردن آن منصرف کند. برای ارزیابی ایمن رشته‌های حاوی عبارت‌های Python از منابع غیرقابل اعتماد، استفاده از ast.literal_eval را در نظر داشته باشید.
قرار گرفتن مدیر بافت دیگر پس از "as" شبیه به یک تاپل به نظر می‌رسد. هنگامی صادر می‌شود که یکی از اجزای دستور with چندین مقدار برگرداند و از انتساب نام با as فقط برای بخشی از این مقادیر استفاده کند، مانند with ctx() as a, b. این امر می‌تواند گمراه‌کننده باشد، زیرا مشخص نیست که آیا مدیر بافت یک تاپل برمی‌گرداند یا اینکه گره فاقد انتساب نام، خودش یک مدیر بافت دیگر است..TP using-constant-test (W0125) استفاده از یک دستور شرطی با یک مقدار ثابت هنگامی صادر می‌شود که یک دستور شرطی (If یا if سه‌تایی) از یک مقدار ثابت برای آزمون خود استفاده کند. این ممکن است آن چیزی نباشد که کاربر قصد انجامش را داشته است.
استفاده از عبارت شرطی با فراخوانی احتمالاً نادرست تابع یا متد به دلیل نبود پرانتز هنگامی صادر می‌شود که به نظر برسد یک عبارت شرطی (If یا if سه‌تایی) به دلیل نبود پرانتز، یک تابع را به نادرستی فراخوانی می‌کند.
انتساب متغیر %r به خودش هنگامی صادر می‌شود که تشخیص دهیم یک متغیر به خودش منتسب شده است.
تعریف مجدد متغیر %r در انتساب هنگامی صادر می‌شود که تشخیص دهیم یک متغیر در همان انتساب دوباره تعریف شده است.
دستور assert دارای یک رشته لیترال به عنوان آرگومان نخست خود است. این assert به صورت %s با شکست مواجه خواهد شد. زمانی استفاده می‌شود که یک دستور assert یک رشته لیترال را به عنوان آرگومان نخست خود داشته باشد، که باعث می‌شود assert همیشه با موفقیت سپری شود (pass).
مقدار تکراری %r در مجموعه (set) این پیام زمانی صادر می‌شود که یک set شامل یک مقدار یکسان به تعداد دو یا چند بار باشد.
استفاده از عبارت نام‌گذاری‌شده (named expression) بدون بافتار (context) هنگامی صادر می‌شود که از یک عبارت نام‌گذاری‌شده برای انجام یک انتساب معمولی در خارج از بافتارهایی مانند if، for، while یا یک comprehension استفاده شده باشد.
دستور استثنا (exception) هیچ اثری ندارد زمانی به کار می‌رود که یک استثنا بدون اینکه منتسب شود، برانگیخته (raise) گردد، یا برای استفاده بعدی در جای دیگر بازگردانده (return) شود، ایجاد گردد.
دستور 'return' توسط بند 'finally' سایه‌اندازی شده است. هنگامی صادر می‌شود که یک دستور 'return' در یک بلوک 'finally' یافت شود. این کار مقدار بازگشتی تابع را بازنویسی خواهد کرد و باید از آن اجتناب شود.
از context استفاده‌شده در تابع %r خارج نخواهد شد. زمانی استفاده می‌شود که یک contextmanager درون یک تابع ژنراتور به کار رود و پاک‌سازی (cleanup) مدیریت نشده باشد.
استفاده از 'continue' درون بند 'finally' توصیه نمی‌شود هنگامی صادر می‌شود که کلمه کلیدی continue در داخل یک بند finally یافت شود. این مورد از پایتون ۳.۱۴ به بعد یک SyntaxWarning صادر خواهد کرد.
استفاده از 'break' درون بند 'finally' توصیه نمی‌شود هنگامی صادر می‌شود که کلمه کلیدی break در داخل یک بند finally یافت شود. این مورد از پایتون ۳.۱۴ به بعد یک SyntaxWarning صادر خواهد کرد.
مقایسه با یک شیء فراخوان‌پذیر (callable)، آیا پرانتزها را جا انداخته‌اید؟ این پیام زمانی صادر می‌شود که pylint تشخیص دهد مقایسه‌ای با یک شیء فراخوان‌پذیر انجام شده است، که می‌تواند نشان دهد پرانتزها جا افتاده‌اند و منجر به رفتارهای ناخواسته احتمالی می‌شود.
دستور %s در بلوک finally ممکن است استثنا را ببلعد زمانی استفاده می‌شود که یک دستور break یا return در داخل بند finally از یک بلوک try...finally یافت شود: استثناهای برانگیخته‌شده در بند try به‌جای برانگیخته‌شدن دوباره (re-raise)، بی‌صدا بلعیده خواهند شد.
مقایسه %s باید %s باشد زمانی استفاده می‌شود که یک عبارت با مقادیر NaN مانند numpy.NaN و float('nan') مقایسه شود.
دستور assert روی یک تاپل پر فراخوانی شده است. آیا منظورتان 'assert x,y' بوده است؟ فراخوانی assert روی یک تاپل در صورتی که تاپل خالی نباشد همیشه به درستی (true)، و اگر خالی باشد همیشه به نادرستی (false) ارزیابی می‌شود.
در '%s'، هنگام مقایسه لیترال‌های ثابت از '%s' استفاده کنید نه '%s' ('%s') هنگام مقایسه یک شیء با یک لیترال استفاده می‌شود، که معمولاً کاری نیست که بخواهید انجام دهید، زیرا در مجموع ممکن است با لیترالی متفاوت از آنچه مورد انتظار بود مقایسه شود.
مقایسه زائد - %s زمانی استفاده می‌شود که چیزی با خودش مقایسه شود.
مقایسه میان مقادیر ثابت: "%s %s %s" دارای یک مقدار ثابت است هنگامی که دو لیترال با یکدیگر مقایسه می‌شوند، نتیجه یک مقدار ثابت است. استفاده مستقیم از مقدار ثابت هم خوانایی بهتری دارد و هم عملکرد بهتری را ارائه می‌دهد. مقداردهی اولیه 'True' و 'False' از این طریق، از زمان پایتون ۲.۳ دیگر الزامی نیست.
نام %s با عنوان "%s" با %s مطابقت ندارد زمانی استفاده می‌شود که نام با قوانین نام‌گذاری مرتبط با نوع آن (ثابت، متغیر، کلاس...) مطابقت نداشته باشد.
نام غیرمجاز "%s" زمانی استفاده می‌شود که نام با bad-names یا bad-names-rgxs- (نام‌های غیرمجاز) مطابقت داشته باشد.
نام متغیر نوع وردایی (variance) را بازتاب نمی‌دهد%s هنگامی صادر می‌شود که نام یک TypeVar وردایی نوع خود را بازتاب ندهد. طبق PEP8، توصیه می‌شود پسوندهای '_co' و '_contra' به ترتیب به متغیرهایی اضافه شوند که برای اعلان رفتارهای هم‌وردا (covariant) یا پادوردا (contravariant) استفاده می‌شوند. متغیرهای ناوردا (invariant یا پیش‌فرض) نیازی به پسوند ندارند. این پیام همچنین زمانی صادر می‌شود که متغیرهای ناوردا دارای پسوند باشند.
docstring خالی برای %s زمانی استفاده می‌شود که یک ماژول، تابع، کلاس یا متد دارای docstring خالی باشد (دیگر خیلی ساده می‌شد ;).
docstring ماژول وجود ندارد زمانی استفاده می‌شود که یک ماژول فاقد docstring باشد. ماژول‌های خالی نیازی به docstring ندارند.
docstring کلاس وجود ندارد زمانی استفاده می‌شود که یک کلاس فاقد docstring باشد. حتی یک کلاس خالی نیز باید دارای docstring باشد.
docstring تابع یا متد وجود ندارد زمانی استفاده می‌شود که یک تابع یا متد فاقد docstring باشد. برخی متدهای خاص مانند __init__ نیازی به docstring ندارند.
مقایسه %s باید %s باشد زمانی استفاده می‌شود که یک عبارت با مقادیر یگانه (singleton) مانند True، False یا None مقایسه شود.
برای بررسی نوع، به‌جای ()type از ()isinstance استفاده کنید. روش اصطلاحی (idiomatic) برای انجام بررسی صریح نوع در پایتون، استفاده از isinstance(x, Y) به جای type(x) == Y یا type(x) is Y است. گرچه شرایط غیرمعمولی نیز وجود دارد که این دو نتایج متفاوتی به دست می‌دهند.
TypeVar نمی‌تواند هم‌زمان هم covariant و هم contravariant باشد هنگامی صادر می‌شود که هر دو آرگومان کلمه‌کلیدی "covariant" و "contravariant" در یک TypeVar روی "True" تنظیم شده باشند.
نام TypeVar با عنوان "%s" با نام متغیر منتسب‌شده "%s" مطابقت ندارد هنگامی صادر می‌شود که یک TypeVar به متغیری منتسب شود که با آرگومان نام آن مطابقت نداشته باشد.
آمار بر پایه نوع

نام دقیق این وارسی‌گر classes است.

همچنین مستندات گزینه‌های وارسی‌گر classes را ببینید <#classes-options>

مشخصه‌ای که در %s سطر %s تعریف شده این متد را پنهان می‌کند هنگامی استفاده می‌شود که کلاسی متدی را تعریف کند که توسط یک مشخصهٔ نمونه از یک کلاس نیاکان یا تنظیم‌شده توسط کد کلاینت، پنهان شده باشد.
دسترسی به عضو %r پیش از سطر تعریف آن %s هنگامی استفاده می‌شود که به یک عضو نمونه، پیش از مقداردهی واقعی آن دسترسی پیدا شود.
متد %r هیچ آرگومانی ندارد هنگامی استفاده می‌شود که برای متدی که باید نمونهٔ مقیدشده را به عنوان نخستین آرگومان داشته باشد، هیچ آرگومانی تعریف نشده باشد.
متد %r باید "self" را به عنوان نخستین آرگومان داشته باشد هنگامی استفاده می‌شود که متدی آرگومانی متفاوت با "self" به عنوان نخستین آرگومان داشته باشد. این مورد به عنوان خطا در نظر گرفته می‌شود زیرا چنان قرارداد رایجی است که نباید آن را نقض کنید!
شیء نامعتبر %r در __slots__، باید تنها شامل رشته‌های غیرخالی باشد هنگامی استفاده می‌شود که یک شیء نامعتبر (غیررشته‌ای) در __slots__ وجود داشته باشد.
انتساب به مشخصهٔ %r که در slots کلاس تعریف نشده است هنگامی استفاده می‌شود که مقداری به یک مشخصه که در slots کلاس تعریف نشده است انتساب یابد.
شیء __slots__ نامعتبر است هنگامی استفاده می‌شود که __slots__ نامعتبر در کلاس یافت شود. تنها یک رشته، یک تکرارپذیر یا یک دنباله مجاز است.
ارث‌بری از %r، که یک کلاس نیست. هنگامی استفاده می‌شود که یک کلاس از چیزی که کلاس نیست ارث‌بری کند.
ترتیب تفکیک متد (MRO) ناسازگار برای کلاس %r هنگامی استفاده می‌شود که یک کلاس ترتیب تفکیک متد ناسازگاری داشته باشد.
کلاس‌های پایهٔ تکراری برای کلاس %r استفادهٔ مجدد و تکراری از کلاس‌های پایه در کلاس‌های مشتق‌شده موجب بروز TypeError می‌شود.
مقدار %r در slots با متغیر کلاس تداخل دارد هنگامی استفاده می‌شود که مقداری در __slots__ با یک متغیر کلاس، ویژگی (property) یا متد تداخل داشته باشد.
انتساب نامعتبر به '__class__'. باید یک تعریف کلاس باشد اما '%s' دریافت شد هنگامی استفاده می‌شود که یک شیء نامعتبر به ویژگی __class__ انتساب یابد. تنها یک کلاس مجاز است.
توسعه دادن کلاس شمارشی (Enum) ارث‌بری‌شدهٔ "%s" هنگامی استفاده می‌شود که یک کلاس تلاش کند کلاس شمارشی (Enum) ارث‌بری‌شده‌ای را توسعه دهد. انجام این کار در زمان اجرا موجب بروز TypeError خواهد شد.
چنین نامی %r در __slots__ وجود ندارد هنگامی صادر می‌شود که یک یادداشت نوع (type annotation) در یک کلاس، در فهرست نام‌های موجود در __slots__ غایب باشد و __slots__ نیز شامل یک مدخل __dict__ نباشد.
__iter__ یک غیرتکرارگر برمی‌گرداند هنگامی استفاده می‌شود که متد __iter__ چیزی را برگرداند که یک تکرارپذیر نباشد (یعنی فاقد متد __next__ باشد)
متد خاص %r انتظار %s پارامتر را دارد، %d %s داده شده است هنگامی صادر می‌شود که یک متد خاص با تعداد نامعتبری از پارامترها تعریف شده باشد. اگر تعداد آنها بسیار کم یا بسیار زیاد باشد، ممکن است متد اصلاً کار نکند.
__len__ یک عدد صحیح غیرمنفی برنمی‌گرداند هنگامی استفاده می‌شود که متد __len__ چیزی برگرداند که یک عدد صحیح غیرمنفی نباشد
__bool__ مقدار bool برنمی‌گرداند هنگامی استفاده می‌شود که متد __bool__ چیزی برگرداند که bool نباشد
__index__ مقدار int برنمی‌گرداند هنگامی استفاده می‌شود که متد __index__ چیزی برگرداند که یک عدد صحیح نباشد
__repr__ مقدار str برنمی‌گرداند هنگامی استفاده می‌شود که متد __repr__ چیزی برگرداند که یک رشته نباشد
__str__ مقدار str برنمی‌گرداند هنگامی استفاده می‌شود که متد __str__ چیزی برگرداند که یک رشته نباشد
__bytes__ مقدار bytes برنمی‌گرداند هنگامی استفاده می‌شود که متد __bytes__ چیزی برگرداند که bytes نباشد
__hash__ مقدار int برنمی‌گرداند هنگامی استفاده می‌شود که متد __hash__ چیزی برگرداند که یک عدد صحیح نباشد
__length_hint__ یک عدد صحیح غیرمنفی برنمی‌گرداند هنگامی استفاده می‌شود که متد __length_hint__ چیزی برگرداند که یک عدد صحیح غیرمنفی نباشد
__format__ مقدار str برنمی‌گرداند هنگامی استفاده می‌شود که متد __format__ چیزی برگرداند که یک رشته نباشد
__getnewargs__ یک چندتایی (tuple) برنمی‌گرداند هنگامی استفاده می‌شود که متد __getnewargs__ چیزی برگرداند که یک تاپل نباشد
__getnewargs_ex__ یک تاپل شامل (tuple, dict) برنمی‌گرداند هنگامی استفاده می‌شود که متد __getnewargs_ex__ چیزی برگرداند که به فرم tuple(tuple, dict) نباشد
مشخصهٔ %r بیرون از __init__ تعریف شده است هنگامی استفاده می‌شود که یک مشخصهٔ نمونه در خارج از متد __init__ تعریف شود.
متد ایستا با %r به عنوان نخستین آرگومان هنگامی استفاده می‌شود که یک متد ایستا دارای "self" یا مقداری مشخص‌شده در گزینهٔ valid-classmethod-first-arg یا گزینهٔ valid-metaclass-classmethod-first-arg به عنوان نخستین آرگومان باشد.
دسترسی به عضو محافظت‌شدهٔ %s از یک کلاس کلاینت هنگامی استفاده می‌شود که به یک عضو محافظت‌شده (یعنی عضو کلاسی با نامی که با یک زیرخط آغاز می‌شود) در خارج از کلاس یا نوادگان کلاسی که در آن تعریف شده، دسترسی پیدا شود.
عضو پرچم %(overlap)s جایگاه‌های بیتی مشترکی با %(sources)s دارد هنگامی استفاده می‌شود که چندین مقدار عدد صحیح تعریف‌شده درون یک کلاس enum.IntFlag، در یک جایگاه بیتی مشترک سهیم باشند.
متد %s %s %r هنگامی استفاده می‌شود که متدی تعداد آرگومان متفاوتی نسبت به رابط پیاده‌سازی‌شده یا متد بازنویسی‌شده داشته باشد. آرگومان‌های اضافی دارای مقدار پیش‌فرض نادیده گرفته می‌شوند.
امضا با متد %s %r متفاوت است هنگامی استفاده می‌شود که امضای متد با رابط پیاده‌سازی‌شده یا متد بازنویسی‌شده متفاوت باشد.
متد %r در کلاس %r انتزاعی است اما در کلاس فرزند %r بازنویسی نشده است هنگامی استفاده می‌شود که یک متد انتزاعی (یعنی با صادر کردن NotImplementedError) در یک کلاس واقعی (concrete) بازنویسی نشده باشد.
متد __init__ از کلاس پایهٔ %r فراخوانی نشده است هنگامی استفاده می‌شود که کلاس نیاکان دارای متد __init__ باشد که توسط کلاس مشتق‌شده فراخوانی نشده است.
متد __init__ از یک کلاس پایهٔ غیرمستقیم %r فراخوانی شده است هنگامی استفاده می‌شود که متد __init__ روی کلاسی فراخوانی شود که در میان نیاکان مستقیم کلاسِ تحلیل‌شده قرار ندارد..TP invalid-overridden-method (W0236) انتظار می‌رفت متد %r به‌صورت %r باشد، اما در عوض %r یافت شد زمانی استفاده می‌شود که تشخیص داده شود متدی به روشی بازنویسی شده است که با کلاس پایهٔ آن مطابقت ندارد و می‌تواند منجر به بروز باگ‌های احتمالی در زمان اجرا شود.
%s %s متد %r زمانی استفاده می‌شود که نام پارامتر یک متد با نام آن در رابط (interface) پیاده‌سازی‌شده یا در یک متد بازنویسی‌شده متفاوت باشد.
عضو خصوصی استفاده‌نشدهٔ `%s.%s` زمانی صادر می‌شود که یک عضو خصوصی از یک کلاس تعریف شده باشد اما مورد استفاده قرار نگیرد.
متد %r متدی تعریف‌شده در کلاس %r را که با typing.final تزیین شده است بازنویسی می‌کند زمانی استفاده می‌شود که متدی تزیین‌شده با typing.final بازنویسی شده باشد.
کلاس %r زیرکلاسی از یک کلاس تزیین‌شده با typing.final است: %r زمانی استفاده می‌شود که از کلاسی تزیین‌شده با typing.final زیرکلاس ساخته شده باشد.
اسلات‌های بازتعریف‌شدهٔ %r در زیرکلاس زمانی استفاده می‌شود که یک اسلات در یک زیرکلاس دوباره تعریف شده باشد.
فراخوانی super بدون پرانتز زمانی استفاده می‌شود که فراخوانی super فاقد پرانتز باشد و از این رو یک فراخوانی واقعی نبوده و طبق انتظار عمل نکند.
تفویض بیهوده به والد یا ()super در متد %r زمانی استفاده می‌شود که بتوان تشخیص داد یک متد بازنویسی‌شده بیهوده است و با تکیه بر تفویض به والد یا ()super همان کاری را انجام می‌دهد که متد دیگری از MRO انجام می‌دهد.
استفاده از دکوراتور را به‌جای فراخوانی classmethod در نظر بگیرید زمانی استفاده می‌شود که یک متد کلاسی بدون استفاده از ساختار دکوراتور تعریف شده باشد.
استفاده از دکوراتور را به‌جای فراخوانی staticmethod در نظر بگیرید زمانی استفاده می‌شود که یک متد ایستا بدون استفاده از ساختار دکوراتور تعریف شده باشد.
کلاس %r از object ارث‌بری می‌کند، در python3 می‌توان آن را با اطمینان از پایه‌ها حذف کرد زمانی استفاده می‌شود که یک کلاس از object ارث‌بری کند، که در python3 ضمنی است، بنابراین می‌توان آن را با اطمینان از کلاس‌های پایه حذف کرد.
نمی‌توان برای ویژگی‌ها (properties) پارامتر تعریف کرد زمانی استفاده می‌شود که تشخیص داده شود یک ویژگی دارای پارامتر نیز هست، که بی‌فایده است زیرا ویژگی‌ها را نمی‌توان با آرگومان‌های اضافی فراخوانی کرد.
متد کلاسی %s باید %s را به عنوان آرگومان نخست داشته باشد زمانی استفاده می‌شود که نام آرگومان نخست یک متد کلاسی با مقدار مشخص‌شده در گزینهٔ valid-classmethod-first-arg (پیش‌فرض "cls") متفاوت باشد؛ رعایت این مورد برای تمایز آسان آن‌ها از متدهای معمولی نمونه توصیه می‌شود.
متد متاکلاس %s باید %s را به عنوان آرگومان نخست داشته باشد زمانی استفاده می‌شود که نام آرگومان نخست یک متد متاکلاس با مقدار مشخص‌شده در گزینهٔ valid-classmethod-first-arg (پیش‌فرض "cls") متفاوت باشد؛ رعایت این مورد برای تمایز آسان آن‌ها از متدهای معمولی نمونه توصیه می‌شود.
متد کلاسی متاکلاس %s باید %s را به عنوان آرگومان نخست داشته باشد زمانی استفاده می‌شود که نام آرگومان نخست یک متد کلاسی متاکلاس با مقدار مشخص‌شده در گزینهٔ valid-metaclass-classmethod-first-arg (پیش‌فرض "mcs") متفاوت باشد؛ رعایت این مورد برای تمایز آسان آن‌ها از متدهای معمولی نمونه توصیه می‌شود.
ویژگی __slots__ کلاس باید یک شیء پیمایش‌پذیر غیررشته‌ای باشد زمانی استفاده می‌شود که __slots__ کلاس به‌جای یک شیء پیمایش‌پذیر، یک رشتهٔ ساده باشد.
ناتوان در بررسی امضای متدها (%s / %s) زمانی استفاده می‌شود که Pylint به دلیلی غیرمنتظره قادر به بررسی سازگاری امضای متدها نبوده باشد. لطفاً در صورت مشاهدهٔ این مورد، آن را گزارش دهید.

نام دقیق این بررسی‌کننده dataclass است.

Invalid usage of field(), %s مشخص‌کنندهٔ dataclasses.field() تنها باید به عنوان مقدار یک انتساب درون یک dataclass، یا درون تابع make_dataclass() استفاده شود.

نام دقیق این بررسی‌کننده design است.

همچنین مستندات گزینه‌های بررسی‌کنندهٔ design را ببینید: <#design-options>

Too many ancestors (%s/%s) هنگامی استفاده می‌شود که کلاس بیش از حد کلاس‌های والد (اجداد) داشته باشد؛ تلاش کنید آن را کاهش دهید تا به کلاسی ساده‌تر (و در نتیجه با کاربرد آسان‌تر) دست یابید.
Too many instance attributes (%s/%s) هنگامی استفاده می‌شود که کلاس بیش از حد مشخصه‌های نمونه داشته باشد؛ تلاش کنید آن را کاهش دهید تا به کلاسی ساده‌تر (و در نتیجه با کاربرد آسان‌تر) دست یابید.
Too few public methods (%s/%s) هنگامی استفاده می‌شود که کلاس متدهای عمومی بسیار کمی دارد؛ بنابراین مطمئن شوید که واقعاً ارزشش را دارد.
Too many public methods (%s/%s) هنگامی استفاده می‌شود که کلاس متدهای عمومی بیش از حد داشته باشد؛ تلاش کنید آن را کاهش دهید تا به کلاسی ساده‌تر (و در نتیجه با کاربرد آسان‌تر) دست یابید.
Too many return statements (%s/%s) هنگامی استفاده می‌شود که یک تابع یا متد بیش از حد دستور بازگشت (return) داشته باشد که دنبال کردن آن را دشوار می‌کند.
Too many branches (%s/%s) هنگامی استفاده می‌شود که یک تابع یا متد بیش از حد شاخه داشته باشد که دنبال کردن آن را دشوار می‌کند.
Too many arguments (%s/%s) هنگامی استفاده می‌شود که یک تابع یا متد بیش از حد آرگومان بپذیرد.
Too many local variables (%s/%s) هنگامی استفاده می‌شود که یک تابع یا متد بیش از حد متغیر محلی داشته باشد.
Too many statements (%s/%s) هنگامی استفاده می‌شود که یک تابع یا متد بیش از حد دستور داشته باشد. در این صورت باید آن را به توابع یا متدهای کوچک‌تر تقسیم کنید.
Too many boolean expressions in if statement (%s/%s) هنگامی استفاده می‌شود که یک دستور if شامل عبارت‌های بولی بیش از حد باشد.
Too many positional arguments (%s/%s) هنگامی استفاده می‌شود که یک تابع بیش از حد آرگومان مکانی بپذیرد.

نام دقیق این بررسی‌کننده exceptions است.

همچنین مستندات گزینه‌های بررسی‌کنندهٔ exceptions را ببینید: <#exceptions-options>

Bad except clauses order (%s) هنگامی استفاده می‌شود که بندهای except به ترتیب درست (از خاص‌ترین به عمومی‌ترین) قرار نگرفته باشند. اگر این ترتیب را اصلاح نکنید، ممکن است برخی استثناها توسط گردانندهٔ خاص‌تر گرفته نشوند.
Raising %s while only classes or instances are allowed هنگامی استفاده می‌شود که چیزی که نه یک کلاس و نه یک نمونه است برانگیخته (raise) شود (یعنی یک TypeError برانگیخته خواهد شد).
The raise statement is not inside an except clause هنگامی استفاده می‌شود که یک دستور raise خالی درون یک بند except به کار نرفته باشد. این کار خطا ایجاد می‌کند، زیرا هیچ استثنای فعالی برای ایجاد مجدد (re-raise) وجود ندارد. یک استثنا بر این قاعده، raise خالی درون یک بند finally است که تا زمانی که استثنایی درون بلوک try ایجاد شده باشد ممکن است کار کند، اما با این وجود یک بوی بد کد (code smell) است و نباید به آن اتکا کرد.
Exception cause set to something which is not an exception, nor None هنگامی استفاده می‌شود که از نحو "raise ... from ..." استفاده شود، در حالی که علت استثنا نه یک استثنا است و نه None.
Raising a class which doesn't inherit from BaseException هنگامی استفاده می‌شود که کلاسی برانگیخته (raise) شود که از BaseException ارث‌بری نمی‌کند.
NotImplemented raised - should raise NotImplementedError هنگامی استفاده می‌شود که به جای NotImplementedError مقدار NotImplemented برانگیخته (raise) شود.
Catching an exception which doesn't inherit from Exception: %s هنگامی استفاده می‌شود که کلاسی که از Exception ارث‌بری نمی‌کند به عنوان استثنا در یک بند except استفاده شود.
No exception type(s) specified یک بند خالی except: استثناهای SystemExit و KeyboardInterrupt را دریافت خواهد کرد که این کار متوقف کردن برنامه با Control-C را دشوارتر ساخته و می‌تواند مشکلات دیگر را پنهان کند. اگر می‌خواهید تمام استثناهایی را که بیانگر خطاهای برنامه هستند دریافت کنید، از except Exception: استفاده نمایید (except خالی معادل except BaseException: است).
Catching previously caught exception type %s هنگامی استفاده می‌شود که یک except نوعی را دریافت کند که پیش‌تر توسط یک گردانندهٔ قبلی گرفته شده است.
The except handler raises immediately هنگامی استفاده می‌شود که یک گردانندهٔ except از raise به عنوان اولین یا تنها عملگر خود استفاده کند. این کار بیهوده است زیرا بلافاصله استثنا را دوباره برمی‌انگیزد. عملگر raise یا کل بلوک try-except-raise را حذف کنید!
Consider explicitly re-raising using %s'%s from %s' زنجیره‌سازی استثناها (exception chaining) در Python ردپای پشتهٔ (traceback) استثنای فعلی و همچنین استثنای اصلی را نشان می‌دهد. هنگامی که پس از دریافت یک استثنا، استثنای جدیدی برمی‌انگیزید، محتمل است که استثنای دوم بسته‌بندی مجدد و مناسب‌تری از استثنای اول باشد. در چنین مواردی، raise from پیوند بهتری را بین دو traceback در خطای نهایی برقرار می‌کند.
Exception to catch is the result of a binary "%s" operation هنگامی استفاده می‌شود که استثنای مورد نظر برای دریافت، به فرم "except A or B:" باشد. اگر قصد دریافت چندین استثنا را دارید، آن را به صورت "except (A, B):" بازنویسی کنید.
Exception arguments suggest string formatting might be intended هنگامی استفاده می‌شود که چندین آرگومان به سازندهٔ استثنا ارسال شود که نخستین آن‌ها یک لیترال رشته‌ای حاوی مواردی است که به نظر می‌رسد جایگزین‌هایی برای قالب‌بندی باشند.
Invalid exception operation. %s هنگامی استفاده می‌شود که عملیاتی روی یک استثنا انجام شود، اما آن عملیات برای استثنای مد نظر معتبر نباشد. معمولاً هنگام وجود عملیات دودویی میان استثناها در گرداننده‌های except صادر می‌شود.
Catching too general exception %s اگر از یک بند سادهٔ except Exception: استفاده کنید، ممکن است در نهایت استثناهایی غیر از مواردی که انتظارش را دارید دریافت کنید. این کار می‌تواند باگ‌ها را مخفی کند یا با پنهان کردن خطاهای غیرمرتبط، اشکال‌زدایی برنامه‌ها را دشوارتر سازد.
Raising too general exception: %s برانگیختن استثناهایی که بیش از حد عمومی هستند، شما را وادار می‌کند تا استثناها را نیز به صورت عمومی دریافت کنید. این امر شما را ناچار به استفاده از یک بند سادهٔ except Exception: خواهد کرد؛ آن‌گاه ممکن است در نهایت استثناهایی به جز موارد مورد نظرتان را دریافت کنید. این کار می‌تواند باگ‌ها را مخفی کند یا با پنهان کردن خطاهای غیرمرتبط، اشکال‌زدایی برنامه‌ها را دشوارتر سازد.

نام دقیق این بررسی‌کننده format است.

همچنین مستندات گزینه‌های بررسی‌کننده format را ببینید: <#format-options>

نقطه‌ویرگول غیرضروری زمانی استفاده می‌شود که یک دستور با نقطه‌ویرگول (";") پایان یابد، که نیازی به آن نیست (این python است، نه C ;).
دندانه‌گذاری نادرست. مقدار %s %s یافت شد، مورد انتظار: %s زمانی استفاده می‌شود که تعداد غیرمنتظره‌ای از نویسه‌های تب یا فاصله‌های دندانه‌گذاری یافت شود.
line-too-long (C0301)
خط بسیار طولانی (%s/%s) زمانی استفاده می‌شود که یک خط از تعداد معینی نویسه طولانی‌تر باشد.
خطوط بیش از حد در پودمان (%s/%s) زمانی استفاده می‌شود که یک پودمان خطوط بسیار زیادی داشته باشد و خوانایی آن کاهش یابد.
فاصله‌های خالی انتهای خط زمانی استفاده می‌شود که بین پایان خط و نویسه خط جدید، فاصله خالی وجود داشته باشد.
خط جدید پایانی وجود ندارد زمانی استفاده می‌شود که آخرین خط یک فایل فاقد خط جدید باشد.
خط‌های جدید انتهایی زمانی استفاده می‌شود که خطوط خالی اضافی در انتهای فایل وجود داشته باشد.
بیش از یک دستور در یک خط زمانی استفاده می‌شود که بیش از یک دستور در یک خط یافت شود.
پرانتزهای غیرضروری پس از کلیدواژه %r زمانی استفاده می‌شود که یک قلم تنها درون پرانتز پس از کلیدواژه‌های if، for یا دیگر کلیدواژه‌ها قرار گیرد.
پایان خط‌های ترکیبی LF و CRLF زمانی استفاده می‌شود که نشانه‌های خط جدید ترکیبی (LF و CRLF) در یک فایل وجود داشته باشد.
قالب پایان خط غیرمنتظره. مقدار '%s' وجود دارد در حالی که باید '%s' باشد. زمانی استفاده می‌شود که پایان خط با مقدار مورد انتظار متفاوت باشد.

نام دقیق این بررسی‌کننده imports است.

همچنین مستندات گزینه‌های بررسی‌کننده imports را ببینید: <#imports-options>

ناتوان در واردسازی %s زمانی استفاده می‌شود که pylint نتوانسته باشد یک پودمان را وارد کند.
تلاش برای واردسازی نسبی فراتر از بالاترین سطح بسته زمانی استفاده می‌شود که یک واردسازی نسبی تلاش کند به سطوحی فراتر از بسته جاری دسترسی یابد.
واردسازی با نویسه عمومی %s زمانی استفاده می‌شود که from module import * شناسایی شود.
واردسازی دوباره %r (واردشده در خط %s) زمانی استفاده می‌شود که یک پودمان بیش از یک بار وارد شود.
واردسازی پودمان توسط خودش زمانی استفاده می‌شود که یک پودمان خودش را وارد کند.
ترجیح واردسازی %r به‌جای %r زمانی استفاده می‌شود که برای پودمان واردشده یک پودمان جایگزین ترجیحی وجود داشته باشد.
واردسازی __future__ نخستین دستور غیر docstring نیست در Python 2.5 و بالاتر الزامی است که واردسازی __future__ نخستین دستور غیر docstring در پودمان باشد.
واردسازی پوشانده‌شده %r (واردشده در خط %s) زمانی استفاده می‌شود که یک پودمان با نام مستعاری مشخص شود که واردسازی دیگری را می‌پوشاند.
پودمان منسوخ‌شده %r پودمانی که به عنوان منسوخ‌شده علامت‌گذاری شده، وارد شده است.
واردسازی چرخه‌ای (%s) زمانی استفاده می‌شود که یک واردسازی چرخه‌ای میان دو یا چند پودمان شناسایی شود.
به‌جای آن از 'from %s import %s' استفاده کنید زمانی صادر می‌شود که یک زیرپودمان از یک بسته وارد شده و با همان نام مستعار نام‌گذاری شود؛ برای نمونه به‌جای import concurrent.futures as futures از from concurrent import futures استفاده کنید.
چندین واردسازی در یک خط (%s) زمانی استفاده می‌شود که دستور import که چندین پودمان را وارد می‌کند شناسایی شود.
%s باید پیش از %s قرار گیرد زمانی استفاده می‌شود که ترتیب واردسازی‌های PEP8 رعایت نشده باشد (ابتدا واردسازی‌های استاندارد، سپس کتابخانه‌های شخص ثالث، و در نهایت واردسازی‌های محلی).
واردسازی‌ها از بسته %s گروه‌بندی نشده‌اند زمانی استفاده می‌شود که واردسازی‌ها بر اساس بسته‌ها گروه‌بندی نشده باشند.
واردسازی "%s" باید در بالای پودمان قرار گیرد زمانی استفاده می‌شود که کدها و واردسازی‌ها با یکدیگر آمیخته شده باشند.
نام مستعار واردسازی نام بسته اصلی را تغییر نمی‌دهد زمانی استفاده می‌شود که نام مستعار واردسازی با بسته اصلی یکسان باشد؛ برای نمونه، استفاده از import numpy as numpy به‌جای import numpy as np.
واردسازی خارج از بالاترین سطح (%s) زمانی استفاده می‌شود که دستور واردسازی در جایی غیر از بالاترین سطح (toplevel) پودمان به کار رفته باشد. این واردسازی را به بالای فایل منتقل کنید.
وابستگی‌های خارجی
گراف وابستگی‌های ماژول‌ها

نام دقیق بررسی‌کننده lambda-expressions است.

عبارت لامبدا به یک متغیر نسبت داده شده است. در عوض تابعی را با کلیدواژه "def" تعریف کنید. هنگامی استفاده می‌شود که یک عبارت لامبدا به جای تعریف تابعی استاندارد با کلیدواژه "def"، به یک متغیر نسبت داده شود.
عبارت لامبدا مستقیماً فراخوانی شده است. به جای آن عبارت را به‌صورت درون‌خطی اجرا کنید. هنگامی استفاده می‌شود که یک عبارت لامبدا به جای اجرای درون‌خطی (inline) محتوای آن، به‌طور مستقیم فراخوانی شود.

نام دقیق بررسی‌کننده logging است.

همچنین مستندات گزینه‌های بررسی‌کننده logging را ببینید: <#logging-options>

کاراکتر قالب‌بندی لاگ‌گیری پشتیبانی‌نشده %r (%#02x) در اندیس %d هنگامی استفاده می‌شود که یک نویسه قالب‌بندی پشتیبانی‌نشده در رشته قالب یک عبارت لاگ‌گیری به کار رود.
رشته قالب لاگ‌گیری در میانه مشخص‌کننده تبدیل پایان یافته است هنگامی استفاده می‌شود که رشته قالب عبارت لاگ‌گیری پیش از پایان مشخص‌کننده تبدیل خاتمه یابد.
آرگومان‌های بیش از حد برای رشته قالب لاگ‌گیری هنگامی استفاده می‌شود که آرگومان‌های بیش از اندازه‌ای به رشته قالب لاگ‌گیری داده شود.
نبود آرگومان‌های کافی برای رشته قالب لاگ‌گیری هنگامی استفاده می‌شود که آرگومان‌های بسیار کمی به رشته قالب لاگ‌گیری داده شود.
استفاده از قالب‌بندی %s در توابع لاگ‌گیری هنگامی استفاده می‌شود که عبارت لاگ‌گیری شکلی مانند "logging.<logging method>(format_string % (format_args...))" داشته باشد. در عوض از نوع دیگری از قالب‌بندی رشته استفاده کنید. می‌توانید از قالب‌بندی % استفاده کنید اما با ارسال پارامترها به عنوان آرگومان، جای‌گذاری (interpolation) را به تابع لاگ‌گیری بسپارید. اگر logging-fstring- interpolation غیرفعال باشد، می‌توانید از قالب‌بندی fstring استفاده کنید. اگر logging- format-interpolation غیرفعال باشد، می‌توانید از str.format استفاده کنید.
استفاده از قالب‌بندی %s در توابع لاگ‌گیری هنگامی استفاده می‌شود که عبارت لاگ‌گیری شکلی مانند "logging.<logging method>(format_string.format(format_args...))" داشته باشد. در عوض از نوع دیگری از قالب‌بندی رشته استفاده کنید. می‌توانید از قالب‌بندی % استفاده کنید اما با ارسال پارامترها به عنوان آرگومان، جای‌گذاری (interpolation) را به تابع لاگ‌گیری بسپارید. اگر logging-fstring- interpolation غیرفعال باشد، می‌توانید از قالب‌بندی fstring استفاده کنید. اگر logging- not-lazy غیرفعال باشد، می‌توانید به‌صورت عادی از قالب‌بندی % استفاده کنید.
استفاده از قالب‌بندی %s در توابع لاگ‌گیری هنگامی استفاده می‌شود که عبارت لاگ‌گیری شکلی مانند "logging.<logging method>(f"...")" داشته باشد. در عوض از نوع دیگری از قالب‌بندی رشته استفاده کنید. می‌توانید از % برای قالب‌بندی استفاده کنید اما با ارسال پارامترها به عنوان آرگومان، جای‌گذاری را به تابع لاگ‌گیری بسپارید. اگر logging-format-interpolation غیرفعال باشد، می‌توانید از str.format استفاده کنید. اگر logging-not-lazy غیرفعال باشد، می‌توانید به‌صورت عادی از قالب‌بندی % استفاده کنید.

نام دقیق بررسی‌کننده match_statements است..SS پیام‌های بررسی‌کنندهٔ دستورهای Match

الگوی تصاحب نام `case %s` باعث غیرقابل‌دسترس شدن الگوهای بعدی می‌شود. برای رفع این مشکل از یک نام نقطه‌دار (مانند یک enum) استفاده کنید. زمانی صادر می‌شود که یک الگوی تصاحب نام در دستور match استفاده شده و دستورهای case دیگری پس از آن آمده باشند.
`__match_args__` باید یک تاپل از رشته‌ها باشد. زمانی صادر می‌شود که __match_args__ تاپلی از رشته‌های لازم برای match نباشد.
%s انتظار %d زیرالگوی موقعیتی دارد (%d داده شده است) زمانی صادر می‌شود که تعداد زیرالگوهای موقعیتی از تعداد مجاز مشخص‌شده در __match_args__ فراتر رود.
چندین زیرالگو برای ویژگی %s مشخص شده است زمانی صادر می‌شود که بیش از یک زیرالگو برای یک ویژگی مشخص در الگوی کلاس وجود داشته باشد.
به‌جای آن از '%s() as %s' استفاده کنید الگوهای کلاس match زمانی سریع‌تر اجرا می‌شوند که انتساب نام برای کل الگو صورت گیرد و از هرگونه جست‌وجو برای __match_args__ صرف‌نظر شود.
به‌جای ویژگی‌های موقعیتی از ویژگی‌های کلیدواژه‌ای استفاده کنید (%s) ویژگی‌های کلیدواژه‌ای صریح‌تر و اندکی سریع‌تر هستند، زیرا CPython می‌تواند از جست‌وجوی __match_args__ صرف‌نظر کند.

نام دقیق این بررسی‌کننده method_args است.

همچنین مستندات گزینه‌های بررسی‌کنندهٔ method_args را ببینید: <#method-args-options>

به `%s()` تعدادی آرگومان فقط‌موقعیتی به‌صورت آرگومان کلیدواژه‌ای داده شده است: %s زمانی صادر می‌شود که آرگومان‌های فقط‌موقعیتی به‌صورت آرگومان‌های کلیدواژه‌ای ارسال شده باشند. کلیدواژه‌ها را برای آرگومان‌های مربوطه در فراخوانی تابع حذف کنید.
نبود آرگومان timeout برای متد '%s' می‌تواند برنامهٔ شما را به طور نامحدود متوقف کند زمانی استفاده می‌شود که متدی برای جلوگیری از انتظار طولانی‌مدت به پارامتر 'timeout' نیاز داشته باشد. اگر هیچ مهلت زمانی به‌طور صریح مشخص نشود، مقدار پیش‌فرض استفاده خواهد شد. برای نمونه در 'requests'، برنامه هرگز منقضی نخواهد شد (یعنی تا ابد قفل می‌شود).

نام دقیق این بررسی‌کننده metrics است.

سنجه‌های خام

نام دقیق این بررسی‌کننده miscellaneous است.

همچنین مستندات گزینه‌های بررسی‌کنندهٔ miscellaneous را ببینید: <#miscellaneous-options>

زمانی استفاده می‌شود که یادداشت هشداری مانند FIXME یا XXX تشخیص داده شود.
زمانی استفاده می‌شود که پیامی با استفاده از شناسه (id) فعال یا غیرفعال شود.

نام دقیق این بررسی‌کننده modified_iteration است.

dict در حال پیمایش '%s' در بدنهٔ حلقهٔ for در حال تغییر است، به‌جای آن یک رونوشت از آن را پیمایش کنید. زمانی صادر می‌شود که مواردی به دیکشنری (dict) در حال پیمایش اضافه یا از آن حذف شوند. انجام این کار خطای RuntimeError ایجاد می‌کند.
set در حال پیمایش '%s' در بدنهٔ حلقهٔ for در حال تغییر است، به‌جای آن یک رونوشت از آن را پیمایش کنید. زمانی صادر می‌شود که مواردی به مجموعه (set) در حال پیمایش اضافه یا از آن حذف شوند. انجام این کار خطای RuntimeError ایجاد می‌کند.
list در حال پیمایش '%s' در بدنهٔ حلقهٔ for در حال تغییر است، پیمایش روی یک رونوشت از آن را در نظر بگیرید. زمانی صادر می‌شود که مواردی به لیست (list) در حال پیمایش اضافه یا از آن حذف شوند. انجام این کار می‌تواند به رفتار غیرمنتظره منجر شود؛ به همین دلیل بهتر است از یک رونوشت از لیست استفاده شود.

نام دقیق بازبین nested_min_max است.

از فراخوانی تو‌درتوی '%s' استفاده نکنید؛ می‌توان به‌جای آن از '%s' استفاده کرد فراخوانی‌های تو‌درتوی min(1, min(2, 3)) را می‌توان به‌صورت min(1, 2, 3) بازنویسی کرد.

نام دقیق بازبین newstyle است.

آرگومان نخست نادرست %r به super() داده شده است زمانی استفاده می‌شود که آرگومانی غیر از کلاس فعلی به‌عنوان نخستین آرگومان به تابع توکار super داده شود.

نام دقیق بازبین nonascii-checker است.

نام %s با عنوان "%s" شامل یک نویسه غیر ASCII است. در Python 3.5، استاندارد PEP 3131 شناسه‌های غیر ASCII را مجاز می‌داند، اما نام فایل‌های غیر ASCII را نه. از Python 3.5 به بعد، با وجود اینکه Python از فایل‌های UTF-8 پشتیبانی می‌کند، برخی از ویرایشگرها یا ابزارها این‌گونه نیستند.
نام %s با عنوان "%s" شامل یک نویسه غیر ASCII است، تغییر نام آن را در نظر بگیرید. زمانی استفاده می‌شود که نام دست‌کم دارای یک نویسه یونیکد غیر ASCII باشد. برای پیش‌زمینه‌ای دربارهٔ اینکه چرا این موضوع می‌تواند نامطلوب باشد، https://peps.python.org/pep-0672/#confusing-features را ببینید. اگر شیوه‌نامه برنامه‌نویسی شما مشخص کرده است که به زبان انگلیسی کدنویسی می‌کنید، نباید نیازی به نویسه‌های غیر ASCII در نام‌های Python باشد. در غیر این صورت می‌توانید به‌سادگی این بررسی را غیرفعال کنید.
نام %s با عنوان "%s" شامل یک نویسه غیر ASCII است، برای وارد کردن از یک نام مستعار صرفاً ASCII استفاده کنید. زمانی استفاده می‌شود که نام دست‌کم دارای یک نویسه یونیکد غیر ASCII باشد. برای پیش‌زمینه‌ای درباره اینکه چرا این موضوع می‌تواند نامطلوب باشد، https://peps.python.org/pep-0672/#confusing-features را ببینید. اگر شیوه‌نامه برنامه‌نویسی شما مشخص کرده است که به زبان انگلیسی کدنویسی می‌کنید، نباید نیازی به نویسه‌های غیر ASCII در نام‌های Python باشد. در غیر این صورت می‌توانید به‌سادگی این بررسی را غیرفعال کنید.

نام دقیق بازبین refactoring است.

همچنین مستندات گزینه‌های بازبین refactoring را در <#refactoring-options> ببینید

ادغام این فراخوانی‌های isinstance به isinstance(%s, (%s)) را در نظر بگیرید زمانی استفاده می‌شود که چندین فراخوانی پیاپی isinstance را بتوان در یکی ادغام کرد.
بلوک‌های تو‌درتوی بیش از حد مجاز (%s/%s) زمانی استفاده می‌شود که یک تابع یا متد دارای بلوک‌های تو‌درتوی بسیار زیادی باشد. این امر درک و نگهداری کد را دشوارتر می‌کند.
دستور if می‌تواند با %s جایگزین شود زمانی استفاده می‌شود که یک دستور if را بتوان با 'bool(test)' جایگزین کرد.
بازتعریف آرگومان با نام محلی %r زمانی استفاده می‌شود که یک نام محلی در حال بازتعریف یک آرگومان باشد، که می‌تواند نشان‌دهنده یک خطای احتمالی باشد. این موضوع تنها برای تعداد اندکی از عملیات انتساب نام در نظر گرفته می‌شود، مانند تکرار حلقه for، انتساب در دستور with و انتساب در مدیریت‌کننده استثنا (exception handler).
عبارت غیرضروری "%s" پس از "return"، %s به‌منظور مشخص کردن یک بلوک کد غیرضروری پس از یک if یا یک try/except حاوی دستور return استفاده می‌شود. بدین ترتیب، هنگامی که پس از زنجیره‌ای از ifها که همگی حاوی دستور return هستند به یک else برخورد کند، هشدار خواهد داد.
استفاده از عبارت شرطی سه‌گانه (%s) را در نظر بگیرید زمانی استفاده می‌شود که یکی از ساختارهای نحوی سه‌گانه شناخته‌شده پیش از Python 2.5 استفاده شده باشد.
غیرمجاز بودن چندتایی (tuple) با کامای پایانی در Python، یک tuple در واقع با نماد کاما ایجاد می‌شود، نه با پرانتزها. متأسفانه ممکن است با قرار دادن نابجای یک کامای پایانی ناخواسته یک tuple ایجاد شود که می‌تواند منجر به بروز باگ‌های عجیب بالقوه در کد شما گردد. همواره باید صریحاً از پرانتزها برای ایجاد tuple استفاده کنید.
استثنای StopIteration را در مولد ایجاد نکنید، به‌جای آن از دستور return استفاده کنید طبق PEP 479، ایجاد استثنای StopIteration با دستور raise برای پایان دادن به حلقه یک مولد (generator) ممکن است به باگ‌هایی منجر شود که یافتن آن‌ها دشوار است. این PEP مشخص می‌کند که raise StopIteration باید با یک دستور return ساده جایگزین گردد
عبارت بولی می‌تواند به %s ساده شود زمانی صادر می‌شود که ساختار نحوی سه‌گانه زائد مربوط به نسخه‌های پیش از Python 2.5 به کار رفته باشد.
یا تمام دستورهای return در یک تابع باید یک عبارت را برگردانند، یا هیچ‌کدام نباید برگردانند. طبق PEP 8، اگر هر دستور return عبارتی را بازگرداند، تمام دستورهای return دیگری که مقداری برنمی‌گردانند باید صریحاً این موضوع را به‌صورت return None قید کنند، و یک دستور صریح return باید در انتهای تابع (در صورت دردسترس بودن مسیر اجرا) وجود داشته باشد
دستور return بی‌فایده در انتهای تابع یا متد زمانی صادر می‌شود که یک دستور تکی "return" یا "return None" در پایان تعریف تابع یا متد یافت شود. این دستور را می‌توان با خیال راحت حذف کرد چرا که Python به‌طور ضمنی مقدار None را برمی‌گرداند
استفاده از باز کردن چندتایی (tuple unpacking) را برای جابه‌جایی متغیرها در نظر بگیرید برای جابه‌جا کردن متغیرها نیازی به استفاده از یک متغیر کمکی موقت ندارید. استفاده از "tuple unpacking" برای جابه‌جایی مستقیم متغیرها مقصود کد را واضح‌تر می‌سازد.
استفاده از str.join(sequence) را برای الحاق رشته‌ها از یک شیء تکرارپذیر در نظر بگیرید استفاده از str.join(sequence) در مقایسه با تکرار با حلقه for سریع‌تر است، حافظه کمتری مصرف می‌کند و خوانایی را افزایش می‌دهد.
ادغام این مقایسه‌ها با 'in' را با استفاده از '%s %sin (%s)' در نظر بگیرید. در صورتی که عناصر هش‌پذیر هستند، در عوض از یک مجموعه (set) استفاده کنید. برای بررسی اینکه آیا یک متغیر با یکی از چندین مقدار برابر است یا خیر، مقادیر را در یک set یا tuple ترکیب کرده و به‌جای بررسی برابری با تک‌تک مقادیر، بررسی کنید که آیا متغیر درون آن قرار دارد ("in") یا خیر. این کار سریع‌تر است و کدنویسی کمتری دارد.
استفاده از dict.get را برای گرفتن مقادیر از یک فرهنگ‌لغت (dict) در صورت وجود کلید یا مقدار پیش‌فرض در صورت نبود آن در نظر بگیرید استفاده از تابع توکار dict.get برای دریافت یک مقدار از دیکشنری در صورت وجود کلید یا یک مقدار پیش‌فرض در صورت عدم وجود، ساده‌تر است و روشی اصطلاحی‌تر (idiomatic) به شمار می‌رود، اگرچه گاهی اندکی کندتر است
ساده‌سازی مقایسه زنجیره‌ای میان عملوندها این پیام زمانی صادر می‌شود که pylint با یک عملیات بولی مانند "a < b and b < c" مواجه شود و پیشنهاد بازنویسی آن را به‌صورت "a < b < c" ارائه دهد
استفاده از ساخت دیکشنری با درک مطلب (dict comprehension) را در نظر بگیرید زمانی صادر می‌شود که ایجاد یک دیکشنری با استفاده از فراخوانی dict() و یک لیست موقت تشخیص داده شود. اگرچه از نظر نحوی مشکلی در این کد وجود ندارد، اما خواندن آن دشوار است و می‌تواند به یک dict comprehension ساده شود. همچنین سریع‌تر است زیرا نیازی به ایجاد یک لیست موقت دیگر ندارید
استفاده از ساخت مجموعه با درک مطلب (set comprehension) را در نظر بگیرید اگرچه از نظر نحوی مشکلی در این کد وجود ندارد، اما خواندن آن دشوار است و می‌تواند به یک set comprehension ساده شود. همچنین سریع‌تر است چرا که نیازی به ایجاد یک لیست موقت دیگر ندارید
عبارت if می‌تواند با %s جایگزین شود زمانی استفاده می‌شود که یک عبارت if بتواند با 'bool(test)' یا در صورت ضمنی بودن تبدیل نوع بولی صرفاً با 'test' جایگزین شود.
عبارت غیرضروری "%s" پس از "raise"، %s به‌منظور مشخص کردن یک بلوک کد غیرضروری پس از یک if یا try/except حاوی دستور raise استفاده می‌شود. بدین ترتیب، هنگامی که پس از زنجیره‌ای از ifها که همگی حاوی دستور raise هستند به یک else برخورد کند، هشدار خواهد داد.
استفاده غیرضروری از درک مطلب (comprehension)، به‌جای آن از %s استفاده کنید. به‌جای استفاده از یک comprehension همانی، استفاده از سازنده list، dict یا set را در نظر بگیرید. این کار سریع‌تر و ساده‌تر است.
استفاده از 'sys.exit' را به‌جای آن در نظر بگیرید برخلاف 'exit()' یا 'quit()'، فراخوانی 'sys.exit' متکی به در دسترس بودن ماژول site نیست (زیرا ماژول 'sys' همواره در دسترس است)..TP no-else-break (R1723) "%s" غیرضروری پس از "break"، %s برای مشخص کردن یک بلوک کد غیرضروری پس از یک if حاوی دستور break به کار می‌رود. به این ترتیب، هنگامی که پس از زنجیره‌ای از دستورهای if که همگی دارای دستور break هستند با یک else مواجه شود، هشدار خواهد داد.
"%s" غیرضروری پس از "continue"، %s برای مشخص کردن یک بلوک کد غیرضروری پس از یک if حاوی دستور continue به کار می‌رود. به این ترتیب، هنگامی که پس از زنجیره‌ای از دستورهای if که همگی دارای دستور continue هستند با یک else مواجه شود، هشدار خواهد داد.
استفاده از ()super به سبک Python 3 بدون آرگومان را در نظر بگیرید هنگام فراخوانی تابع درونی ()super با کلاس و نمونهٔ فعلی صادر می‌شود. در Python 3 این آرگومان‌ها پیش‌فرض هستند و می‌توان آن‌ها را حذف کرد.
شرط بولی "%s" ممکن است به "%s" ساده شود هنگامی صادر می‌شود که یک شرط بولی امکان ساده‌سازی داشته باشد.
شرط بولی '%s' همواره به '%s' ارزیابی می‌شود هنگامی صادر می‌شود که یک شرط بولی بتواند به یک مقدار ثابت ساده‌سازی شود.
استفاده از یک generator را به جای '%s(%s)' در نظر بگیرید اگر ظرف (container) شما می‌تواند بزرگ باشد، استفاده از یک generator کارایی بهتری به همراه خواهد داشت.
به جای '%s(%s)' از یک generator استفاده کنید استفاده از comprehension درون 'any'، 'all'، 'max'، 'min' یا 'sum' غیرضروری است. یک generator کافی و سریع‌تر خواهد بود.
استفاده از '%s' را به جای بلوک غیرضروری if در نظر بگیرید استفاده از تابع درونی min به جای یک عبارت شرطی، خوانایی و ایجاز کد را بهبود می‌بخشد.
استفاده از '%s' را به جای بلوک غیرضروری if در نظر بگیرید استفاده از تابع درونی max به جای یک عبارت شرطی، خوانایی و ایجاز کد را بهبود می‌بخشد.
استفاده از 'with' را برای عملیات تخصیص منابع در نظر بگیرید هنگامی صادر می‌شود که یک انتساب یا فراخوانی تخصیص‌دهندهٔ منابع بتواند با یک بلوک 'with' جایگزین شود. با استفاده از 'with' آزادسازی منابع تخصیص‌یافته حتی در صورت بروز یک استثنا (exception) تضمین می‌شود.
جستجوی اندیس دیکشنری غیرضروری است، در عوض از '%s' استفاده کنید هنگام پیمایش روی آیتم‌های دیکشنری (جفت‌های کلید-مقدار) و دسترسی به مقدار از طریق جستجوی اندیس صادر می‌شود. می‌توان در عوض مستقیماً به مقدار دسترسی داشت.
استفاده از [] را به جای ()list در نظر بگیرید هنگام استفاده از ()list برای ایجاد یک لیست خالی به جای لیترال [] صادر می‌شود. لیترال سریع‌تر است زیرا از یک فراخوانی تابع اضافی جلوگیری می‌کند.
استفاده از '%s' را به جای فراخوانی 'dict' در نظر بگیرید. هنگام استفاده از ()dict برای ایجاد یک دیکشنری به جای لیترال '{ ... }' صادر می‌شود. لیترال سریع‌تر است زیرا از یک فراخوانی تابع اضافی جلوگیری می‌کند.
جستجوی اندیس لیست غیرضروری است، در عوض از '%s' استفاده کنید هنگام پیمایش روی یک شمارش (enumeration) و دسترسی به مقدار از طریق جستجوی اندیس صادر می‌شود. می‌توان در عوض مستقیماً به مقدار دسترسی داشت.
به جای بازگرداندن تک‌تک عناصر با yield، مستقیماً از 'yield from' استفاده کنید بازگرداندن مستقیم مقادیر از تکرارکننده (iterator) با yield نسبت به yield کردن تک‌تک عناصر در حلقه، سریع‌تر است و بدون شک کد تمیزتری ایجاد می‌کند.
تغییر دادن "%s" به "%s" را در نظر بگیرید زمانی به کار می‌رود که یک عبارت بولی حاوی نقیض غیرضروری باشد؛ برای مثال زمانی که دو عملگر نقیض یکدیگر را خنثی می‌کنند.
استفاده از enumerate را به جای پیمایش با range و len در نظر بگیرید هنگام مواجهه با کدی که با range و len پیمایش می‌کند صادر می‌شود. چنین کدی می‌تواند با استفاده از تابع درونی enumerate ساده‌سازی شود.
پیمایش مستقیم دیکشنری را به جای فراخوانی ()keys. در نظر بگیرید هنگامی صادر می‌شود که کلیدهای یک دیکشنری از طریق متد .keys() پیمایش شوند یا زمانی که .keys() برای بررسی عضویت به کار رود. پیمایش خود دیکشنری کافی است: for key in dictionary. برای بررسی‌های عضویت، عبارت if key in dictionary سریع‌تر است.
پیمایش با ()items. را در نظر بگیرید هنگام پیمایش روی کلیدهای یک دیکشنری و دسترسی به مقدار از طریق جستجوی اندیس صادر می‌شود. با پیمایش با استفاده از متد ()items. دیکشنری، می‌توان هم به کلید و هم به مقدار دسترسی داشت.
در عوض از %s استفاده کنید هنگام دسترسی تنها به عنصر اول یا آخر ()str.split صادر می‌شود. عنصر اول و آخر را می‌توان در عوض با استفاده از [0](str.split(sep, maxsplit=1 یا [1-]str.rsplit(sep, maxsplit=1) به دست آورد.
هنگام پیمایش روی مقادیر از یک نوع دنباله استفاده کنید هنگام پیمایش روی مقادیر، نوع‌های دنباله (مانند lists، tuples و ranges) کارآمدتر از sets هستند.
قالب‌بندی یک رشتهٔ عادی که می‌تواند یک f-string باشد زمانی به کار می‌رود که رشته‌ای تشخیص داده شود که با ()format یا % قالب‌بندی می‌شود در حالی که می‌تواند یک f-string باشد. استفاده از f-string ترجیح داده می‌شود. نیازمند Python 3.6 و py-version >= 3.6 است.
برای تعیین خالی بودن دنباله، از `len(SEQUENCE)` بدون مقایسه استفاده نکنید دنباله‌های خالی در یک بافتار بولی نادرست (false) تلقی می‌شوند. می‌توانید یا فراخوانی 'len' را حذف کنید (if not x) یا طول را در برابر یک مقدار اسکالر بسنجید (if len(x) > 1).
اگر صرفاً یک دنباله باشد، "%s" می‌تواند به "%s" ساده شود، چرا که یک %s خالی falsey است دنباله‌های خالی در یک بافتار بولی نادرست (false) تلقی می‌شوند. پیروی کورکورانه از این بررسی در پایگاه‌های کدی با نوع‌بندی ضعیف (weakly typed) می‌تواند مشکلاتی ایجاد کند که اشکال‌زدایی آن‌ها دشوار است. اگر مقدار بتواند چیز دیگری باشد که falsey است اما دنباله نیست (برای مثال None، یک رشتهٔ خالی، یا 0)، کد معادل نخواهد بود.
اگر صرفاً یک رشته باشد، "%s" می‌تواند به "%s" ساده شود، چرا که یک رشتهٔ خالی falsey است رشته‌های خالی در یک بافتار بولی نادرست (false) تلقی می‌شوند. پیروی کورکورانه از این بررسی در پایگاه‌های کدی با نوع‌بندی ضعیف می‌تواند مشکلاتی ایجاد کند که اشکال‌زدایی آن‌ها دشوار است. اگر مقدار بتواند چیز دیگری باشد که falsey است اما رشته نیست (برای مثال None، یک دنبالهٔ خالی، یا 0)، کد معادل نخواهد بود.
اگر صرفاً یک int باشد، "%s" می‌تواند به "%s" ساده شود، چرا که 0 falsey است مقدار 0 در یک بافتار بولی نادرست (false) تلقی می‌شود. پیروی کورکورانه از این بررسی در پایگاه‌های کدی با نوع‌بندی ضعیف می‌تواند مشکلاتی ایجاد کند که اشکال‌زدایی آن‌ها دشوار است. اگر مقدار بتواند چیز دیگری باشد که falsey است اما int نیست (برای مثال None، یک رشتهٔ خالی، یا یک دنبالهٔ خالی)، کد معادل نخواهد بود.

نام دقیق این بازرس similarities است.

همچنین مستندات گزینه‌های بازرس شباهت‌ها را ببینید <#similarities-options>

خطوط مشابه در %s فایل نشان می‌دهد که مجموعه‌ای از خطوط مشابه میان چندین فایل شناسایی شده است. این مورد معمولاً بدین معناست که برای جلوگیری از این تکرار، کد باید بازنویسی و بازآرایی (refactor) شود.

هم‌پوشانی و تکرار (Duplication)

نام دقیق این بازرس spelling است.

همچنین مستندات گزینه‌های بازرس املا را ببینید <#spelling-options>

املای نادرست کلمه '%s' در یک کامنت: زمانی استفاده می‌شود که کلمه‌ای در کامنت به درستی نوشته نشده باشد.
املای نادرست کلمه '%s' در یک docstring: زمانی استفاده می‌شود که کلمه‌ای در docstring به درستی نوشته نشده باشد.
نویسه‌های نامعتبر %r در یک docstring زمانی استفاده می‌شود که یک کلمه در docstring نتواند توسط enchant بررسی شود.

نام دقیق این بازرس stdlib است.

%s از آرگومانی با نوع %s پشتیبانی نمی‌کند توابع دستکاری متغیرهای محیطی تنها از آرگومان‌های با نوع رشته (str) پشتیبانی می‌کنند. ببینید https://docs.python.org/3/library/os.html#os.getenv.
دکوراتور singledispatch نباید برای متدها استفاده شود، به جای آن از singledispatchmethod استفاده کنید. دکوراتور singledispatch باید توابع را تزیین کند نه متدهای کلاس یا نمونه را. برای این موارد از singledispatchmethod استفاده کنید.
دکوراتور singledispatchmethod نباید برای توابع استفاده شود، به جای آن از singledispatch استفاده کنید. دکوراتور singledispatchmethod باید متدهای کلاس یا نمونه را تزیین کند نه توابع را. برای این موارد از singledispatch استفاده کنید.
"%s" حالت معتبری برای open نیست. پایتون از حالت‌های r، w، a[, x] به همراه گزینه‌های b، + و U (تنها با r) پشتیبانی می‌کند. ببینید https://docs.python.org/3/library/functions.html#open
استفاده از datetime.time در بافتار بولی (boolean). استفاده از datetime.time در یک بافتار بولی می‌تواند زمانی که ساعت مشخص‌شده با نیمه‌شب UTC منطبق باشد، باگ‌های پنهانی ایجاد کند. این رفتار در Python 3.5 برطرف شد. برای اطلاعات بیشتر ببینید https://bugs.python.org/issue13936. هنگام استفاده از Python >= 3.5 این پیام صادر نمی‌شود.
استفاده زائد از %s با مقدار ثابت %r آرگومان نخست assertTrue و assertFalse یک شرط است. اگر یک مقدار ثابت به عنوان پارامتر ارسال شود، آن شرط همواره صادق خواهد بود. در این حالت باید یک هشدار صادر شود.
کلاس threading.Thread به تابع target نیاز دارد این هشدار زمانی صادر می‌شود که یک نمونه از کلاس threading.Thread بدون ارسال تابع هدف به عنوان یک kwarg یا به عنوان آرگومان دوم ایجاد شود. به‌طور پیش‌فرض، نخستین پارامتر، پارامتر group است نه پارامتر target.
استفاده از copy.copy(os.environ). به جای آن از os.environ.copy() استفاده کنید. شیء os.environ یک شیء dict نیست بلکه یک شیء پروکسی (proxy) است؛ بنابراین کپی سطحی (shallow copy) همچنان بر شیء اصلی اثر می‌گذارد. برای ارجاع ببینید https://bugs.python.org/issue15373.
نوع پیش‌فرض %s برابر با %s است. انتظار می‌رفت str یا None باشد. توابع دستکاری متغیرهای محیطی مقادیر None یا str بازمی‌گردانند. ارسال هر نوع متفاوتی به عنوان مقدار پیش‌فرض می‌تواند باعث ایجاد باگ شود. ببینید https://docs.python.org/3/library/os.html#os.getenv.
استفاده از کلمه کلیدی preexec_fn که ممکن است در حضور ریسه‌ها (threads) ناامن باشد استفاده از پارامتر preexec_fn در صورت حضور ریسه‌ها (threads) در برنامه شما ایمن نیست. فرآیند فرزند ممکن است پیش از فراخوانی exec دچار بن‌بست (deadlock) شود. اگر ناچار به استفاده از آن هستید، آن را بسیار ساده و سبک نگه دارید! تعداد کتابخانه‌هایی را که فراخوانی می‌کنید به حداقل برسانید. ببینید https://docs.python.org/3/library/subprocess.html#popen-constructor
استفاده از 'subprocess.run' بدون تعیین صریح مقدار برای 'check'. کلمه کلیدی check به‌طور پیش‌فرض روی False تنظیم شده است. این بدان معناست که فرآیند اجراشده توسط subprocess.run می‌تواند با یک کد خروج غیر صفر پایان یابد و در سکوت شکست بخورد. بهتر است آن را به‌طور صریح تنظیم کنید تا رفتار مدیریت خطا کاملاً مشخص باشد.
استفاده از open بدون تعیین صریح یک کدگذاری (encoding) بهتر است هنگام باز کردن اسناد، یک کدگذاری (encoding) را مشخص کنید. استفاده ضمنی از مقدار پیش‌فرض سیستم می‌تواند در سایر سیستم‌های عامل مشکلاتی ایجاد کند. ببینید https://peps.python.org/pep-0597 این پیام هنگام استفاده از Python >= 3.15 صادر نمی‌شود.
باقی گذاشتن توابع ایجادکننده نقاط توقف (breakpoints) در کد محیط عملیاتی (production) توصیه نمی‌شود فراخوانی‌های breakpoint()، sys.breakpointhook() و pdb.set_trace() باید از کدی که فعالانه در حال اشکال‌زدایی نیست حذف شوند.
دستور 'lru_cache(maxsize=None)' یا 'cache' تمام آرگومان‌های متد از جمله 'self' را تا ابد زنده نگه می‌دارد با تزیین یک متد توسط lru_cache یا cache، آرگومان 'self' به تابع پیوند می‌خورد و بنابراین هرگز توسط زباله‌روب (garbage collector) جمع‌آوری نمی‌شود. مگر اینکه نمونه شما هرگز نیازی به جمع‌آوری زباله نداشته باشد (تک‌نمونه یا singleton)، توصیه می‌شود برای جلوگیری از این الگو کد را بازآرایی کرده یا یک maxsize به حافظه موقت (cache) اضافه کنید. مقدار پیش‌فرض برای maxsize برابر با ۱۲۸ است.
استفاده از متد منسوخ‌شده %s() این متد به عنوان منسوخ‌شده (deprecated) نشانه‌گذاری شده است و در آینده حذف خواهد شد.
استفاده از آرگومان منسوخ‌شده %s در متد %s() این آرگومان به عنوان منسوخ‌شده (deprecated) نشانه‌گذاری شده است و در آینده حذف خواهد شد.
استفاده از کلاس منسوخ‌شده %s از ماژول %s این کلاس به عنوان منسوخ‌شده (deprecated) نشانه‌گذاری شده است و در آینده حذف خواهد شد.
استفاده از دکوراتور منسوخ‌شده %s() این دکوراتور به عنوان منسوخ‌شده (deprecated) نشانه‌گذاری شده است و در آینده حذف خواهد شد.
استفاده از ویژگی (attribute) منسوخ‌شده %r این ویژگی به عنوان منسوخ‌شده (deprecated) نشانه‌گذاری شده است و در آینده حذف خواهد شد.

نام دقیق این بازبین string است.

همچنین مستندات گزینه‌های بازبین رشته را ببینید: <#string-options>

نویسه قالب‌بندی پشتیبانی‌نشده %r (%#02x) در اندیس %d زمانی استفاده می‌شود که یک نویسه قالب‌بندی پشتیبانی‌نشده در یک رشته قالب‌بندی به کار رفته باشد.
رشته قالب‌بندی در میانه مشخص‌کننده تبدیل پایان می‌یابد زمانی استفاده می‌شود که یک رشته قالب‌بندی پیش از پایان یک مشخص‌کننده تبدیل خاتمه یابد.
ترکیب مشخص‌کننده‌های تبدیل نام‌دار و بی‌نام در رشته قالب‌بندی زمانی استفاده می‌شود که یک رشته قالب‌بندی شامل هر دو نوع مشخص‌کننده تبدیل نام‌دار (مانند '%(foo)d') و بی‌نام (مانند '%d') باشد. این پیام همچنین زمانی استفاده می‌شود که یک مشخص‌کننده تبدیل نام‌دار حاوی * برای حداقل عرض فیلد و/یا دقت باشد.
برای رشته قالب‌بندی نگاشت انتظار می‌رفت، نه %s زمانی استفاده می‌شود که یک رشته قالب‌بندی که از مشخص‌کننده‌های تبدیل نام‌دار استفاده می‌کند با آرگومانی به کار رود که یک نگاشت نیست.
کلید %r در دیکشنری رشته قالب‌بندی وجود ندارد زمانی استفاده می‌شود که یک رشته قالب‌بندی که از مشخص‌کننده‌های تبدیل نام‌دار استفاده می‌کند با دیکشنری‌ای به کار رود که شامل تمام کلیدهای مورد نیاز رشته قالب‌بندی نیست.
آرگومان‌های بیش از حد برای رشته قالب‌بندی زمانی استفاده می‌شود که به یک رشته قالب‌بندی که از مشخص‌کننده‌های تبدیل بی‌نام استفاده می‌کند، بیش از حد آرگومان داده شود.
آرگومان‌های ناکافی برای رشته قالب‌بندی زمانی استفاده می‌شود که به یک رشته قالب‌بندی که از مشخص‌کننده‌های تبدیل بی‌نام استفاده می‌کند، آرگومان‌های بسیار کمی داده شود.
آرگومان %r با نوع قالب %r همخوانی ندارد زمانی استفاده می‌شود که نوع مورد نیاز رشته قالب‌بندی برای نوع واقعی آرگومان مناسب نباشد.
آرگومان مشکوک در فراخوانی %s.%s آرگومان ارسال‌شده به فراخوانی str.{l,r,}strip حاوی یک نویسه تکراری است،
کلید دیکشنری رشته قالب‌بندی باید یک رشته باشد، نه %s زمانی استفاده می‌شود که یک رشته قالب‌بندی که از مشخص‌کننده‌های تبدیل نام‌دار استفاده می‌کند با دیکشنری‌ای به کار رود که تمام کلیدهای آن رشته نیستند.
کلید استفاده‌نشده %r در دیکشنری رشته قالب‌بندی زمانی استفاده می‌شود که یک رشته قالب‌بندی که از مشخص‌کننده‌های تبدیل نام‌دار استفاده می‌کند با دیکشنری‌ای به کار رود که شامل کلیدهایی است که مورد نیاز رشته قالب‌بندی نیستند.
رشته قالب‌بندی نامعتبر زمانی استفاده می‌شود که یک رشته قالب‌بندی PEP 3101 نامعتبر باشد.
آرگومان کلیدواژه‌ای %r برای رشته قالب‌بندی یافت نشد زمانی استفاده می‌شود که یک رشته قالب‌بندی PEP 3101 که از فیلدهای نام‌دار استفاده می‌کند، یک یا چند کلیدواژه الزامی را دریافت نکند.
آرگومان قالب‌بندی استفاده‌نشده %r زمانی استفاده می‌شود که یک رشته قالب‌بندی PEP 3101 که از فیلدهای نام‌دار استفاده می‌کند با آرگومانی به کار رود که مورد نیاز رشته قالب‌بندی نیست.
رشته قالب‌بندی شامل هر دو نوع شماره‌گذاری خودکار فیلد و تعیین دستی فیلد است زمانی استفاده می‌شود که یک رشته قالب‌بندی PEP 3101 شامل هر دو نوع شماره‌گذاری خودکار فیلد (مانند '{}') و تعیین دستی فیلد (مانند '{0}') باشد.
صفت قالب‌بندی %r در مشخص‌کننده قالب %r وجود ندارد زمانی استفاده می‌شود که یک رشته قالب‌بندی PEP 3101 از مشخص‌کننده صفت ({0.length}) استفاده کند، اما آرگومان ارسال‌شده برای قالب‌بندی فاقد آن صفت باشد.
استفاده از کلید جستجوی نامعتبر %r در مشخص‌کننده قالب %r زمانی استفاده می‌شود که یک رشته قالب‌بندی PEP 3101 از مشخص‌کننده جستجو ({a[1]}) استفاده کند، اما آرگومان ارسال‌شده برای قالب‌بندی فاقد آن کلید بوده یا آن را به عنوان یک صفت نداشته باشد.
آرگومان قالب‌بندی رشته تکراری %r، ارسال به عنوان آرگومان نام‌دار را مد نظر قرار دهید زمانی استفاده می‌شود که تشخیص دهیم قالب‌بندی رشته به جای استفاده از آرگومان‌های رشته‌ای نام‌دار، در حال تکرار یک آرگومان است.
استفاده از f-string که هیچ متغیر درون‌یابی‌شده‌ای ندارد زمانی استفاده می‌شود که یک f-string شناسایی شود که از هیچ متغیر درون‌یابی استفاده نمی‌کند، که در این حالت می‌تواند یا یک رشته معمولی باشد یا یک باگ در کد.
استفاده از قالب‌بندی برای رشته‌ای که هیچ متغیر درون‌یابی‌شده‌ای ندارد زمانی استفاده می‌شود که رشته‌ای شناسایی شود که فاقد هرگونه متغیر درون‌یابی است، که در این حالت می‌تواند یا یک رشته معمولی بدون قالب‌بندی باشد یا یک باگ در کد.
بک‌اسلش غیرعادی در رشته: '%s'. ممکن است پیشوند r برای این ثابت رشته‌ای جا افتاده باشد. زمانی استفاده می‌شود که یک بک‌اسلش در یک رشته لفظی قرار دارد اما به عنوان نویسه گریز به کار نرفته است.
گریز یونیکد غیرعادی در رشته بایتی: '%s'. ممکن است پیشوند r یا u برای این ثابت رشته‌ای جا افتاده باشد. زمانی استفاده می‌شود که با گریزی مانند u در یک رشته بایتی مواجه شویم در حالی که در آنجا هیچ تأثیری ندارد.
الحاق ضمنی رشته در %s مشاهده شد رشته‌های لفظی در تعریف یک شیء تکرارپذیر لفظی به صورت ضمنی الحاق شده‌اند : شاید یک کاما جا افتاده باشد؟
جداکننده نقل‌قول %s با بقیه فایل ناسازگار است جداکننده‌های نقل‌قول در سرتاسر یک ماژول به صورت یکنواخت استفاده نشده‌اند (با در نظر گرفتن استثناهایی جهت پرهیز از نویسه‌های گریز غیرضروری).
پیشوند u برای رشته‌ها در Python >=3.0 دیگر ضروری نیست زمانی استفاده می‌شود که رشته‌ای با پیشوند u شناسایی شود. این پیشوندها در Python 2 برای مشخص کردن این که یک رشته یونیکد است لازم بودند، اما از Python 3.0 رشته‌ها به صورت پیش‌فرض یونیکد هستند.

نام دقیق این بررسی‌کننده threading است.

ایجاد مستقیم '%s()' در 'with' هیچ تأثیری ندارد هنگامی استفاده می‌شود که یک نمونه قفل جدید با استفاده از دستور with ایجاد شود که هیچ تأثیری ندارد. در عوض، باید از یک نمونه موجود برای گرفتن قفل استفاده شود.

نام دقیق این بررسی‌کننده typecheck است.

همچنین مستندات گزینه‌های بررسی‌کننده typecheck را ببینید <#typecheck-options>

%s %r دارای عضو %r نیست%s هنگامی استفاده می‌شود که به عضوی ناموجود از یک متغیر دسترسی پیدا شود.
%s قابل فراخوانی نیست هنگامی استفاده می‌شود که شیء فراخوانی‌شده، به‌عنوان شیئی غیرقابل‌فراخوانی استنتاج شده باشد.
انتساب نتیجه فراخوانی تابعی که هیچ بازگشتی ندارد هنگامی استفاده می‌شود که انتسابی بر روی فراخوانی یک تابع انجام شود اما تابع استنتاج‌شده هیچ چیزی بازنگرداند.
مقداری برای آرگومان %s در فراخوانی %s داده نشده است هنگامی استفاده می‌شود که یک فراخوانی تابع، آرگومان‌های کمتری از حد لازم ارسال کند.
تعداد بیش از حد آرگومان‌های موضعی برای فراخوانی %s هنگامی استفاده می‌شود که یک فراخوانی تابع، بیش از حد آرگومان موضعی ارسال کند.
آرگومان کلیدواژه‌ای غیرمنتظره %r در فراخوانی %s هنگامی استفاده می‌شود که در فراخوانی یک تابع، آرگومان کلیدواژه‌ای ارسال شود که با هیچ‌یک از نام‌های پارامترهای تابع مطابقت ندارد.
آرگومان %r در فراخوانی %s هم با موقعیت و هم با کلیدواژه ارسال شده است هنگامی استفاده می‌شود که فراخوانی یک تابع منجر به انتساب چندین مقدار به یک پارامتر تابع شود؛ یک مقدار از طریق آرگومان موضعی و مقدار دیگر از طریق آرگومان کلیدواژه‌ای.
آرگومان کلیدواژه‌ای اجباری %r در فراخوانی %s وجود ندارد هنگامی استفاده می‌شود که یک فراخوانی تابع، یک آرگومان الزامیِ صرفاً کلیدواژه‌ای را ارسال نکند.
اندیس توالی از نوع int،‏ slice یا نمونه‌ای دارای __index__ نیست هنگامی استفاده می‌شود که یک نوع توالی با نوعی نامعتبر اندیس‌گذاری شود. انواع معتبر عبارتند از intها، sliceها و اشیایی با متد __index__.
اندیس برش از نوع int،‏ None یا نمونه‌ای دارای __index__ نیست هنگامی استفاده می‌شود که اندیس برش یک عدد صحیح، None یا شیئی با متد __index__ نباشد.
انتساب نتیجه فراخوانی یک تابع، در حالی که تابع None بازمی‌گرداند هنگامی استفاده می‌شود که انتسابی بر روی فراخوانی یک تابع انجام شود اما تابع استنتاج‌شده چیزی جز None بازنگرداند.
مدیر بافت '%s' متدهای __enter__ و __exit__ را پیاده‌سازی نکرده است. هنگامی استفاده می‌شود که یک نمونه در دستور with، پروتکل مدیر بافت (__enter__/__exit__) را پیاده‌سازی نکرده باشد.
هنگامی صادر می‌شود که یک عملوند یگانی روی شیئی استفاده شود که از این نوع عملیات پشتیبانی نمی‌کند.
هنگامی صادر می‌شود که یک عملیات حسابی دودویی بین دو عملوند پشتیبانی نشود.
چندین مقدار برای آرگومان کلیدواژه‌ای %r در فراخوانی تابع دریافت شد هنگامی صادر می‌شود که یک فراخوانی تابع چندین مقدار برای یک کلیدواژه دریافت کند.
مقدار غیرقابل‌پیمایش %s در یک بافت پیمایشی استفاده شده است هنگامی استفاده می‌شود که یک مقدار غیرقابل‌پیمایش در جایی که انتظار شیء قابل‌پیمایش می‌رود به کار رود.
مقدار غیرنگاشتی %s در یک بافت نگاشتی استفاده شده است هنگامی استفاده می‌شود که یک مقدار غیرنگاشتی در جایی که انتظار یک نگاشت می‌رود به کار رود.
مقدار '%s' از آزمون عضویت پشتیبانی نمی‌کند هنگامی صادر می‌شود که یک نمونه در عبارت آزمون عضویت، پروتکل عضویت (__contains__/__iter__/__getitem__) را پیاده‌سازی نکرده باشد.
مقدار '%s' اندیس‌پذیر نیست هنگامی صادر می‌شود که یک مقدار اندیس‌گذاری‌شده از اندیس‌پذیری پشتیبانی نکند (یعنی متد __getitem__ یا برای یک کلاس متد __class_getitem__ را تعریف نکرده باشد).
%r از انتساب آیتم پشتیبانی نمی‌کند هنگامی صادر می‌شود که یک شیء از انتساب آیتم پشتیبانی نکند (یعنی متد __setitem__ را تعریف نکرده باشد).
%r از حذف آیتم پشتیبانی نمی‌کند هنگامی صادر می‌شود که یک شیء از حذف آیتم پشتیبانی نکند (یعنی متد __delitem__ را تعریف نکرده باشد).
متاکلاس نامعتبر %r استفاده شده است هنگامی صادر می‌شود که بتوان تشخیص داد یک کلاس چیزی را به عنوان متاکلاس استفاده می‌کند که برای استفاده به عنوان متاکلاس نامعتبر است.
باز کردن دیکشنری در پیمایش بدون فراخوانی .items() هنگامی صادر می‌شود که تلاشی برای پیمایش یک dict بدون فراخوانی .items() صورت گیرد.
'await' باید درون یک تابع async استفاده شود هنگامی صادر می‌شود که await خارج از یک تابع async استفاده شود.
'%s' هش‌ناپذیر است و نمی‌تواند به‌عنوان یک %s در یک %s استفاده شود هنگامی صادر می‌شود که یک کلید dict یا عضو set هش‌پذیر نباشد (یعنی متد __hash__ را تعریف نکرده باشد).
گام برش نمی‌تواند ۰ باشد هنگامی استفاده می‌شود که گام یک برش ۰ باشد و شیء متد سفارشی __getitem__ را پیاده‌سازی نکرده باشد.
مدیر بافت '%s' ناهمگام است و باید با 'async with' استفاده شود. هنگامی استفاده می‌شود که یک مدیر بافت ناهمگام به جای 'async with' با دستور معمولی 'with' استفاده شود.
آرگومان کلیدواژه‌ای قبل از فهرست آرگومان‌های موضعی متغیر در تعریف تابع %s هنگام تعریف یک آرگومان کلیدواژه‌ای قبل از آرگومان‌های موضعی متغیر، در صورتی که متد با آرگومان‌های کلیدواژه‌ای فراخوانی شود، ممکن است چندین مقدار برای پارامتر مذکور ارسال گردد.
به نظر می‌رسد ترتیب آرگومان‌های موضعی نامرتب است هنگامی صادر می‌شود که نام‌های آرگومان‌های فراخواننده کاملاً با نام‌های پارامترها در امضای تابع مطابقت داشته باشند اما ترتیب یکسانی نداشته باشند.
مقدار غیررشته‌ای به __name__ انتساب داده شده است هنگامی صادر می‌شود که یک مقدار غیررشته‌ای به __name__ انتساب یابد.
آرگومان دوم isinstance یک نوع نیست هنگامی صادر می‌شود که آرگومان دوم در فراخوانی isinstance یک نوع (type) نباشد.
%r در %r گنجانده خواهد شد زیرا پارامتری صرفاً موضعی با این نام از قبل وجود دارد هنگامی صادر می‌شود که تابعی با یک آرگومان کلیدواژه‌ای فراخوانی شود که همنام با یک پارامتر صرفاً موضعی است و تابع دارای یک دیکشنری از پارامترهای متغیر کلیدواژه‌ای باشد.
%s %r دارای عضو %r نیست%s، اما کد منبع در دسترس نیست. اگر می‌خواهید تحلیل بر اساس درون‌نگری اشیاء زنده در زمان اجرا انجام شود، افزودن این ماژول به extension-pkg-allow-list را در نظر بگیرید. هنگامی استفاده می‌شود که به عضوی ناموجود از یک افزونه C دسترسی پیدا شود. به دلیل در دسترس نبودن کد منبع، تحلیل ایستا غیرممکن است، اما می‌تواند با درون‌نگری اشیاء زنده در زمان اجرا انجام شود.

نام دقیق این بررسی‌کننده unicode_checker است.

کدک‌های UTF-16 و UTF-32 سازگاری عقبروی ندارند. در عوض از UTF-8 استفاده کنید برای سازگاری، به‌جای UTF-16/UTF-32 از UTF-8 استفاده کنید. همچنین برای تاریخچهٔ این موضوع به https://bugs.python.org/issue1503789 مراجعه کنید، و برای برخی از مشکلات احتمالی هنگام استفاده از UTF-16 به عنوان مثال، به https://softwareengineering.stackexchange.com/questions/102205 نگاه کنید.
شامل نویسه‌های کنترلی است که می‌توانند اجازه دهند کد مبهم، متفاوت از آنچه نمایش داده می‌شود اجرا شود نویسه‌های یونی‌کد دوجهته (bidirectional unicode) معمولاً نویسه‌های نمایش‌داده‌نشده‌ای هستند که برای نمایش درست خطوط راست‌به‌چپ (RTL) (یعنی چینی، ژاپنی، عربی، عبری و...) لازم‌اند. بنابراین آیا می‌توانید به این کد اعتماد کنید؟ آیا مطمئن هستید که در تمام ویرایشگرها به درستی نمایش داده می‌شود؟ اگر شما آن را ننوشته‌اید یا زبان شما RTL نیست، این نویسه‌های خاص را حذف کنید؛ زیرا می‌توانند برای فریب دادن شما جهت اجرای کدی به کار روند که کاری متفاوت از ظاهرش انجام می‌دهد. اطلاعات بیشتر: https://en.wikipedia.org/wiki/Bidirectional_text https://trojansource.codes
نویسهٔ backspace نامعتبر و بدون گریز، در عوض از "b" استفاده کنید. مکان‌نما را به عقب بازمی‌گرداند، بنابراین نویسهٔ پس از آن، روی نویسهٔ قبلی بازنویسی می‌شود.
نویسهٔ carriage-return نامعتبر و بدون گریز، در عوض از "r" استفاده کنید. مکان‌نما را به ابتدای خط می‌برد؛ نویسه‌های بعدی ابتدای خط را بازنویسی می‌کنند.
نویسهٔ sub نامعتبر و بدون گریز، در عوض از "x1A" استفاده کنید. کلید Ctrl+Z یا "End of text" در Windows. برخی برنامه‌ها (مانند type) باقی‌ماندهٔ فایل پس از آن را نادیده می‌گیرند.
نویسهٔ esc نامعتبر و بدون گریز، در عوض از "x1B" استفاده کنید. معمولاً کدهای گریز (escape codes) را آغاز می‌کند که امکان کنترل دلخواه ترمینال را فراهم می‌سازند.
نویسهٔ nul نامعتبر و بدون گریز، در عوض از "0" استفاده کنید. غالباً در python به معنای پایان ورودی است.
نویسهٔ zero-width-space نامعتبر و بدون گریز، در عوض از "u200B" استفاده کنید. نویسهٔ فاصلهٔ نامرئی می‌تواند اجرای واقعی کد را پنهان کند.
PEP8 کدگذاری UTF-8 را برای فایل‌های Python توصیه می‌کند استاندارد PEP8 کدگذاری پیش‌فرض UTF-8 را برای فایل‌های Python توصیه می‌کند. ببینید: https://peps.python.org/pep-0008/#source-file-encoding

نام دقیق این بررسی‌کننده unnecessary-dunder-call است.

فراخوانی غیرضروری متد داندر (dunder) %s. %s. زمانی استفاده می‌شود که یک متد dunder به‌جای استفاده از تابع/متد/عملگر متناظر، به صورت دستی فراخوانی شود.

نام دقیق این بررسی‌کننده unnecessary_ellipsis است.

ثابت سه نقطه (ellipsis) غیرضروری زمانی استفاده می‌شود که با ثابت ellipsis مواجه شده و امکان اجتناب از آن وجود دارد. یک خط کد متشکل از یک ellipsis غیرضروری است اگر یک docstring در خط قبلی وجود داشته باشد یا دستوری در همان حوزه (scope) موجود باشد.

نام دقیق این بازبین unsupported_version است.

رشته‌های f-string توسط همه نسخه‌های موجود در تنظیم py-version پشتیبانی نمی‌شوند زمانی استفاده می‌شود که py-version تعیین‌شده توسط کاربر کمتر از 3.6 باشد و pylint با یک f-string مواجه شود.
قابلیت typing.final توسط همه نسخه‌های موجود در تنظیم py-version پشتیبانی نمی‌شود زمانی استفاده می‌شود که py-version تعیین‌شده توسط کاربر کمتر از 3.8 باشد و pylint با دکوراتور typing.final مواجه شود.
گروه‌های استثنا (Exception groups) توسط همه نسخه‌های موجود در تنظیم py-version پشتیبانی نمی‌شوند زمانی استفاده می‌شود که py-version تعیین‌شده توسط کاربر کمتر از 3.11 باشد و pylint با except* یا ExceptionGroup` مواجه شود.
نحو نوع عمومی (Generic type syntax براساس PEP 695) توسط همه نسخه‌های موجود در تنظیم py-version پشتیبانی نمی‌شود زمانی استفاده می‌شود که py-version تعیین‌شده توسط کاربر کمتر از 3.12 باشد و pylint با نحو نوع عمومی مواجه شود.
عبارت انتساب (Assignment expression) توسط همه نسخه‌های موجود در تنظیم py-version پشتیبانی نمی‌شود زمانی استفاده می‌شود که py-version تعیین‌شده توسط کاربر کمتر از 3.8 باشد و pylint با عملگر عبارت انتساب (walrus) مواجه شود.
آرگومان‌های فقط‌موقعیتی (Positional-only) توسط همه نسخه‌های موجود در تنظیم py-version پشتیبانی نمی‌شوند زمانی استفاده می‌شود که py-version تعیین‌شده توسط کاربر کمتر از 3.8 باشد و pylint با آرگومان‌های فقط‌موقعیتی مواجه شود.

نام دقیق این بازبین variables است.

همچنین مستندات گزینه‌های بازبین variables را ببینید <#variables-options>

استفاده از متغیر %r پیش از مقداردهی زمانی صادر می‌شود که به یک متغیر محلی پیش از مقداردهی آن دسترسی پیدا شود. فرض می‌شود که مقداردهی‌ها در بلوک‌های try هنگام ارزیابی بلوک‌های مرتبط except/finally رخ نداده‌اند. همچنین فرض می‌شود مقداردهی‌ها در بلوک‌های except هنگام ارزیابی دستورات خارج از بلوک رخ نداده‌اند، مگر زمانی که بلوک try مرتبط حاوی دستور return باشد.
متغیر تعریف‌نشده %r زمانی استفاده می‌شود که به یک متغیر تعریف‌نشده دسترسی پیدا شود.
نام متغیر تعریف‌نشده %r در __all__ زمانی استفاده می‌شود که در __all__ به نام یک متغیر تعریف‌نشده ارجاع داده شود.
شیء نامعتبر %r در __all__، باید تنها شامل رشته‌ها باشد زمانی استفاده می‌شود که یک شیء نامعتبر (غیررشته‌ای) در __all__ قرار گیرد.
قالب نامعتبر برای __all__، باید چندتایی (tuple) یا لیست باشد زمانی استفاده می‌شود که __all__ قالب نامعتبری داشته باشد.
احتمال استفاده از متغیر %r پیش از مقداردهی زمانی صادر می‌شود که به یک متغیر محلی پیش از مقداردهی آن در هر دو شاخه یک ساختار شرطی if/else دسترسی پیدا شود.
نام %r در ماژول %r وجود ندارد زمانی استفاده می‌شود که نامی در یک ماژول پیدا نشود.
تلاش برای بازکردن (unpack) یک شیء غیردنباله‌ای%s زمانی استفاده می‌شود که چیزی که یک توالی (sequence) نیست در یک انتساب بازکردن استفاده شود.
اندیس نامعتبر برای طول شیء تکرارپذیر زمانی صادر می‌شود که یک اندیسِ استفاده‌شده روی یک شیء تکرارپذیر (iterable)، فراتر از طول آن شیء برود.
متغیر سراسری %r در سطح ماژول تعریف نشده است زمانی استفاده می‌شود که متغیری از طریق دستور "global" مشخص شود اما آن متغیر در حوزه (scope) ماژول تعریف نشده باشد.
استفاده از global برای %r اما هیچ مقداردهی انجام نشده است هنگامی که متغیری در حوزه سراسری تعریف شده و در حوزه‌ای درونی تغییر داده می‌شود، کلیدواژه 'global' در حوزه درونی تنها در صورتی لازم است که یک عملیات مقداردهی در آن حوزه درونی انجام شود.
استفاده از دستور global زمانی استفاده می‌شود که از دستور "global" برای به‌روزرسانی یک متغیر سراسری استفاده کنید. Pylint استفاده از آن را توصیه نمی‌کند؛ این به این معنی نیست که نمی‌توانید از آن استفاده کنید!
استفاده از دستور global در سطح ماژول زمانی استفاده می‌شود که از دستور "global" در سطح ماژول استفاده کنید، چرا که هیچ تأثیری ندارد.
مورد استفاده‌نشده %s زمانی استفاده می‌شود که یک ماژول یا متغیر واردشده (imported) مورد استفاده قرار نگیرد.
متغیر استفاده‌نشده %r زمانی استفاده می‌شود که یک متغیر تعریف شده باشد اما استفاده نشود.
آرگومان استفاده‌نشده %r زمانی استفاده می‌شود که آرگومان یک تابع یا متد مورد استفاده قرار نگیرد.
مورد(های) واردشده استفاده‌نشده %s از واردسازی عمومی (wildcard) متعلق به %s زمانی استفاده می‌شود که یک ماژول یا متغیر واردشده از طریق شیوه واردسازی 'from X import *' مورد استفاده قرار نگیرد.
تعریف مجدد نام %r از حوزه بیرونی (خط %s) زمانی استفاده می‌شود که نام یک متغیر، نام تعریف‌شده در یک حوزه بیرونی یا گرداننده except را بپوشاند.
تعریف مجدد شناسه توکار %r زمانی استفاده می‌شود که یک متغیر یا تابع، یک شناسه توکار (built-in) را بازنویسی کند.
استفاده از متغیر حلقه احتمالاً تعریف‌نشده %r زمانی استفاده می‌شود که یک متغیر حلقه (یعنی متغیری که توسط حلقه for، تعریف فشرده لیست یا عبارت مولد تعریف شده) در خارج از حلقه استفاده شود.
احتمال بازکردن نامتوازن چندتایی با دنباله %s: سمت چپ دارای %d برچسب%s و سمت راست دارای %d مقدار%s است زمانی استفاده می‌شود که در انتساب، بازکردن نامتوازن چندتایی (tuple) رخ دهد.
متغیر سلولی %s در حلقه تعریف شده است متغیری که در یک بستار (closure) استفاده شده، در یک حلقه تعریف شده است. این امر باعث می‌شود که تمام بستارها از مقدار یکسانی برای متغیر محصورشده استفاده کنند.
متغیر احتمالاً استفاده‌نشده %r زمانی استفاده می‌شود که متغیری تعریف شده باشد اما ممکن است استفاده نشود. این احتمال از این واقعیت ناشی می‌شود که تابع locals() ممکن است استفاده شده باشد، که می‌تواند متغیر مذکور را مصرف کند یا نکند.
مقداردهی نامعتبر به %s در متد مقداردهی نامعتبر به self یا cls به ترتیب در متد نمونه یا کلاسی.
احتمال بازکردن نامتوازن دیکشنری با %s: سمت چپ دارای %d برچسب%s و سمت راست دارای %d مقدار%s است زمانی استفاده می‌شود که در انتساب یا در حلقه for، بازکردن نامتوازن دیکشنری رخ دهد.

ابزار Pylint افزونه‌های اختیاری زیر را ارائه می‌دهد:

  • بررسی‌کننده Deprecated Builtins
  • بررسی‌کننده Broad Try Clause
  • بررسی‌کننده Else If Used
  • بررسی‌کننده Code Style
  • بررسی‌کننده Comparison-Placement
  • بررسی‌کننده Confusing Elif
  • بررسی‌کننده Consider Refactoring Into While
  • بررسی‌کننده Consider Ternary Expression
  • بررسی‌کننده Dict-Init-Mutate
  • بررسی‌کننده Parameter Documentation
  • بررسی‌کننده Docstyle
  • بررسی‌کننده Dunder
  • بررسی‌کننده Empty-Comment
  • بررسی‌کننده Eq-Without-Hash
  • بررسی‌کننده Consider-Using-Any-Or-All
  • بررسی‌کننده Magic-Value
  • بررسی‌کننده Design
  • بررسی‌کننده No Self Use
  • بررسی‌کننده Overlap-Except
  • بررسی‌کننده Import-Private-Name
  • بررسی‌کننده Redefined-Loop-Name
  • بررسی‌کننده Multiple Types
  • بررسی‌کننده Set Membership
  • بررسی‌کننده Typing
  • بررسی‌کننده While Used

شما می‌توانید هر یک یا تمام این افزونه‌ها را با افزودن یک خط load-plugins به بخش MAIN در فایل .pylintrc خود فعال کنید، برای مثال:

load-plugins=pylint.extensions.docparams,pylint.extensions.docstyle

این بررسی‌کننده توسط pylint.extensions.broad_try_clause ارائه می‌شود. نام دقیق این بررسی‌کننده broad_try_clause است.

همچنین مستندات گزینه‌های بررسی‌کننده broad_try_clause را ببینید <#broad-try-clause-options>

بند try شامل دستورهای بسیار زیادی است.

این بررسی‌کننده توسط pylint.extensions.code_style ارائه می‌شود. نام دقیق این بررسی‌کننده code_style است..SS مستندات بررسی‌کننده Code Style

بررسی‌کننده‌هایی که می‌توانند یکدستی کد را بهبود ببخشند. به همین دلیل، آن‌ها لزوماً بهبودی در عملکرد ایجاد نمی‌کنند و اغلب اوقات سلیقه‌ای هستند.

همچنین مستندات گزینه‌های بررسی‌کننده code_style را در <#code-style-options> ببینید.

استفاده از namedtuple یا dataclass را برای مقادیر دیکشنری در نظر بگیرید هنگامی صادر می‌شود که مقادیر دیکشنری بتوانند با نمونه‌های namedtuple یا dataclass جایگزین شوند.
استفاده از یک tuple درجا به‌جای list را در نظر بگیرید صرفاً برای یکدستی شیوه‌نگارش! هنگامی صادر می‌شود که یک list تعریف‌شده به‌صورت درجا بتواند با یک tuple جایگزین شود. به دلیل بهینه‌سازی‌های CPython، این کار هیچ مزیت عملکردی ندارد.
به‌جای آن از '%s' استفاده کنید هنگامی صادر می‌شود که یک انتساب if بلافاصله توسط یک دستور if دنبال شود و هر دو بتوانند با استفاده از عبارت انتساب := ترکیب شوند. نیازمند Python 3.8 و py-version >= 3.8 است.
از '%s' برای انجام مستقیم انتساب افزوده استفاده کنید هنگامی صادر می‌شود که یک انتساب به همان شیئی ارجاع دهد که در حال تخصیص به آن است. این مورد می‌تواند به یک انتساب افزوده تغییر یابد. به‌طور پیش‌فرض غیرفعال است!
'typing.NamedTuple' را به 'collections.namedtuple' ترجیح دهید 'typing.NamedTuple' از کلیدواژه شناخته‌شده 'class' به همراه type-hintها برای خوانایی بهتر استفاده می‌کند (همچنین سریع‌تر است زیرا از یک فراخوانی درونی exec جلوگیری می‌کند). به‌طور پیش‌فرض غیرفعال است!
استفاده از %smath.%s را به‌جای %s در نظر بگیرید استفاده از math.inf یا math.nan امکان بهره‌مندی از تعیین نوع (typing) را فراهم می‌کند و تا ۴ برابر سریع‌تر از فراخوانی float است (پس از درون‌ریزی اولیه math). این بررسی همچنین خطاهای نگارشی در فراخوانی‌های float را به‌عنوان یک اثر جانبی شناسایی می‌کند.

این بررسی‌کننده توسط pylint.extensions.comparison_placement ارائه می‌شود. نام دقیق بررسی‌کننده comparison-placement است.

مقایسه باید به صورت %s باشد هنگامی استفاده می‌شود که مقدار ثابت در سمت چپ یک مقایسه قرار گیرد. معمولاً از نظر بیان منظور، قرار دادن آن در سمت راست مقایسه واضح‌تر است.

این بررسی‌کننده توسط pylint.extensions.confusing_elif ارائه می‌شود. نام دقیق بررسی‌کننده confusing_elif است.

elifهای متوالی با سطح تورفتگی متفاوت؛ ایجاد یک تابع را برای جداسازی elif داخلی در نظر بگیرید هنگامی استفاده می‌شود که یک دستور elif بلافاصله پس از یک بلوک دارای تورفتگی بیاید که خودش با if یا elif پایان یافته است. ممکن است مشخص نباشد که تورفتگی دستور elif از روی قصد برداشته شده یا به اشتباه. استخراج دستور if دارای تورفتگی در یک تابع مجزا می‌تواند از سردرگمی جلوگیری کرده و مانع بروز خطا شود.

این بررسی‌کننده توسط pylint.extensions.for_any_all ارائه می‌شود. نام دقیق بررسی‌کننده consider-using-any-or-all است.

حلقه `for` می‌تواند `%s` باشد یک حلقه for که شرطی را بررسی می‌کند و مقدار bool برمی‌گرداند، می‌تواند با any یا all جایگزین شود.

این بررسی‌کننده توسط pylint.extensions.consider_refactoring_into_while_condition ارائه می‌شود. نام دقیق بررسی‌کننده consider_refactoring_into_while است.

استفاده از 'while %s' به جای 'while %s:'، یک 'if' و یک 'break' را مد نظر قرار دهید هنگامی صادر می‌شود که حلقهٔ while True: استفاده شده باشد و اولین دستور آن یک شرط break باشد. اگر بررسی معکوس شده و به دستور while منتقل شود، ساختار if / break را می‌توان حذف کرد.

این بررسی‌کننده توسط pylint.extensions.consider_ternary_expression ارائه می‌شود. نام دقیق بررسی‌کننده consider_ternary_expression است.

بازنویسی به عنوان یک عبارت سه‌تایی را مد نظر قرار دهید دستورهای انتساب متعددی که در بلوک‌های if/else پراکنده شده‌اند را می‌توان با یک انتساب واحد و عبارت سه‌تایی بازنویسی کرد.

این بررسی‌کننده توسط pylint.extensions.bad_builtin ارائه می‌شود. نام دقیق بررسی‌کننده deprecated_builtins است.

این بخش پیش‌تر بررسی‌کنندهٔ اصلی bad-builtin بود، اما به جای آن به یک افزونه منتقل شد. از آن می‌توان برای یافتن توابع توکارِ ممنوع‌شده، مانند map یا filter که جایگزین‌های دیگری برای آن‌ها وجود دارد، استفاده کرد.

اگر می‌خواهید کنترل کنید که این بررسی‌کننده در مورد کدام توابع توکار باید هشدار دهد، می‌توانید از گزینهٔ bad-functions استفاده کنید:

$ pylint a.py --load-plugins=pylint.extensions.bad_builtin --bad-functions=apply,reduce
...

همچنین مستندات گزینه‌های بررسی‌کنندهٔ deprecated_builtins را ببینید <#deprecated-builtins-options>

از تابع توکار %s استفاده شده است هنگامی به کار می‌رود که یک تابع توکار غیرمجاز استفاده شود (گزینهٔ bad-function را ببینید). توابع غیرمجاز معمول مواردی مانند map یا filter هستند که امروزه پایتون جایگزین‌های تمیزتری مانند فهم لیست (list comprehension) را برای آن‌ها ارائه می‌دهد.

این بررسی‌کننده توسط pylint.extensions.mccabe ارائه می‌شود. نام دقیق بررسی‌کننده design است.

اکنون می‌توانید از این افزونه برای یافتن مشکلات پیچیدگی در پایگاه کد خود استفاده کنید.

آن را از طریق pylint --load-plugins=pylint.extensions.mccabe فعال کنید. این کار هشدار جدیدی به نام too-complex معرفی می‌کند که وقتی پیچیدگی یک بلوک کد بالاتر از یک مقدار از پیش تعیین‌شده باشد صادر می‌شود؛ این مقدار را می‌توان از طریق گزینهٔ max-complexity کنترل کرد، مانند این مثال:

$ cat a.py
def f10():
    """McCabe rating: 11"""
    myint = 2
    if myint == 5:
        return myint
    elif myint == 6:
        return myint
    elif myint == 7:
        return myint
    elif myint == 8:
        return myint
    elif myint == 9:
        return myint
    elif myint == 10:
        if myint == 8:
            while True:
                return True
        elif myint == 8:
            with myint:
                return 8
    else:
        if myint == 2:
            return myint
        return myint
    return myint
$ pylint a.py --load-plugins=pylint.extensions.mccabe
R:1: 'f10' is too complex. The McCabe rating is 11 (too-complex)
$ pylint a.py --load-plugins=pylint.extensions.mccabe --max-complexity=50
$

همچنین مستندات گزینه‌های بررسی‌کنندهٔ design را ببینید <#design-options>.SS پیام‌های بررسی‌کنندهٔ Design

%s بیش از حد پیچیده است. امتیاز مک‌کیب %d است زمانی استفاده می‌شود که یک متد یا تابع بر اساس پیچیدگی سیکلوماتیک مک‌کیب (McCabe) بیش از حد پیچیده باشد.

این بررسی‌کننده توسط pylint.extensions.dict_init_mutate ارائه می‌شود. نام دقیق بررسی‌کننده dict-init-mutate است.

هنگام مقداردهی اولیه دیکشنری، تمام کلید/مقدارهای شناخته‌شده را تعریف کنید. دیکشنری‌ها را می‌توان با یک دستور واحد با استفاده از نحو لیترال دیکشنری مقداردهی اولیه کرد.

این بررسی‌کننده توسط pylint.extensions.docstyle ارائه می‌شود. نام دقیق بررسی‌کننده docstyle است.

علامت‌های نقل‌قول داک‌استرینگ نادرست در %s، مقدار مورد انتظار """ بود ولی %s داده شد زمانی استفاده می‌شود که یک داک‌استرینگ (docstring) سه علامت نقل‌قول دوتایی نداشته باشد.
خط اول در داک‌استرینگ %s خالی است زمانی استفاده می‌شود که یک خط خالی در ابتدای یک داک‌استرینگ یافت شود.

این بررسی‌کننده توسط pylint.extensions.dunder ارائه می‌شود. نام دقیق بررسی‌کننده dunder است.

همچنین مستندات گزینه‌های بررسی‌کنندهٔ dunder را ببینید: <#dunder-options>

نام متد داندر %s نادرست است یا غلط املایی دارد. زمانی استفاده می‌شود که نام یک متد داندر (dunder method) دارای غلط املایی باشد یا با نامی خارج از فهرست از پیش تعریف‌شدهٔ نام‌های داندر تعریف شده باشد.

این بررسی‌کننده توسط pylint.extensions.check_elif ارائه می‌شود. نام دقیق بررسی‌کننده else_if_used است.

برای حذف یک سطح تورفتگی، استفاده از "elif" را به جای "else" و سپس "if" در نظر بگیرید زمانی استفاده می‌شود که بلافاصله پس از یک دستور else دستور if بیاید و شامل دستورهای نامرتبط با آن نباشد.

این بررسی‌کننده توسط pylint.extensions.empty_comment ارائه می‌شود. نام دقیق بررسی‌کننده empty-comment است.

خط با کامنت خالی زمانی استفاده می‌شود که نماد # در خطی ظاهر شود که پس از آن توضیح (کامنت) واقعی نیامده باشد.

این بررسی‌کننده توسط pylint.extensions.eq_without_hash ارائه می‌شود. نام دقیق بررسی‌کننده eq-without-hash است.

پیاده‌سازی __eq__ بدون پیاده‌سازی همزمان __hash__ زمانی استفاده می‌شود که یک کلاس __eq__ را پیاده‌سازی کند اما __hash__ را خیر. در صورتی که اشیاء متد __eq__ را پیاده‌سازی کرده باشند، مقدار None را به عنوان پیاده‌سازی پیش‌فرض __hash__ خود دریافت خواهند کرد.

این بررسی‌کننده توسط pylint.extensions.private_import ارائه می‌شود. نام دقیق این بررسی‌کننده import-private-name است.

Imported private %s (%s) زمانی استفاده می‌شود که یک ماژول یا شیء خصوصی با پیشوند _ وارد شود. راهنمای PEP8 در مورد قراردادهای نام‌گذاری بیان می‌کند که مشخصه‌های عمومی با زیرخط آغازین باید خصوصی در نظر گرفته شوند.

این بررسی‌کننده توسط pylint.extensions.magic_value ارائه می‌شود. نام دقیق این بررسی‌کننده magic-value است.

همچنین مستندات گزینه‌های بررسی‌کننده magic-value را ببینید <#magic-value-options>

Consider using a named constant or an enum instead of '%s'. استفاده از ثابت‌های نام‌دار به جای مقادیر جادویی به بهبود خوانایی و نگه‌داری‌پذیری کد شما کمک می‌کند؛ سعی کنید در مقایسه‌ها از آن‌ها اجتناب کنید.

این بررسی‌کننده توسط pylint.extensions.redefined_variable_type ارائه می‌شود. نام دقیق این بررسی‌کننده multiple_types است.

Redefinition of %s type from %s to %s زمانی استفاده می‌شود که نوع یک متغیر درون یک متد یا تابع تغییر کند.

این بررسی‌کننده توسط pylint.extensions.no_self_use ارائه می‌شود. نام دقیق این بررسی‌کننده no_self_use است.

Method could be a function زمانی استفاده می‌شود که یک متد از نمونه مقید (bound instance) خود استفاده نمی‌کند، و بنابراین می‌تواند به صورت یک تابع نوشته شود.

این بررسی‌کننده توسط pylint.extensions.overlapping_exceptions ارائه می‌شود. نام دقیق این بررسی‌کننده overlap-except است.

Overlapping exceptions (%s) زمانی استفاده می‌شود که استثناها در گرداننده (handler) هم‌پوشانی داشته یا یکسان باشند.

این بررسی‌کننده توسط pylint.extensions.docparams ارائه می‌شود. نام دقیق این بررسی‌کننده parameter_documentation است.

اگر پارامترهای توابع، متدها و سازنده‌ها و نوع آن‌ها را به‌صورت روشمند در کد خود مستندسازی می‌کنید، این جزء اختیاری ممکن است برای شما مفید باشد. سبک‌های Sphinx، Google و Numpy پشتیبانی می‌شوند. (برای چند مثال، https://pypi.org/project/sphinxcontrib-napoleon را ببینید.)

می‌توانید این بررسی‌کننده را با افزودن خط زیر:

load-plugins=pylint.extensions.docparams

به بخش MAIN در فایل .pylintrc خود فعال کنید.

این بررسی‌کننده تأیید می‌کند که تمام رشته‌های مستندات (docstrings) توابع، متدها و سازنده‌ها شامل مستندسازی موارد زیر باشند:

  • پارامترها و نوع آن‌ها
  • مقدار بازگشتی و نوع آن
  • استثناهای صادرشده (raised)

و می‌تواند رشته‌های مستندات را در قالب‌های زیر مدیریت کند:

•
سبک Sphinx (param، type، return، rtype، raise / except):
def function_foo(x, y, z):
    '''function foo ...
    :param x: bla x
    :type x: int
    :param y: bla y
    :type y: float
    :param int z: bla z
    :return: sum
    :rtype: float
    :raises OSError: bla
    '''
    return x + y + z
•
یا سبک Google (Args:، Returns:، Raises:):
def function_foo(x, y, z):
    '''function foo ...
    Args:
        x (int): bla x
        y (float): bla y
        z (int): bla z
    Returns:
        float: sum
    Raises:
        OSError: bla
    '''
    return x + y + z
•
یا سبک Numpy (Parameters، Returns، Raises):
def function_foo(x, y, z):
    '''function foo ...
    Parameters
    ----------
    x: int
        bla x
    y: float
        bla y
    z: int
        bla z
    Returns
    -------
    float
        sum
    Raises
    ------
    OSError
        bla
    '''
    return x + y + z
شما از نبود مستندات پارامتر و همچنین ناهماهنگی‌های نام‌گذاری میان امضا و مستندات مطلع خواهید شد؛ مواردی که اغلب هنگام تغییر نام خودکار پارامترها در کد رخ می‌دهند اما در مستندات اعمال نمی‌شوند. نکته: به‌طور پیش‌فرض، docstringهای متدهای خصوصی (private) و جادویی (magic) بررسی نمی‌شوند. برای تغییر این رفتار (برای نمونه، جهت بررسی __init__ نیز) مقدار no-docstring-rgx=^(?!__init__$)_ را به بخش BASIC در فایل .pylintrc خود بیفزایید.

پارامترهای سازنده (Constructor) را می‌توان در docstring کلاس یا در docstring متد __init__ مستند کرد، اما نه در هر دوی آن‌ها:

class ClassFoo(object):
    '''Sphinx style docstring foo
    :param float x: bla x
    :param y: bla y
    :type y: int
    '''
    def __init__(self, x, y):
        pass
class ClassBar(object):
    def __init__(self, x, y):
        '''Google style docstring bar
        Args:
            x (float): bla x
            y (int): bla y
        '''
        pass

در برخی موارد، الزام به مستندسازی تمام پارامترها ممکن است دردسرساز باشد؛ برای نمونه زمانی که بسیاری از توابع یا متدهای شما صرفاً از یک رابط مشترک پیروی می‌کنند. برای رفع این دشواری، چنانچه یکی از عبارت‌های زیر در docstring یافت شود، بازبین (checker) نبود مستندات پارامتر را می‌پذیرد:

  • For the other parameters, see
  • For the parameters, see

(با فاصله‌گذاری اختیاری میان کلمات). لطفاً پیوندی به docstring تعریف‌کننده رابط (مانند متد یک کلاس والد) را پس از "see" اضافه کنید:

def callback(x, y, z):
    '''Sphinx style docstring for callback ...
    :param x: bla x
    :type x: int
    For the other parameters, see
    :class:`MyFrameworkUsingAndDefiningCallback`
    '''
    return x + y + z
def callback(x, y, z):
    '''Google style docstring for callback ...
    Args:
        x (int): bla x
    For the other parameters, see
    :class:`MyFrameworkUsingAndDefiningCallback`
    '''
    return x + y + z

ناهماهنگی‌های نام‌گذاری در پارامترهای موجود و مستندات نوع (type) آن‌ها همچنان شناسایی می‌شوند.

همچنین مستندات گزینه‌های بازبین parameter_documentation را ببینید <#parameter-documentation-options>.SS پیام‌های بررسی‌کننده Parameter Documentation

"%s" دارای پارامترهای سازنده مستندشده در کلاس و __init__ است لطفاً اعلان‌های پارامتر را در کلاس یا سازنده حذف کنید.
پرتاب شدن "%s" مستند نشده است لطفاً برای تمام انواع استثناهای پرتاب‌شده، استثناها را مستند کنید.
مستندات بازگشت (returns) زائد است لطفاً مستندات return/rtype را از این متد حذف کنید.
مستندات yields زائد است لطفاً مستندات yields را از این متد حذف کنید.
مستندات بازگشت (return) وجود ندارد لطفاً مستنداتی درباره آنچه این متد بازمی‌گرداند اضافه کنید.
مستندات نوع بازگشتی وجود ندارد لطفاً نوع بازگردانده‌شده توسط این متد را مستند کنید.
مستندات yield وجود ندارد لطفاً مستنداتی درباره آنچه این مولد (generator) تولید می‌کند اضافه کنید.
مستندات نوع yield وجود ندارد لطفاً نوع تولیدشده (yielded) توسط این متد را مستند کنید.
"%s" در مستندات پارامترها وجود ندارد لطفاً اعلان‌های پارامتر را برای همه پارامترها اضافه کنید.
"%s" در مستندات نوع پارامتر وجود ندارد لطفاً اعلان‌های نوع پارامتر را برای همه پارامترها اضافه کنید.
"%s" در مستندات پارامتر مغایرت دارد لطفاً نام‌های پارامترها را در اعلان‌ها بررسی کنید.
"%s" در مستندات نوع پارامتر مغایرت دارد لطفاً نام‌های پارامترها را در اعلان‌های نوع بررسی کنید.
مستندات بی‌استفاده برای پارامتر نادیده‌گرفته‌شده "%s" لطفاً مستندات پارامتر نادیده‌گرفته‌شده را حذف کنید.
مستندات نوع بی‌استفاده برای پارامتر نادیده‌گرفته‌شده "%s" لطفاً مستندات نوع پارامتر نادیده‌گرفته‌شده را حذف کنید.
هیچ مستنداتی در "%s" وجود ندارد لطفاً مستندات پارامتر و/یا نوع را اضافه کنید.

این بررسی‌کننده توسط pylint.extensions.redefined_loop_name ارائه می‌شود. نام دقیق این بررسی‌کننده redefined-loop-name است.

تعریف دوباره %r از حلقه (خط %s) زمانی استفاده می‌شود که متغیر حلقه در بدنهٔ حلقه بازنویسی شود.

این بررسی‌کننده توسط pylint.extensions.set_membership ارائه می‌شود. نام دقیق این بررسی‌کننده set_membership است.

استفاده از set را برای آزمون عضویت در نظر بگیرید آزمون‌های عضویت زمانی که روی یک ساختار داده بهینه‌شده برای جستجو مانند sets انجام شوند، کارآمدتر هستند.

این بررسی‌کننده توسط pylint.extensions.typing ارائه می‌شود. نام دقیق بررسی‌کننده typing است.

یافتن مشکلات مرتبط با نشانه‌گذاری‌های نوع (type annotations).

همچنین مستندات گزینه‌های بررسی‌کننده typing را ببینید <#typing-options>

'NoReturn' درون نوع‌های مرکب در نسخه‌های 3.7.0 / 3.7.1 دچار مشکل است استفاده از typing.NoReturn درون نوع‌های مرکب در پایتون 3.7.0 و 3.7.1 دچار مشکل است. در صورتی که به درون‌نگری زمان اجرا (runtime introspection) وابسته نیستید، به جای آن از نشانه‌گذاری رشته‌ای استفاده کنید. برای نمونه: Callable[..., 'NoReturn']. https://bugs.python.org/issue34921
'collections.abc.Callable' درون Optional و Union در نسخه‌های 3.9.0 / 3.9.1 دچار مشکل است (به جای آن از 'typing.Callable' استفاده کنید) استفاده از collections.abc.Callable درون Optional و Union در پایتون 3.9.0 و 3.9.1 دچار ایراد است. برای این موارد در عوض از typing.Callable استفاده کنید. https://bugs.python.org/issue42965
'%s' منسوخ شده است، به جای آن از '%s' استفاده کنید هنگامی صادر می‌شود که از یک نام مستعار منسوخ‌شدهٔ نوع‌بندی استفاده شده باشد.
'%s' در PY39 منسوخ خواهد شد، استفاده از '%s' را به جای آن در نظر بگیرید%s تنها در صورتی صادر می‌شود که 'runtime-typing=no' باشد و یک نام مستعار منسوخ‌شدهٔ نوع‌بندی در زمینهٔ نشانه‌گذاری نوع در پایتون 3.7 یا 3.8 به کار رفته باشد.
استفاده از نحو جایگزین اجتماع را به جای '%s' در نظر بگیرید%s هنگامی صادر می‌شود که typing.Union یا typing.Optional به جای نحو خلاصه‌شدهٔ اجتماع به کار رود. برای نمونه، Union[int, float] به جای int | float. استفاده از نحو خلاصه‌شده برای اجتماع‌ها با توصیه‌های نوع‌بندی پایتون همخوانی دارد، نیاز به وارد کردن ماژول‌ها را رفع می‌کند و مانع از سردرگمی در امضای توابع می‌شود.
نوع `%s` بیش از یک بار در نشانه‌گذاری نوع اجتماع به کار رفته است. راهنماهای نوع اضافی را حذف کنید. آرگومان‌های نوع تکراری توسط ابزار mypy نادیده گرفته خواهند شد، بنابراین برای جلوگیری از سردرگمی باید حذف شوند.
نوع `%s` دارای آرگومان‌های نوع پیش‌فرض غیرضروری است. آن را به `%s` تغییر دهید. هنگامی صادر می‌شود که نوع‌ها دارای آرگومان‌های نوع پیش‌فرضی باشند که می‌توان از آن‌ها صرف‌نظر کرد. به‌طور عمده برای typing.Generator و typing.AsyncGenerator کاربرد دارد.

این بررسی‌کننده توسط pylint.extensions.while_used ارائه می‌شود. نام دقیق بررسی‌کننده while_used است.

استفاده از حلقهٔ `while` حلقه‌های نامحدود while اغلب می‌توانند به صورت حلقه‌های محدود for بازنویسی شوند. مواردی همچون حلقه‌های رویداد (event loops)، شنونده‌ها (listeners) و غیره می‌توانند استثنا باشند.

به لطف رابط‌های برنامه‌نویسی، می‌توانید Pylint، symilar و pyreverse را از برنامه‌های پایتون دیگر فراخوانی کنید:

from pylint import run_pylint, run_pyreverse, run_symilar
run_pylint("--disable=C", "myfile.py")
run_pyreverse(...)
run_symilar(...)

می‌توانید از تابع run_pylint استفاده کنید، که همان تابعی است که توسط خط فرمان (با استفاده از sys.argv) فراخوانی می‌شود. می‌توانید آرگومان‌ها را خودتان مشخص کنید:

from pylint import run_pylint
run_pylint(argv=["--disable=line-too-long", "myfile.py"])

همچنین اگر می‌خواهید کاری انجام دهید که تنها با استفاده از گزینه‌های خط فرمان pylint امکان‌پذیر نیست، می‌توانید مستقیماً از pylint.lint.Run استفاده کنید. در اینجا یک مثال پایه آورده شده است:

from pylint.lint import Run
Run(argv=["--disable=line-too-long", "myfile.py"])

با Run می‌توان pylint را به‌صورت برنامه‌نویسی‌شده به همراه یک گزارشگر (reporter) که با یک جریان سفارشی مقداردهی اولیه شده است، فراخوانی کرد:

from io import StringIO
from pylint.lint import Run
from pylint.reporters.text import TextReporter
pylint_output = StringIO()  # Custom open stream
reporter = TextReporter(pylint_output)
Run(["test_file.py"], reporter=reporter, exit=False)
print(pylint_output.getvalue())  # Retrieve and print the text report

گزارشگر می‌تواند هر شیء جریانی را به‌عنوان پارامتر بپذیرد. در این مثال، جریان به یک فایل خروجی می‌دهد:

from pylint.lint import Run
from pylint.reporters.text import TextReporter
with open("report.out", "w") as f:
    reporter = TextReporter(f)
    Run(["test_file.py"], reporter=reporter, exit=False)

این قابلیت برای دریافت خروجی pylint در یک جریان باز جهت انتقال به برنامه‌ای دیگر مفید خواهد بود.

اگر برنامهٔ شما انتظار دارد که فایل‌های تحت بررسی (lint) ممکن است بین دفعات اجرا ویرایش شوند، لازم است حافظهٔ پنهان استنتاج (inference cache) در pylint را پاک کنید:

from pylint.lint import pylinter
pylinter.MANAGER.clear_cache()

می‌توانید چند نمونه ساده را در توزیع بیابید (custom.py https://github.com/pylint-dev/pylint/blob/main/examples/custom.py ، custom_raw.py https://github.com/pylint-dev/pylint/blob/main/examples/custom_raw.py و deprecation_checker.py https://github.com/pylint-dev/pylint/blob/main/examples/deprecation_checker.py).

سه نوع بررسی‌کننده (checker) وجود دارد:

  • بررسی‌کننده‌های خام (Raw checkers)، که هر ماژول را به‌صورت یک جریان خام فایل تحلیل می‌کنند.
  • بررسی‌کننده‌های توکن (Token checkers)، که یک فایل را با استفاده از فهرست توکن‌های نمایش‌دهنده کد منبع در فایل تحلیل می‌کنند.
  • بررسی‌کننده‌های AST، که روی نمایش AST از ماژول کار می‌کنند.

نمایش AST توسط کتابخانه astroid ارائه می‌شود. astroid اطلاعات و متدهای بیشتری را نسبت به ast در کتابخانه استاندارد اضافه می‌کند تا پیمایش درخت و درون‌نگری (introspection) کد آسان‌تر شود.

بیایید یک بررسی‌کننده پیاده‌سازی کنیم تا مطمئن شویم همه گره‌های return در یک تابع، یک مقدار ثابت (constant) یکتا برمی‌گردانند. ابتدا باید ساختار اولیه و کدهای پایه (boilerplate) ضروری را تکمیل کنیم:

import astroid
from astroid import nodes
from typing import TYPE_CHECKING, Optional
from pylint.checkers import BaseChecker
if TYPE_CHECKING:
    from pylint.lint import PyLinter
class UniqueReturnChecker(BaseChecker):
    name = "unique-returns"
    msgs = {
        "W0001": (
            "Returns a non-unique constant.",
            "non-unique-returns",
            "All constants returned in a function should be unique.",
        ),
    }
    options = (
        (
            "ignore-ints",
            {
                "default": False,
                "type": "yn",
                "metavar": "<y or n>",
                "help": "Allow returning non-unique integers",
            },
        ),
    )

تاکنون مؤلفه‌های ضروری زیر را برای بررسی‌کننده خود تعریف کرده‌ایم:

•
یک نام (name). نام برای ایجاد یک بخش پیکربندی ویژه
برای بررسی‌کننده، در زمانی که گزینه‌ها ارائه شده باشند، استفاده می‌شود.
•
دیکشنری پیام‌ها (message dictionary). هر بررسی‌کننده برای یافتن مشکلات
در کد شما استفاده می‌شود؛ این مشکلات از طریق پیام‌ها (messages) به کاربر نمایش داده می‌شوند. دیکشنری پیام باید مشخص کند که بررسی‌کننده چه پیام‌هایی را صادر خواهد کرد. برای جزئیات مربوط به تعریف یک پیام جدید، بخش Defining a Message را ببینید.

ما همچنین یک مؤلفه اختیاری از بررسی‌کننده را تعریف کرده‌ایم. فهرست گزینه‌ها (options) هرگونه گزینه قابل پیکربندی توسط کاربر را تعریف می‌کند. این فهرست قالب زیر را دارد:

options = (
    ("option-symbol", {"argparse-like-kwarg": "value"}),
)
•
عبارت option-symbol یک نام یکتا برای گزینه است. این نام در خط فرمان و در فایل‌های پیکربندی استفاده می‌شود. خط فاصله (hyphen) هنگام استفاده در بررسی‌کننده با یک زیرخط (underscore) جایگزین می‌شود، مشابه نحوه استفاده از argparse.Namespace:
if not self.linter.config.ignore_ints:
    ...

سپس، زمان ورود به یک تابع و خروج از آن را ردیابی خواهیم کرد.

def __init__(self, linter: Optional["PyLinter"] = None) -> None:
    super().__init__(linter)
    self._function_stack = []
def visit_functiondef(self, node: nodes.FunctionDef) -> None:
    self._function_stack.append([])
def leave_functiondef(self, node: nodes.FunctionDef) -> None:
    self._function_stack.pop()

در سازنده (constructor)، پشته‌ای را مقداردهی اولیه می‌کنیم تا فهرستی از گره‌های return را برای هر تابع نگه‌داری کند. یک بررسی‌کننده AST یک بازدیدکننده (visitor) است و باید متدهای visit_<lowered class name> یا leave_<lowered class name> را برای گره‌هایی که به آن‌ها نیاز دارد پیاده‌سازی کند. در این حالت، ما متدهای visit_functiondef و leave_functiondef را پیاده‌سازی کرده‌ایم تا فهرست جدیدی از گره‌های return را برای این تابع اضافه کنیم، و هنگامی که از تابع خارج می‌شویم، فهرست گره‌های return را حذف کنیم.

در نهایت، بررسی را پیاده‌سازی خواهیم کرد. یک تابع visit_return تعریف می‌کنیم، که با یک گره .astroid.nodes.Return فراخوانی می‌شود.

باید بتوانیم مشخص کنیم که یک گره .astroid.nodes.Return چه ویژگی‌هایی (attributes) در دسترس دارد. می‌توانیم از astroid.extract_node برای این کار استفاده کنیم:

>>> node = astroid.extract_node("return 5")
>>> node
<Return l.1 at 0x7efe62196390>
>>> help(node)
>>> node.value
<Const.int l.1 at 0x7efe62196ef0>

همچنین می‌توانیم یک مثال کامل‌تر بسازیم:

>>> node_a, node_b = astroid.extract_node("""
... def test():
...     if True:
...         return 5 #@
...     return 5 #@
... """)
>>> node_a.value
<Const.int l.4 at 0x7efe621a74e0>
>>> node_a.value.value
5
>>> node_a.value.value == node_b.value.value
True
برای astroid.extract_node، می‌توانید از #@ در انتهای یک خط استفاده کنید تا مشخص نمایید کدام دستورها به گره‌ها استخراج شوند.

برای اطلاعات بیشتر دربارهٔ astroid.extract_node، مستندات astroid را در https://pylint.readthedocs.io/projects/astroid/en/latest مشاهده کنید.

حال که می‌دانیم چگونه از گره astroid استفاده کنیم، می‌توانیم بررسی خود را پیاده‌سازی کنیم.

def visit_return(self, node: nodes.Return) -> None:
    if not isinstance(node.value, nodes.Const):
        return
    for other_return in self._function_stack[-1]:
        if node.value.value == other_return.value.value and not (
            self.linter.config.ignore_ints and node.value.pytype() == int
        ):
            self.add_message("non-unique-returns", node=node)
    self._function_stack[-1].append(node)

هنگامی که محرز شد کد منبع در بررسی ما مردود شده است، از ~.BaseChecker.add_message برای ارسال پیام شکست خود استفاده می‌کنیم.

در نهایت، باید بررسی‌کننده را در pylint ثبت کنیم. تابع register را به سطح بالایی فایل اضافه کنید.

def register(linter: "PyLinter") -> None:
    """This required method auto registers the checker during initialization.
    :param linter: The linter to register the checker to.
    """
    linter.register_checker(UniqueReturnChecker(linter))

اکنون آماده‌ایم تا بررسی‌کنندهٔ خود را اشکال‌زدایی و آزمایش کنیم!

رسیدن به نقطه‌ای که بتوانیم از pdb استفاده کنیم بسیار ساده است. ما به یک مورد آزمایشی کوچک نیاز خواهیم داشت. کد زیر را درون یک فایل Python قرار دهید:

def test():
    if True:
        return 5
    return 5
def test2():
    if True:
        return 1
    return 5

پس از قرار دادن pdb درون بررسی‌کنندهٔ خود و نصب آن، می‌توانیم pylint را تنها با بررسی‌کنندهٔ خود اجرا کنیم:

$ pylint --load-plugins=my_plugin --disable=all --enable=non-unique-returns test.py
(Pdb)

اکنون می‌توانیم بررسی‌کنندهٔ خود را اشکال‌زدایی کنیم!

نکته:

my_plugin به ماژولی به نام my_plugin.py اشاره دارد. روش ارجح برای در دسترس قرار دادن این افزونه برای pylint، نصب آن به عنوان یک بسته است. این کار را می‌توان از طریق یک نمایهٔ بسته مانند PyPI یا با نصب آن از یک منبع محلی مانند pip install انجام داد.

همچنین، ماژول افزونه می‌تواند با قرار دادن دایرکتوری والد این ماژول در متغیر محیطی PYTHONPATH، در دسترس pylint قرار گیرد.

اگر پیکربندی pylint شما دارای یک init-hook باشد که sys.path را برای شامل کردن دایرکتوری والد ماژول تغییر دهد، این روش نیز کار خواهد کرد؛ اما تنها در صورتی که یکی از این دو حالت برقرار باشد:

  • هم init-hook و هم فهرست load-plugins هر دو در یک فایل پیکربندی تعریف شده باشند، یا...
  • init-hook به عنوان یک آرگومان خط فرمان ارسال شود و فهرست load-plugins در فایل پیکربندی قرار داشته باشد

بنابراین، اگر init-hook را در یک فایل پیکربندی مشخص کنید اما نام ماژول را از طریق --load-plugins در خط فرمان ارسال نمایید، نمی‌توانید با تغییر sys.path یک افزونه سفارشی را بارگذاری کنید. زیرا pylint افزونه‌های مشخص‌شده در خط فرمان را پیش از بارگذاری هرگونه پیکربندی از منابع دیگر، بارگذاری می‌کند.

پیام Pylint با استفاده از ساختار زیر تعریف می‌شود:

msgs = {
    "E0401": ( # message id
     "Unable to import %s", # template of displayed message
     "import-error", # message symbol
     "Used when pylint has been unable to import a module.",  # Message description
     { # Additional parameters:
          # message control support for the old names of the messages:
         "old_names": [("F0401", "old-import-error")]
         "minversion": (3, 5), # No check under this version
         "maxversion": (3, 7), # No check above this version
     },
 ),

سپس پیام با استفاده از پارامتر args در متد add_message قالب‌بندی می‌شود؛ یعنی در self.add_message("import-error", args=module_we_cant_import, node=importnode)، مقدار درون module_we_cant_import، برای نمونه patglib، جای‌گذاری شده و نتیجه نهایی به این صورت خواهد بود: Unable to import patglib

  • شناسه پیام (message-id) باید یک عدد ۴ رقمی باشد که یک message category (دسته‌بندی پیام) به عنوان پیشوند به آن اضافه شده است. دسته‌بندی‌های متعددی برای پیام‌ها وجود دارد که عبارتند از C، W، E، F، R، و به ترتیب نشان‌دهنده Convention (قراردادها)، Warning (هشدار)، Error (خطا)، Fatal (خطای مهلک) و Refactoring (بازآفرینی کد) هستند. این ۴ رقم نباید با بررسی‌کننده‌های موجود تداخل داشته باشند و ۲ رقم اول باید در سراسر بررسی‌کننده یکدست باشند (به استثنای پیام‌های مشترک). استفاده از ۵۱-۹۹ به عنوان ۲ رقم اول برای بررسی‌کننده‌های سفارشی ایمن است زیرا این محدوده برای آن‌ها رزرو شده است.
  • عبارت displayed-message برای نمایش پیام به کاربر پس از انتشار آن به کار می‌رود.
  • شناسه نمادین message-symbol یک نام مستعار برای شناسه پیام است و در هر جایی که شناسه پیام قابل استفاده باشد، می‌توان از آن نیز استفاده کرد.
  • توضیحات message-help هنگام فراخوانی دستور pylint --help-msg نمایش داده می‌شود.

پیام می‌تواند به صورت اختیاری شامل گزینه‌های اضافی زیر باشد:

  • گزینه old_names امکان تغییر شناسه پیام یا نماد یک پیام را بدون از کار انداختن کنترل پیام مورد استفاده کاربران روی پیام‌های قدیمی فراهم می‌کند. این گزینه به صورت فهرستی از چندتایی‌ها به شکل (message-id, old-message-symbol) مشخص می‌شود؛ مانند {"old_names": [("F0401", "old-import-error")]}. تناظر میان نماد و شناسه پیام باید یکتا باشد؛ بنابراین اگر شناسه پیام را تغییر می‌دهید، نماد نیز باید تغییر کند و معمولاً می‌توانید از پیشوند old- برای این کار استفاده کنید.
  • گزینه‌های minversion یا maxversion حداقل یا حداکثر نسخه پایتون مرتبط با این پیام را مشخص می‌کنند. مقدار این گزینه به صورت یک چندتایی با شماره نسخه اصلی به عنوان عدد اول و شماره نسخه فرعی به عنوان عدد دوم مشخص می‌شود؛ مانند {"minversion": (3, 5)}.
  • گزینه shared امکان به اشتراک گذاشتن پیام میان چندین بررسی‌کننده را فعال می‌کند. همان‌طور که پیش‌تر اشاره شد، در حالت عادی پیام‌ها نمی‌توانند بین چند بررسی‌کننده به اشتراک گذاشته شوند. برای مجاز کردن اشتراک پیام میان چند بررسی‌کننده، گزینه shared باید روی True تنظیم شود.

کلاس BaseChecker دارای دو متد به نام‌های get_map_data و reduce_map_data است که امکان موازی‌سازی بررسی‌ها را هنگام استفاده از گزینه -j فراهم می‌کنند. اگر یک بررسی‌کننده واقعاً به تجمیع و کاهش داده‌ها (reduce) نیاز داشته باشد، باید متد get_map_data را طوری تعریف کند که مقداری غیر از None برگرداند و اجازه دهد متد reduce_map_data آن، فهرستی از نوع‌های بازگردانده‌شده توسط get_map_data را مدیریت و پردازش کند.

یک نمونه از این مورد را می‌توان در pylint/checkers/similar.py مشاهده کرد.

ابزار Pylint برای توسعه مبتنی بر آزمایش (TDD) بسیار مناسب است. می‌توانید قالب کلی بررسی‌کننده را پیاده‌سازی کنید، همه موارد آزمایشی (test cases) خود را بنویسید و بررسی کنید که شکست می‌خورند، سپس بررسی‌کننده را پیاده‌سازی کنید، و در نهایت بررسی کنید که تمام موارد آزمایشی شما به درستی کار می‌کنند.

ابزار Pylint کلاس pylint.testutils.CheckerTestCase را برای ساده‌سازی ایجاد موارد آزمایشی ارائه می‌دهد. می‌توانیم از کد نمونه‌ای که برای اشکال‌زدایی به کار بردیم به عنوان موارد آزمایشی استفاده کنیم.

import astroid
import my_plugin
import pylint.testutils
class TestUniqueReturnChecker(pylint.testutils.CheckerTestCase):
    CHECKER_CLASS = my_plugin.UniqueReturnChecker
    def test_finds_non_unique_ints(self):
        func_node, return_node_a, return_node_b = astroid.extract_node("""
        def test(): #@
            if True:
                return 5 #@
            return 5 #@
        """)
        self.checker.visit_functiondef(func_node)
        self.checker.visit_return(return_node_a)
        with self.assertAddsMessages(
            pylint.testutils.MessageTest(
                msg_id="non-unique-returns",
                node=return_node_b,
            ),
        ):
            self.checker.visit_return(return_node_b)
    def test_ignores_unique_ints(self):
        func_node, return_node_a, return_node_b = astroid.extract_node("""
        def test(): #@
            if True:
                return 1 #@
            return 5 #@
        """)
        with self.assertNoMessages():
            self.checker.visit_functiondef(func_node)
            self.checker.visit_return(return_node_a)
            self.checker.visit_return(return_node_b)

یک بار دیگر از متد astroid.extract_node برای ساخت موارد آزمایشی خود استفاده می‌کنیم. کلاس pylint.testutils.CheckerTestCase لینتر و بررسی‌کننده را برای ما ایجاد کرده است؛ ما صرفاً با استفاده از گره‌های مورد نظرمان، پیمایش درخت AST را شبیه‌سازی می‌کنیم..SS نحوه نوشتن یک افزونه Pylint

ابزار Pylint از نوشتن دو نوع افزونه پشتیبانی می‌کند. نخست، مفهوم checkers وجود دارد که می‌توان از آن برای یافتن مشکلات در کد استفاده کرد. دوم، مفهوم transform plugin نیز وجود دارد که روشی را ارائه می‌دهد که از طریق آن استنتاج و قابلیت‌های Pylint می‌تواند بهبود یافته و برای یک ماژول، کتابخانه یا چارچوب خاص سفارشی‌سازی شود.

به‌طور کلی، یک افزونه ماژولی است که باید تابعی به نام register داشته باشد که نمونه‌ای از pylint.lint.PyLinter را به‌عنوان ورودی دریافت می‌کند.

یک افزونه می‌تواند به‌صورت اختیاری تابعی با نام load_configuration تعریف کند که نمونه‌ای از pylint.lint.PyLinter را به‌عنوان ورودی می‌گیرد. این تابع پس از اینکه Pylint پیکربندی را از فایل پیکربندی و رابط خط فرمان بارگیری کرد، فراخوانی می‌شود. این تابع باید پیکربندی‌های اضافی مربوط به افزونه را در Pylint بارگذاری کند.

بنابراین یک افزونه پایه hello-world را می‌توان به این صورت پیاده‌سازی کرد:

# Inside hello_plugin.py
from typing import TYPE_CHECKING
import astroid
if TYPE_CHECKING:
    from pylint.lint import PyLinter
def register(linter: "PyLinter") -> None:
  """This required method auto registers the checker during initialization.
  :param linter: The linter to register the checker to.
  """
  print('Hello world')

می‌توانیم این افزونه را با قرار دادن این ماژول در PYTHONPATH و فراخوانی pylint به صورت زیر اجرا کنیم:

$ pylint -E --load-plugins hello_plugin foo.py
Hello world

می‌توانیم افزونه hello-world را با استفاده از تابع load_configuration برای نادیده گرفتن برخی نام‌های خاص گسترش دهیم:

# Inside hello_plugin.py
from typing import TYPE_CHECKING
import astroid
if TYPE_CHECKING:
    from pylint.lint import PyLinter
def register(linter: "PyLinter") -> None:
  """This required method auto registers the checker during initialization.
  :param linter: The linter to register the checker to.
  """
  print('Hello world')
def load_configuration(linter):
  name_checker = get_checker(linter, NameChecker)
  # We consider as good names of variables Hello and World
  name_checker.config.good_names += ('Hello', 'World')
  # We ignore bin directory
  linter.config.black_list += ('bin',)

بسته به اینکه به یک transform plugin یا یک checker نیاز داریم، ممکن است این مقدار کافی نباشد. برای مورد اول، این کار برای اعلام ماژول به‌عنوان یک افزونه کافی است، اما در مورد دوم، باید checker خود را با فراخوانی دستور زیر در داخل تابع register، در شیء linter ثبت کنیم:

linter.register_checker(OurChecker(linter))

برای اطلاعات بیشتر درباره نوشتن یک checker به بخش «نحوه نوشتن یک Checker» مراجعه کنید: <#write-a-checker>..SS پلاگین‌های تبدیل (Transform plugins)

ابزار Pylint یک ابزار تحلیل ایستا است و Python زبانی با نوع‌بندی پویا می‌باشد. بنابراین مواردی پیش خواهد آمد که Pylint نمی‌تواند فایل‌ها را به‌درستی تحلیل کند (این مشکل در زبان‌هایی با نوع‌بندی ایستا نیز در صورت استفاده از بازتاب یا ارزیابی پویا می‌تواند رخ دهد).

پلاگین‌ها روشی هستند برای اینکه به Pylint بگوییم چگونه با چنین مواردی برخورد کند، زیرا تنها کاربر می‌داند چه کاری باید انجام شود. آن‌ها معمولاً در سطح AST عمل می‌کنند و با دستکاری یا اصلاح آن، درک کد را برای Pylint ساده‌تر می‌سازند.

بیایید Pylint را روی یک ماژول از سورس‌کد Python اجرا کنیم: warnings.py https://hg.python.org/cpython/file/2.7/Lib/warnings.py و ببینیم چه اتفاقی می‌افتد:

amitdev$ pylint -E Lib/warnings.py
E:297,36: Instance of 'WarningMessage' has no 'message' member (no-member)
E:298,36: Instance of 'WarningMessage' has no 'filename' member (no-member)
E:298,51: Instance of 'WarningMessage' has no 'lineno' member (no-member)
E:298,64: Instance of 'WarningMessage' has no 'line' member (no-member)

آیا به یک خطای واقعی برخوردیم؟ بیایید کد را باز کرده و نگاهی به کلاس WarningMessage بیندازیم:

class WarningMessage(object):
  """Holds the result of a single showwarning() call."""
  _WARNING_DETAILS = ("message", "category", "filename", "lineno", "file",
                      "line")
  def __init__(self, message, category, filename, lineno, file=None,
                  line=None):
    local_values = locals()
    for attr in self._WARNING_DETAILS:
      setattr(self, attr, local_values[attr])
    self._category_name = category.__name__ if category else None
  def __str__(self):
    ...

آهان، فیلدها (message، category و غیره) به‌صورت ایستا روی کلاس تعریف نشده‌اند. در عوض، آن‌ها با استفاده از setattr اضافه شده‌اند. Pylint برای درک این ساختار با مشکل مواجه خواهد شد.

می‌توانیم یک پلاگین تبدیل بنویسیم تا به Pylint یاد بدهد که چگونه این کلاس را به‌درستی تحلیل کند.

یک راه برای رفع این مورد با پلاگین، تبدیل کلاس WarningMessage است؛ از طریق تنظیم ویژگی‌ها به‌گونه‌ای که Pylint بتواند آن‌ها را ببیند. این کار با ثبت یک تابع تبدیل انجام می‌شود. ما می‌توانیم هر گره‌ای را در AST تجزیه‌شده مانند Module، Class، Function و غیره تغییر دهیم. در این سناریو، ما باید یک کلاس را تبدیل کنیم. این کار به این شکل انجام می‌شود:

from typing import TYPE_CHECKING
import astroid
if TYPE_CHECKING:
    from pylint.lint import PyLinter
def register(linter: "PyLinter") -> None:
  """This required method auto registers the checker during initialization.
  :param linter: The linter to register the checker to.
  """
  pass
def transform(cls):
  if cls.name == 'WarningMessage':
    import warnings
    for f in warnings.WarningMessage._WARNING_DETAILS:
      cls.locals[f] = [astroid.ClassDef(f, None)]
astroid.MANAGER.register_transform(astroid.ClassDef, transform)

بیایید پلاگین را با هم مرور کنیم. ابتدا، باید یک تبدیل کلاس را ثبت کنیم که از طریق تابع register_transform در MANAGER انجام می‌شود. این تابع نوع گره و تابع تبدیل را به عنوان پارامتر می‌پذیرد. ما نیاز داریم یک کلاس را تغییر دهیم، بنابراین از astroid.ClassDef استفاده می‌کنیم. همچنین یک تابع transform را پاس می‌دهیم که فرآیند تبدیل واقعی را انجام می‌دهد.

تابع transform نیز ساده است. اگر کلاس مورد نظر WarningMessage باشد، صفت‌ها را به locals آن اضافه می‌کنیم (ما نگران نوع صفات نیستیم، بنابراین تنظیم آن‌ها به عنوان class کفایت می‌کند؛ هرچند می‌توانستیم آن‌ها را به هر نوع دلخواهی تنظیم کنیم). کار تمام است.

نکته: نیازی نیست هیچ کاری در تابع register پلاگین انجام دهیم، زیرا چیزی را در خود linter دستکاری نمی‌کنیم.

بیایید Pylint را به همراه این پلاگین اجرا کنیم و نتیجه را ببینیم:

amitdev$ pylint -E --load-plugins warning_plugin Lib/warnings.py
amitdev$

اکنون تمام هشدارهای مثبت کاذب (false positives) مربوط به WarningMessage برطرف شده‌اند. این فقط یک مثال بود؛ هرگونه تبدیل کدی را می‌توان توسط پلاگین‌ها پیاده‌سازی کرد.

برای دیدن نمونه‌های واقعی از پلاگین‌های تبدیل، astroid/brain https://github.com/pylint-dev/astroid/tree/main/astroid/brain را بررسی کنید..SS مرجع فنی

دو کلاس اصلی در pylint.lint عبارتند از .pylint.lint.Run و .pylint.lint.PyLinter.

شیء .pylint.lint.Run مسئول راه‌اندازی pylint است. این شیء بررسی‌های اولیه‌ای روی گزینه‌های خط فرمان داده‌شده انجام می‌دهد تا قلاب (hook) اولیه را برای اجرا پیدا کند، فایل پیکربندی مورد استفاده را بیابد، و مشخص کند چه افزایه‌هایی تعیین شده‌اند. سپس می‌تواند نمونهٔ اصلی .pylint.lint.PyLinter را ایجاد کرده و آن را با فایل پیکربندی و افزایه‌هایی که هنگام پیش‌پردازش گزینه‌های خط فرمان شناسایی شده‌اند مقداردهی اولیه کند. در نهایت شیء .pylint.lint.Run هرگونه linter فرزند را برای کارهای موازی اجرا کرده و فرایند بررسی کد (linting) را آغاز می‌نماید.

شیء .pylint.lint.PyLinter مسئول هماهنگ‌سازی فرایند بررسی کد است. این شیء پیکربندی را تجزیه کرده و آن را برای بررسی‌کننده‌ها و سایر افزایه‌ها فراهم می‌کند، پیام‌های صادرشده توسط بررسی‌کننده‌ها را پردازش می‌نماید، گزارش‌دهی خروجی را مدیریت می‌کند، و بررسی‌کننده‌ها را راه‌اندازی می‌کند.

تمام بررسی‌کننده‌های پیش‌فرض pylint در pylint.checkers وجود دارند. بخش عمدهٔ هوش pylint در این قسمت قرار دارد. بیشتر بررسی‌کننده‌ها مبتنی بر AST هستند و بنابراین از astroid استفاده می‌کنند. ماژول pylint.checkers.utils تعداد زیادی متد کمکی برای کار با astroid فراهم می‌کند.

راهنمای مشارکت‌کنندگان در صورتی که بخواهید در خود pylint مشارکت کنید به شما کمک خواهد کرد.

می‌خواهید در pylint مشارکت کنید؟ کارهای زیادی وجود دارد که می‌توانید انجام دهید. در اینجا فهرستی از پیوندها بر اساس آنچه که می‌خواهید انجام دهید آمده است:

اگر یکی از نگه‌دارندگان pylint هستید، این موارد نیز وجود دارد:

تغییری برای Pylint در نظر دارید؟ در ادامه چند مرحله آورده شده است که باید انجام دهید تا مطمئن شوید وصلهٔ شما پذیرفته می‌شود:

  • باید حداقل از Python 3.8 برای توسعهٔ Pylint استفاده کنید چرا که به شما دسترسی به جدیدترین تجزیه‌کنندهٔ ast را می‌دهد و برخی قلاب‌های pre-commit از python 3.7 پشتیبانی نمی‌کنند.
  • وابستگی‌های توسعه را نصب کنید؛ نصب مشارکت‌کننده <#contributor-install> را ببینید.
  • از مجموعه آزمون‌های ما استفاده کرده و آزمون‌های جدید بنویسید؛ آزمودن pylint <#contributor-testing> را ببینید.
•
اگر تغییر شما غیرجزئی است، آن را مستندسازی کنید:
  • در صورتی که نیازی نباشد تغییر در changelog ذکر شود، ممکن است نگه‌دارنده به issue برچسب skip-news بزند.
  • در غیر این صورت، یک قطعه خبری با دستور towncrier create <IssueNumber>.<type> ایجاد کنید که در changelog گنجانده خواهد شد. <type> می‌تواند یکی از انواع تعریف‌شده در ./towncrier.toml باشد. در صورت نیاز می‌توانید جزئیات بیشتری بنویسید یا مثال‌هایی از نحوهٔ کارکرد تغییر جدید ارائه دهید.
  • تولید مستندات با دستور tox -e docs انجام می‌شود.
  • یک pull request از طریق GitHub ارسال کنید (برای اطلاعات بیشتر در مورد این موضوع، دربارهٔ pull requestها https://support.github.com/features/pull-requests را ببینید).
  • پیام‌های کامیت جامع و/یا شرح مناسبی از آنچه PR انجام می‌دهد بنویسید. در صورتی که چنین issueای وجود دارد، تغییر خود را به یک issue در سامانهٔ رهگیری مرتبط کنید (برای اطلاعات بیشتر در این باره، بستن issueها از طریق پیام‌های کامیت https://github.blog/2013-01-22-closing-issues-via-commit-messages در مستندات GitHub را ببینید).
  • تغییرات را کوچک نگه دارید؛ تغییرات مورد توافق همگان را از موارد سلیقه‌ای و مناقشه‌برانگیز جدا کنید.
  • اگر تغییر نیازمند آن است، در گشودن چندین PR تردید نکنید. اگر بازبینی تغییر شما چنان بزرگ باشد که مستلزم برنامه‌ریزی و اختصاص زمانی طولانی برای بررسی باشد، به احتمال بسیار زیاد راکد خواهد شد.
  • نگه‌دارندگان ممکن است روزانه چندین بازهٔ ۵ تا ۱۰ دقیقه‌ای برای بازبینی داشته باشند—مثلاً در حین انتظار برای جوش آمدن قوری‌شان، یا منتظر ماندن برای آرام شدن شریک زندگی‌شان پس از یک شوخی خنده‌دار خورهٔ رایانه—اما در بهترین حالت شاید تنها یک ساعت کامل در هفته زمان بازبینی داشته باشند.
•
اگر هنگام مشارکت از چندین ایمیل یا چندین نام استفاده کرده‌اید، ایمیل‌ها و نام مورد نظر خود را در فایل script/.contributors_aliases.json اضافه کنید.
  • «مرجع فنی» <#technical-reference> را مطالعه کنید. این بخش مرور کوتاهی بر پایه‌کد pylint ارائه می‌دهد و به شما کمک می‌کند تا محل اعمال تغییرات لازم برای آنچه قصد پیاده‌سازی‌اش را دارید، شناسایی کنید.
  • تابع astroid.extract_node دوست شماست. بیشتر بررسی‌کننده‌ها مبتنی بر AST هستند، بنابراین احتمالاً نیاز به تعامل با astroid خواهید داشت. یک مثال کوتاه از نحوه استفاده از astroid.extract_node در اینجا <#astroid-extract-node> آورده شده است.
  • هنگام رفع اشکال یک بررسی خاص، پیام هشدار را در کد جستجو کنید تا متوجه شوید این هشدار در کجا صادر می‌شود و در نتیجه منطق آن کد کجاست.
  • هنگام افزودن یک کلاس بررسی‌کننده جدید، می‌توانید از اسکریپت get_unused_message_id_category.py در پوشه ./script استفاده کنید تا شناسه پیامی را دریافت نمایید که توسط هیچ‌یک از بررسی‌کننده‌های دیگر استفاده نشده است.

می‌توانید از makefile موجود در پوشه doc برای ساخت مستندات استفاده کنید:

$ make -C doc/ install-dependencies
$ make -C doc/ html

برای سرعت بیشتر، ما از فایل‌های تولیدشده مجدداً استفاده می‌کنیم؛ هر زمان که مایل بودید از ابتدا شروع کنید از make clean یا tox -e docs استفاده کنید.

بسته به نوع تغییری که ایجاد می‌کنید، انتخاب کنید:

•
در انتشار وصله‌ای (patch release) (1.2.3)، ما فقط مثبت‌های کاذب و خرابی‌ها را رفع می‌کنیم.
•
در انتشارهای فرعی (minor releases) (1.2.0)، بررسی‌هایی اضافه یا حذف می‌کنیم، پشتیبانی از مفسرهای python که از پایان دوره پشتیبانی گذشته‌اند را متوقف می‌کنیم، نسخه‌های اصلی/فرعی astroid را ارتقا می‌دهیم و منفی‌های کاذب را رفع می‌کنیم.
•
در انتشارهای اصلی (major releases) (1.0.0) سایر موارد را تغییر می‌دهیم (گزینه‌های pylint، خروجی json، رابط برنامه‌نویسی توسعه‌دهنده...) در حالی که همچنان تلاش می‌کنیم ایجاد اختلال به حداقل برسد.

نرم‌افزار Pylint به‌خوبی آزمایش شده و پوشش کد بالایی دارد. مشارکت‌های جدید تا زمانی که شامل آزمون‌ها نباشند پذیرفته نمی‌شوند.

توسعه Pylint با استفاده از سیستم کنترل نسخه توزیع‌شده git https://git-scm.com انجام می‌شود.

می‌توانید Pylint را با این دستور کلون کنید:

git clone https://github.com/pylint-dev/pylint

پیش از شروع آزمایش کد خود، باید بسته کد منبع را به‌صورت محلی نصب کنید. فرض کنید همین حالا با دستور قبلی git clone مخزن pylint را کلون کرده‌اید. برای آماده‌سازی محیط آزمایش، یک ترمینال باز کرده و دستورات زیر را اجرا کنید:

cd pylint
python3 -m venv venv
source venv/bin/activate
pip install -r requirements_test_min.txt
pip install -e .

این کار تضمین می‌کند که محیط آزمایشی شما مشابه محیط آزمایشی Pylint در GitHub باشد.

اختیاری (زیرا در صورت باز کردن یک درخواست ادغام، اصلاح خودکار وجود دارد): ما قلاب‌های پیش از کامیت (pre-commit hooks) داریم که قالب‌بندی خودکار را پیش از هر کامیت برای شما انجام می‌دهند. برای فعال‌سازی آن، دستور pre-commit install را در پوشه ریشه pylint اجرا کنید..SS نصب Astroid

اگر در حال آزمایش تغییرات جدید در astroid هستید، باید astroid را نیز از https://github.com/pylint-dev/astroid کلون کرده و آن را در کنار pylint به‌صورت قابل ویرایش (editable) به این شیوه نصب کنید:

# فرض کنید در دایرکتوری pylint هستید
git clone https://github.com/pylint-dev/astroid.git
python3 -m pip install -e astroid/

اکنون در pylint از نسخه محلی astroid استفاده می‌کنید و می‌توانید نسخه آن را با git کنترل کنید، برای مثال:

cd astroid/
git switch my-astroid-dev-branch

از آنجا که برای اجرای آزمون‌ها از pytest استفاده می‌کنیم، خودتان نیز می‌توانید آن را به‌صورت مستقل اجرا کنید. با این حال توصیه می‌کنیم از دستور tox استفاده کنید:

pytest tests/ -k test_functional

می‌توانید مستقیماً از pytest استفاده کنید. اگر می‌خواهید با pytest و نسخه محلی python خود، آزمون‌ها را روی بخش خاصی از کد اجرا کنید:

python3 -m pytest

تمام موارد موجود در tests/message همراه با پوشش کد (coverage) برای کد مربوطه (نیازمند pytest-cov https://pypi.org/project/pytest-cov):

python3 -m pytest tests/message/ --cov=pylint.message
coverage html

فقط آزمون عملکردی "missing_kwoa_py3":

python3 -m pytest "tests/test_functional.py::test_functional[missing_kwoa_py3]"

همچنین می‌توانید به‌صورت اختیاری tox را نصب کرده و آزمون‌ها را با استفاده از بسته tox اجرا کنید، مانند:

python -m tox
python -m tox -epy313 # فقط برای مجموعه Python 3.13
python -m tox -epylint # برای اجرای Pylint روی کد منبع Pylint
python -m tox -eformatting # برای اجرای بررسی‌های قالب‌بندی روی کد منبع Pylint

معمولاً ایده خوبی است که tox را با گزینه --recreate اجرا کنید. این پرچم به tox دستور می‌دهد که قبل از اجرای آزمون‌ها، تمام وابستگی‌ها را دوباره بارگیری کند. این امر زمانی می‌تواند مهم باشد که نسخه جدیدی از astroid https://github.com/pylint-dev/astroid یا هر یک از وابستگی‌های دیگر منتشر شده باشد:

python -m tox --recreate # کل محیط tox دوباره ایجاد خواهد شد
python -m tox --recreate -e py310 # محیط tox مربوط به python 3.10 دوباره ایجاد خواهد شد

برای اجرای تنها یک مجموعه‌آزمون خاص، از یک الگو برای نام فایل آزمون (بدون پسوند .py) استفاده کنید، مانند:

python -m tox -e py310 -- -k test_functional
python -m tox -e py310 -- -k  \*func\*
python -m tox --recreate -e py310 -- -k test_functional # همراه با بازسازی محیط

برنامه Pylint همچنین از آنچه ما آزمون‌های primer می‌نامیم استفاده می‌کند. این‌ها آزمون‌هایی هستند که به صورت خودکار در یکپارچه‌سازی مداوم (Continuous Integration) ما اجرا می‌شوند و بررسی می‌کنند که آیا تغییرات در Pylint منجر به کرش یا خطاهای مهلک در stdlib می‌شود یا خیر، و همچنین با ارسال diff در مقایسه با خروجی فعلی pylint به صورت یک یادداشت (comment)، تأثیر یک pull request را بر تحلیل کدهای (linting) مجموعه‌ای از مخازن خارجی ارزیابی می‌کنند.

برای اجرای آزمون primer برای stdlib، که تنها کرش‌ها و خطاهای مهلک را بررسی می‌کند، می‌توانید گزینه --primer-stdlib را به دستور pytest اضافه کنید. به عنوان مثال:

pytest -m primer_stdlib --primer-stdlib

برای تولید خروجی ایجاد شده در یکپارچه‌سازی مداوم جهت بررسی linting مخازن خارجی، این دستورها را اجرا کنید:

python tests/primer/__main__.py prepare --clone
python tests/primer/__main__.py run --type=pr

برای شبیه‌سازی کامل فرآیند در یکپارچه‌سازی مداوم، سپس باید شاخه main را checkout کرده و این دستورها را اجرا نمایید:

python tests/primer/__main__.py run --type=main
python tests/primer/__main__.py compare

فهرست مخازن بر اساس سه معیار ایجاد شده است: ۱) پروژه‌ها باید از طیف متنوعی از ویژگی‌های زبان استفاده کنند، ۲) پروژه‌ها باید به خوبی نگهداری شوند و ۳) پروژه‌ها نباید پایه‌کدی بیش از حد تکراری داشته باشند. این امر تعادل مناسبی را بین سرعت CI ما و یافتن باگ‌های بالقوه تضمین می‌کند.

می‌توانید آخرین فهرست مخازن و هر کد مرتبط با این آزمون‌ها را در دایرکتوری tests/primer پیدا کنید.

برنامه Pylint از سه نوع آزمون استفاده می‌کند: آزمون‌های واحد (unittests)، آزمون‌های عملکردی (functional tests) و آزمون‌های primer.

  • آزمون‌های واحد (unittests) را می‌توان در pylint/tests یافت. مگر اینکه روی بخش‌های درونی pylint کار کنید، احتمالاً نیازی به نوشتن آن‌ها نخواهید داشت.
  • آزمون‌های عملکردی سراسری (Global functional tests) در pylint/tests/functional قرار دارند. آن‌ها عمدتاً برای آزمایش این که آیا Pylint پیام‌های درستی صادر می‌کند یا خیر به کار می‌روند.
  • آزمون‌های عملکردی پیکربندی را می‌توان در pylint/tests/config/functional یافت. آن‌ها برای آزمایش نحوه بارگذاری پیکربندی Pylint استفاده می‌شوند.
  • در آزمون‌های primer <#primer-tests> می‌توانید یک مخزن خارجی جدید را برای بررسی پیشنهاد دهید، اما در بیشتر مواقع کاری برای انجام دادن وجود ندارد.

بیشتر آزمون‌های دیگر در دایرکتوری '/pylint/test' قرار دارند. این آزمون‌های واحد را می‌توان برای آزمایش تقریباً تمام قابلیت‌های درون Pylint استفاده کرد. یک گام مناسب پیش از نوشتن هر آزمون واحد جدید، نگاه کردن به آزمون‌هایی است که کارکرد مشابهی را آزمایش می‌کنند. این کار اغلب می‌تواند به نوشتن آزمون‌های جدید کمک کند.

اگر آزمون جدید شما به هرگونه فایل اضافی نیاز دارد، می‌توانید آن‌ها را در دایرکتوری /pylint/test/regrtest_data قرار دهید. این دایرکتوری محلی است که ما برای ذخیره داده‌های مورد نیاز برای آزمون‌های واحد استفاده می‌کنیم.

این آزمون‌ها در /pylint/test/functional قرار دارند و از چندین بخش تشکیل شده‌اند. ابتدا، هر فایل پایتون به عنوان یک مورد آزمون (test case) در نظر گرفته می‌شود و باید با یک فایل .txt با همان نام همراه باشد. فایل .txt حاوی پیام‌های pylint است که انتظار می‌رود توسط فایل آزمون مربوطه صادر شوند.

در فایل آزمون .py شما، هر خطی که قرار است Pylint برای آن پیامی صادر کند، باید با یک کامنت مطابق با الگوی # [message_symbol] نشانه‌گذاری شود، مانند:

a, b, c = 1 # [unbalanced-tuple-unpacking]

اگر چندین پیام برای یک خط مورد انتظار باشد، می‌توان از این نحو استفاده کرد:

a, b, c = 1.test # [unbalanced-tuple-unpacking, no-member]

همچنین می‌توانید برای مدیریت موارد خاص از # +n: [ استفاده کنید که در آن n یک عدد صحیح است؛ برای مثال در مواردی که نحو معمولی بالا خط را بیش از حد طولانی می‌کند:

A = 5
# +1: [singleton-comparison]
B = A == None  # The test will look for the `singleton-comparison` message in this line

اگر به کنترل ویژه‌ای روی پیکربندی Pylint نیاز دارید، می‌توانید یک فایل .rc نیز ایجاد کنید که می‌تواند بخش‌هایی از پیکربندی Pylint را تنظیم کند. فایل .rc همچنین می‌تواند شامل بخشی به نام [testoptions] برای ارسال گزینه‌ها به اجراکننده آزمون عملکردی باشد. در حال حاضر گزینه‌های زیر پشتیبانی می‌شوند:

  • "min_pyver": حداقل نسخه پایتون مورد نیاز برای اجرای آزمون
  • "max_pyver": نسخه پایتونی که از آن به بعد آزمون اجرا نخواهد شد. اگر آخرین نسخه پشتیبانی‌شده 3.9 است، این تنظیم باید روی 3.10 قرار گیرد.
  • "min_pyver_end_position": حداقل نسخه پایتون مورد نیاز برای بررسی ویژگی‌های end_line و end_column پیام
  • "requires": بسته‌هایی که نصب محلی آن‌ها برای اجرای آزمون الزامی است
  • "except_implementations": فهرستی از پیاده‌سازی‌های پایتون که آزمون نباید روی آن‌ها اجرا شود
  • "exclude_platforms": فهرستی از سیستم‌های عاملی که آزمون نباید روی آن‌ها اجرا شود

خروجی متفاوت برای نسخه‌های مختلف پایتون

گاهی اوقات نتیجه linting می‌تواند بین نسخه‌های مختلف پایتون تغییر کند. در این موارد، خطاها را می‌توان به عنوان شرطی علامت‌گذاری کرد. عملگرهای پشتیبانی‌شده عبارتند از <، <=، > و >=.

def some_func() -> X:  # <3.14:[undefined-variable]
  ...
# It can also be combined with offsets
# +1:<3.14:[undefined-variable]
def some_other_func() -> X:
  ...
class X: ...

از آنجا که پیام‌های خروجی متفاوت هستند، افزودن دو فایل جداگانه برای آن الزامی است. ابتدا فایل <test-file-name>.314.txt، که شامل پیام‌های خروجی برای >=3.14 خواهد بود، یعنی در اینجا باید خالی باشد. دوم فایل <test-file-name>.txt، که پیش‌فرض برای سایر نسخه‌های پایتون خواهد بود.

نکته:

این قابلیت تنها زمانی کار می‌کند که خود کد در تمام نسخه‌های پایتون مورد آزمایش، قابل تجزیه (parsable) باشد. برای نحوهای جدید (new syntax)، به جای آن از min_pyver / max_pyver استفاده کنید.

محل قرارگیری فایل‌های آزمون عملکردی

برای بررسی‌کننده‌های موجود، موارد آزمون جدید ترجیحاً باید به فایل آزمون موجود ضمیمه شوند. برای بررسی‌کننده‌های جدید، باید یک فایل جدید به نام new_checker_message.py ایجاد شود (به استفاده از زیرخط‌ها توجه کنید). سپس این فایل باید در زیردایرکتوری test/functional/n قرار گیرد.

چند نکته دیگر:

  • اگر بررسی‌کننده بخشی از یک افزونه است، آزمون باید در test/functional/ext/extension_name قرار گیرد
  • اگر آزمون یک آزمون رگرسیون (regression test) است، باید در test/r/regression یا test/r/regression_02 قرار گیرد. نام فایل باید با regression_ شروع شود.
  • برای برخی از زیردایرکتوری‌ها، مانند test/functional/u، زیردایرکتوری‌های دیگری نیز وجود دارد (test/functional/u/use). لطفاً بررسی کنید که آیا فایل آزمون شما باید در یکی از این دایرکتوری‌ها قرار گیرد یا خیر. اگر نام زیردایرکتوری با کلمه قبل از اولین زیرخط در نام فایل آزمون شما مطابقت داشته باشد، باید در آنجا قرار داده شود. ساختار پوشه‌ها هنگام اجرای مجموعه آزمون الزامی است، بنابراین ممکن است هدایت شوید تا فایل را در زیردایرکتوری دیگری قرار دهید.

    اجرا و به‌روزرسانی آزمون‌های کارکردی

    در طول توسعه، گاهی مفید است که برای دریافت بازخورد سریع‌تر، تمام آزمون‌های کارکردی را در محیط فعلی خود اجرا کنید. این دستور را از دایرکتوری ریشه Pylint اجرا کنید:

python tests/test_functional.py

می‌توانید از تمام گزینه‌هایی که برای pytest https://docs.pytest.org/en/latest استفاده می‌کنید بهره ببرید، برای مثال -k "test_functional[len_checks]". علاوه بر این، در صورت نیاز می‌توان فایل txt. حاوی پیام‌های مورد انتظار را بر اساس خروجی فعلی با الحاق --update-functional-output به خط فرمان بازتولید کرد:

python tests/test_functional.py --update-functional-output -k "test_functional[len_checks]"

برای آزمایش روش‌های مختلف پیکربندی Pylint، یک چارچوب آزمون کارکردی کوچک نیز برای فایل‌های پیکربندی وجود دارد. این آزمون‌ها را می‌توان در دایرکتوری '/pylint/test/config' یافت.

برای ایجاد یک آزمون جدید، یک فایل جدید با نامی استفاده‌نشده در دایرکتوری مربوط به آن نوع فایل پیکربندی ایجاد کنید. سپس یک فایل filename.result.json اضافه کنید که در آن 'filename' هم‌نام فایل پیکربندی شما باشد. این فایل باید ثبت کند که پیکربندی در مقایسه با پیکربندی استاندارد چگونه باید باشد.

برای مثال، اگر پیکربندی باید یک هشدار را به فهرست پیام‌های غیرفعال‌شده اضافه کند و شما پیکربندی job را به جای مقدار پیش‌فرض ۱ روی ۱۰ تنظیم کرده‌اید، فایل .json باید شامل موارد زیر باشد:

"functional_append": {
    "disable": [["a-message-to-be-added"],]
}
"jobs": 10,

مشابهاً اگر پیامی باید حذف شود، می‌توانید عبارت زیر را به فایل .json اضافه کنید:

"functional_remove": {
    "disable": [["a-message-to-be-removed"],]
}

اگر پیکربندی نادرست باشد و باید منجر به از کار افتادن (crash) یا انتشار هشدار شود، می‌توانید این موضوع را با افزودن یک فایل .out مشخص کنید. این فایل باید نامی با الگوی name_of_configuration_testfile.error_code.out داشته باشد. بنابراین، اگر آزمون شما bad_configuration.toml نام دارد و باید با کد خروج ۲ پایان یابد، فایل .out باید bad_configuration.2.out نام‌گذاری شود. محتوای فایل .out باید الگویی شبیه به خروجی عادی Pylint داشته باشد. توجه داشته باشید که نام ماژول باید {abspath} و نام فایل باید {relpath} باشد.

برای تحلیل کارایی Pylint پیشنهاد می‌کنیم از ماژول cProfile از stdlib استفاده کنید. این ماژول در کنار ماژول pstats تمامی ابزارهای لازم برای پروفایل‌سازی یک اجرای Pylint و مشاهده مدت زمان اجرای هر تابع را در اختیارتان قرار می‌دهد.

مستندات هر دو ماژول در cProfile https://docs.python.org/3/library/profile.html در دسترس است.

برای پروفایل‌سازی اجرای Pylint روی خودش، می‌توانید از کد زیر استفاده کرده و آن را از دایرکتوری اصلی اجرا کنید. توجه داشته باشید که cProfile سندی به نام stats ایجاد می‌کند که سپس توسط pstats خوانده می‌شود. خروجی خوانا برای انسان توسط pstats در ./profiler_stats ذخیره خواهد شد. این خروجی بر اساس زمان تجمعی (cumulative time) مرتب خواهد شد:

import cProfile
import pstats
import sys
sys.argv = ["pylint", "pylint"]
cProfile.run("from pylint import __main__", "stats")
with open("profiler_stats", "w", encoding="utf-8") as file:
    stats = pstats.Stats("stats", stream=file)
    stats.sort_stats("cumtime")
    stats.print_stats()

همچنین می‌توانید با مرتب‌سازی یا محدود کردن خروجی، با شیء stats کار کنید. به عنوان مثال، برای چاپ توابع فقط از ماژول pylint و مرتب‌سازی بر اساس زمان تجمعی می‌توانید از دستور زیر استفاده کنید:

import cProfile
import pstats
import sys
sys.argv = ["pylint", "pylint"]
cProfile.run("from pylint import __main__", "stats")
with open("profiler_stats", "w", encoding="utf-8") as file:
    stats = pstats.Stats("stats", stream=file)
    stats.sort_stats("cumtime")
    stats.print_stats("pylint/pylint")

در نهایت، برای پروفایل‌سازی یک اجرا روی ماژول یا کد اختصاصی خود، می‌توانید از کد زیر استفاده کنید:

import cProfile
import pstats
import sys
sys.argv = ["pylint", "your_dir/your_file"]
cProfile.run("from pylint import __main__", "stats")
with open("profiler_stats", "w", encoding="utf-8") as file:
    stats = pstats.Stats("stats", stream=file)
    stats.sort_stats("cumtime")
    stats.print_stats()

مستندات ماژول pstats سایر قابلیت‌ها را برای تعامل با خروجی پروفایل‌سازی بررسی می‌کند..SS تحلیل کارایی یک بررسی‌کننده مشخص

برای تحلیل کارایی یک بررسی‌کننده (checker) مشخص در Pylint می‌توانیم از خروجی خوانا برای انسان که توسط pstats تولید شده است استفاده کنیم.

اگر در فایل profiler_stats نام فایل بررسی‌کننده را جستجو کنید، تمام فراخوانی‌های توابع درون آن بررسی‌کننده را خواهید یافت. فرض کنید می‌خواهیم متد visit_importfrom از بررسی‌کننده variables را بررسی کنیم:

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
622    0.006    0.000    8.039    0.013 /MY_PROGRAMMING_DIR/pylint/pylint/checkers/variables.py:1445(visit_importfrom)

خط قبلی به ما می‌گوید که این متد در طول پروفایل‌گیری ۶۲۲ بار فراخوانی شده و در مجموع ۶ میلی‌ثانیه درون خود تابع بوده‌ایم. زمان به ازای هر فراخوانی کمتر از یک میلی‌ثانیه است (0.006 / 622) و بنابراین 0 نمایش داده شده است.

اغلب زمان تجمعی (به ازای هر فراخوانی) برای شما جالب‌تر است. این مورد به زمان صرف‌شده درون تابع و هر یک از توابعی که توسط آن فراخوانی شده‌اند یا توابعی که آن‌ها فراخوانی کرده‌اند (و غیره) اشاره دارد. در مثال ما، اجرای متد visit_importfrom و تمام توابع فرزند آن کمی بیش از ۸ ثانیه طول کشیده است، با زمان اجرای 0.013 میلی‌ثانیه به ازای هر فراخوانی.

همچنین می‌توانید profiler_stats را برای یک تابع مشخص که می‌خواهید ارزیابی کنید جستجو نمایید. برای مثال _analyse_fallback_blocks، تابعی که توسط visit_importfrom در بررسی‌کننده variables فراخوانی می‌شود. این امر امکان تحلیل دقیق‌تر توابع مشخص را فراهم می‌کند:

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
1    0.000    0.000    0.000    0.000 /MY_PROGRAMMING_DIR/pylint/pylint/checkers/variables.py:1511(_analyse_fallback_blocks)

اغلب ممکن است بخواهید یک نمایش بصری از آمارهای پروفایل‌گیری خود ایجاد کنید. ابزاری مناسب برای این کار gprof2dot https://github.com/jrfonseca/gprof2dot است. این ابزار می‌تواند یک فایل .dot از آمارهای پروفایل‌گیری ایجادشده توسط cProfile و pstats بسازد. سپس می‌توانید فایل .dot را با یکی از چندین مبدل موجود به‌صورت آنلاین، به یک فایل .png تبدیل کنید.

می‌توانید مستندات gprof2dot https://github.com/jrfonseca/gprof2dot را برای دستورالعمل‌های نصب متناسب با محیط خاص خود مطالعه کنید.

گزینه دیگر snakeviz https://jiffyclub.github.io/snakeviz خواهد بود.

سرویس OSS-Fuzz https://google.github.io/oss-fuzz پلتفرم فازینگ رایگان گوگل برای نرم‌افزارهای متن‌باز است. این ابزار هدف‌های فازینگ astroid را اجرا می‌کند تا به شناسایی مشکلات پایداری که می‌توانند astroid و Pylint را تحت تأثیر قرار دهند کمک کند.

گوگل گزارش‌های ساخت عمومی https://oss-fuzz-build-logs.storage.googleapis.com/index.html#astroid و آمارهای فازینگ https://introspector.oss-fuzz.com/project-profile?project=astroid را ارائه می‌دهد، اما بیشتر جزئیات مربوط به گزارش‌های باگ و موارد آزمون فازینگ‌شده نیازمند دسترسی تأییدشده هستند.

فایل‌های پیکربندی یکپارچه‌سازی با OSS-Fuzz را می‌توان در مخزن OSS-Fuzz https://github.com/google/oss-fuzz/tree/master/projects/astroid پیدا کرد. فایل project.yaml تعیین می‌کند چه کسانی به گزارش‌های باگ و موارد آزمون دسترسی دارند. اگر مایلید به این فهرست اضافه شوید به نگه‌دارنده‌ها پیام دهید (توجه: برای دسترسی، داشتن یک حساب گوگل الزامی است).

پس از دریافت دسترسی به OSS-Fuzz، می‌توانید با حساب گوگل خود به https://oss-fuzz.com وارد شوید تا داشبورد پیشرفت فازینگ astroid را مشاهده کنید.

این داشبورد حاوی پیوندی به صفحه موارد آزمون <https://oss-fuzz.com/testcases?project=astroid&open=yes> است که تمام مواردی را که در حال حاضر باعث بروز باگ در astroid می‌شوند فهرست می‌کند.

هر مورد آزمون دارای صفحه‌ای اختصاصی با پیوندهایی برای مشاهده و بارگیری مورد آزمون کمینه‌شده جهت بازتولید شکست است. هر صفحه مورد آزمون همچنین حاوی یک stacktrace برای شکست رخ‌داده و آماری در مورد میزان تکرار مواجهه با آن شکست در حین فازینگ است.

شما می‌توانید یک مورد آزمون کمینه‌شده را دریافت کرده و آن را به‌صورت محلی اجرا کنید تا یک شکست را روی سیستم خود اشکال‌زدایی نمایید. برای مثال، برای بازتولید یک شکست با هدف فازینگ fuzz_parse، می‌توانید دستورهای زیر را اجرا کنید:

mkdir fuzzing-repro
cd fuzzing-repro
# Note: Atheris doesn't support Python 3.12+ yet:
# https://github.com/google/atheris/issues/82
uv venv --python 3.11
source .venv/bin/activate
git clone https://github.com/pylint-dev/astroid.git
cd astroid
uv pip install atheris==2.3.0
uv pip install --editable .
# Save the minimized testcase as `minimized.py` in the astroid directory
cat << EOF > ./run_fuzz_parse.py
import astroid
import atheris
with open('minimized.py', 'rb') as f:
    fdp = atheris.FuzzedDataProvider(f.read())
code = fdp.ConsumeUnicodeNoSurrogates(fdp.ConsumeIntInRange(0, 4096))
astroid.builder.parse(code)
EOF
python ./run_fuzz_parse.py

اگر شکست به‌صورت محلی بازتولید نشد، می‌توانید بازتولید مشکل را درون یک کانتینر OSS-Fuzz امتحان کنید:

git clone https://github.com/google/oss-fuzz.git
cd oss-fuzz
python infra/helper.py build_image astroid
python infra/helper.py build_fuzzers astroid
python infra/helper.py reproduce astroid fuzz_parse minimized.py

برخی از شکست‌ها ممکن است به دلیل تفاوت در نسخه‌های پایتون بین پلتفرم OSS-Fuzz و محیط محلی شما، تنها در یک کانتینر OSS-Fuzz قابل بازتولید باشند..SS "پوشش کد (Code coverage)"

داشبورد همچنین به داده‌های پوشش کد برای اهداف فازینگ (fuzz targets) منفرد و داده‌های ترکیبی پوشش کد برای تمام اهداف پیوند دارد (برای مشاهدهٔ داده‌های ترکیبی روی پیوند "TOTAL COVERAGE" کلیک کنید).

داده‌های پوشش ترکیبی برای شناسایی شکاف‌های پوشش، داده‌های ناکافی مجموعه‌داده (corpus) و نامزدهای بالقوه برای اهداف فازینگ آینده مفید است.

گزارش‌های باگ برای خرابی‌های جدید به‌طور خودکار در ردیاب باگ OSS-Fuzz با برچسب astroid ثبت می‌شوند https://issues.oss-fuzz.com/issues?q=project:astroid%20status:open. اطمینان حاصل کنید که برای مشاهدهٔ تمام مسائل (issues) موجود، وارد سیستم شده‌اید.

گوگل اهداف فازینگ کامپایل‌شده را روی ماشین‌های مجازی Google Compute Engine اجرا می‌کند. این معماری نیازمند این است که هر پروژه یک Dockerfile و اسکریپت build.sh برای دانلود کد، پیکربندی وابستگی‌ها، کامپایل اهداف فازینگ و بسته‌بندی فایل‌های corpus ارائه دهد.

فایل‌های ساخت و کد اهداف فازینگ مربوط به astroid را می‌توان در مخزن OSS-Fuzz یافت https://github.com/google/oss-fuzz/blob/master/projects/astroid.

اگر وابستگی‌ها تغییر کنند یا اهداف فازینگ جدیدی اضافه شوند، ممکن است لازم باشد فایل‌های ساخت را تغییر دهید و یک ایمیج Docker جدید برای OSS-Fuzz بسازید.

دستورهای زیر را برای ساخت ایمیج OSS-Fuzz و اهداف فازینگ astroid اجرا کنید:

git clone https://github.com/google/oss-fuzz.git
cd oss-fuzz
python infra/helper.py build_image astroid
python infra/helper.py build_fuzzers astroid

هرگونه تغییری که در فایل‌های ساخت ایجاد می‌کنید باید در قالب pull request به مخزن OSS-Fuzz ارسال شود.

می‌توانید شکست‌های ساخت در مرحلهٔ build_fuzzers را با ایجاد یک کانتینر و اجرای دستی دستور compile اشکال‌زدایی کنید:

# Create a container for building fuzz targets
python infra/helper.py shell astroid
# Run this command inside the container to build the fuzz targets
compile

اسکریپت build.sh در مسیر /src/build.sh داخل کانتینر قرار خواهد داشت.

خب، می‌خواهید نسخهٔ X.Y.Z از pylint را منتشر کنید؟

پیش از انتشار یک نسخه اصلی یا فرعی، بررسی کنید آیا کامیت‌های منتشرنشده‌ای در شاخهٔ نگهداری (maintenance) وجود دارد یا خیر. اگر چنین است، ابتدا یک آخرین نسخهٔ وصله (patch) را منتشر کنید. ببینید: ``Releasing a patch version``.

  • بخش Summary -- Release highlights را در doc/whatsnew بنویسید و تاریخ انتشار را ارتقا دهید.
  • وابستگی‌های انتشار را نصب کنید: pip3 install -r requirements_test.txt. این دستور نسخهٔ دقیق astroid مورد استفاده توسط CI را تثبیت می‌کند (به requirements_test_min.txt مراجعه کنید). پیش از اجرای tbump اطمینان حاصل کنید که همین نسخهٔ تثبیت‌شده نصب است: یک نسخهٔ متفاوت از astroid خروجی متفاوتی در آزمون‌های عملکردی تولید می‌کند که سپس در انتشار ثبت (commit) شده و CI را از کار می‌اندازد.
  • نسخه را ارتقا داده و با استفاده از دستور زیر منتشر کنید: tbump X.Y.0 --no-push --no-tag. (به عنوان مثال: tbump 2.4.0 --no-push --no-tag)
  • کامیت ایجادشده را با git show بررسی کرده و در صورت نیاز آن را اصلاح (amend) کنید.
  • شاخهٔ main را با tbump به یک نسخهٔ توسعه (dev) انتقال دهید:
tbump X.Y+1.0-dev0 --no-tag --no-push  # You can interrupt after the first step
git commit -am "Upgrade the version to x.y+1.0-dev0 following x.y.0 release"

به عنوان مثال:

tbump 2.5.0-dev0 --no-tag --no-push
git commit -am "Upgrade the version to 2.5.0-dev0 following 2.4.0 release"
  • دستور tbump یک سند جدید What's new in Pylint X.Y+1 ایجاد خواهد کرد. آن را به doc/whatsnew/3/index.rst اضافه کنید. نگاهی به مثال‌های موجود در doc/whatsnew بیندازید. آن را با git commit -a --amend ثبت (commit) کنید.
  • به یک شاخهٔ انتشار push کنید.
  • یک درخواست ادغام (merge request) با دو کامیت باز کنید (هیچ‌کس نمی‌تواند مستقیماً روی main ارسال (push) انجام دهد)
  • پس از ادغام، کامیت‌های ادغام‌شده را روی main دریافت کرده و اولین کامیت را (نسخه باید X.Y.Z باشد) به عنوان vX.Y.Z برچسب‌گذاری (tag) کنید (برای مثال: v2.4.0)
  • تگ را push کنید.
  • نسخه را در GitHub با همان نام تگ منتشر کنید و لاگ تغییرات (changelog) مناسب را در توضیحات کپی و جای‌گذاری نمایید. این کار انتشار PyPI را راه‌اندازی (trigger) می‌کند.
  • یک شاخهٔ maintenance/X.Y.x ایجاد کنید (برای مثال: maintenance/2.4.x از تگ v2.4.0).
  • الگوی شاخه‌های محافظت‌شده را در تنظیمات زیر Branches / Branch protection rules به‌روز کنید. (برای مثال: maintenance/2.4* به جای maintenance/2.3*). پیکربندی‌های زیادی در این تنظیمات انجام شده است، آن‌ها را از ابتدا دوباره ایجاد نکنید.
  • شاخهٔ maintenance/X.Y-1.x را حذف کنید. (برای مثال: maintenance/2.3.x)
  • تمام مسائل (issues) بسته‌شدهٔ دارای برچسب backport maintenance/X.Y-1.x را انتخاب کرده و به آن‌ها برچسب backported بزنید، سپس برچسب backport maintenance/X.Y-1.x را به backport maintenance/X.Y.x تغییر نام دهید (برای مثال تغییر نام backport maintenance/2.3.x به backport maintenance/2.4.x)
  • نقطهٔ عطف (milestone) فعلی را ببندید و موارد جدید را ایجاد کنید (برای مثال: بستن 2.4.0، ایجاد 2.4.1 و 2.6.0)
  • تمام نسخه‌های وصله را برای انتشار فرعی پیشین در readthedocs https://readthedocs.org/projects/pylint/versions به جز آخرین مورد پنهان و غیرفعال کنید. (برای مثال: پنهان کردن v2.4.0، v2.4.1، v2.4.2 و تنها نگه‌داشتن v2.4.3)

    هر زمان که یک PR روی main باید در یک انتشار وصله (patch release) روی شاخه نگهداری کنونی منتشر شود:

  • به PR برچسب backport maintenance/X.Y-1.x بزنید. (برای مثال backport maintenance/2.3.x)
  • پیش از ادغام، PR را squash کنید (یا در صورتی که فقط یک کامیت وجود دارد، rebase کنید)
  • (اگر cherry-pick خودکار دارای تداخل بود)
  • برچسب Needs backport را اضافه کرده و آن را دستی انجام دهید.
  • همچنین می‌توانید به عنوان گزینه جایگزین:
  • پیش از انجام دستی cherry-pick مربوط به PR اصلی، تغییراتی را که موجب تداخل شده‌اند (در صورتی که ویژگی جدیدی نیستند) cherry-pick کنید.
  • تصمیم بگیرید که برای انتشار PR تا نسخه فرعی (minor) بعدی صبر کنید
  • در هر صورت، milestoneهای PR اصلی و PR تازه cherry-pick شده را متناسب با واقعیت به‌روزرسانی کنید.
•
یک نسخه وصله (patch version) منتشر کنید

زمانی نسخه‌های وصله را منتشر می‌کنیم که یک خرابی (crash) یا باگ در شاخه اصلی برطرف شده و به شاخه نگهداری cherry-pick شده باشد.

  • وابستگی‌های انتشار را نصب کنید: pip3 install -r requirements_test.txt. این کار دقیقاً نسخه astroid مورد استفاده توسط CI را تثبیت (pin) می‌کند (نگاه کنید به requirements_test_min.txt). پیش از اجرای tbump مطمئن شوید این نسخه تثبیت‌شده همان نسخه‌ای است که نصب شده: یک نسخه متفاوت از astroid خروجی‌های متفاوتی در آزمون‌های کارکردی تولید می‌کند که سپس در انتشار کامیت شده و CI را دچار شکست می‌کند.
  • نسخه را با استفاده از tbump X.Y-1.Z --no-push ارتقا داده و منتشر کنید. (برای مثال: tbump 2.3.5 --no-push)
  • نتیجه را به صورت بصری با git show بررسی کنید.
  • یک درخواست ادغام از release-X.Y-1.Z' در maintenance/X.Y.x (برای مثال: release-2.3.5-branch در maintenance/2.3.x) باز کنید تا آزمون‌های CI برای این شاخه اجرا شوند.
  • تگ را ایجاد کرده و push کنید.
  • نسخه را با همان نام تگ در GitHub منتشر کرده و changelog را از مستندات تولیدشده توسط ReadtheDoc از پایپ‌لاین pull request در توضیحات کپی و جای‌گذاری کنید. این کار انتشار PyPI را آغاز می‌کند.
  • شاخه maintenance/X.Y.x را روی شاخه اصلی ادغام کنید. شاخه اصلی باید حاوی changelog برای X.Y-1.Z+1 باشد (برای مثال v2.3.6). این ادغام لازم است تا pre-commit autoupdate برای pylint کار کند.
  • تداخل‌های نسخه را به درستی برطرف کنید، یا پیش از push کردن روی شاخه اصلی، نسخه را به X.Y.0-devZ (برای مثال: 2.4.0-dev6) ارتقا دهید
  • نقطه عطف (milestone) کنونی را ببندید و یک مورد جدید ایجاد کنید (برای مثال: بستن 2.3.5، ایجاد 2.3.6)

مواردی (issues) را که انجام نشده‌اند به milestone بعدی منتقل می‌کنیم و تنها در صورتی انتشار را متوقف (block) می‌کنیم که issueهای بازی با برچسب blocker وجود داشته باشند.

  • منشور اخلاقی را رعایت کنید
  • پیش از درخواست کمک، خودتان جستجو کنید
  • یک issue باز کنید
  • یک issue را بررسی کرده و یافته‌های خود را گزارش دهید
  • اگر احساس می‌کنید تغییری مورد توافق همگان است، مستقیماً یک درخواست ادغام باز کنید

گزارش دادن یک باگ، خود به تنهایی به معنای مشارکت‌کننده بودن است..SS چگونه یک triager شویم؟

•
یک افزونه pylint ایجاد کنید، سپس آن را به سازمان گیت‌هاب 'pylint-dev' انتقال دهید.

یا:

  • در بیش از ۳ انتشار به‌طور مستمر مشارکت داشته باشید.
  • بیش از حد متعصب نباشید، از مرام‌نامه اخلاقی (code of conduct) بدون تحمیل بار روانی بر نگهدارندگان پیروی کنید. این بدان معنا نیست که اختلاف‌نظر ناممکن است، بلکه صرفاً استدلال‌ها باید فنی و منطقی باقی بمانند تا گفتگو محترمانه و سازنده باشد.
  • یکی از نگهدارندگان بدون آنکه خودتان درخواست کرده باشید، پیشنهاد دهد که triager شوید
  • تأیید به اتفاق آرا یا موافقت خنثی (بدون مخالفت) را از نگهدارندگان فعلی به دست آورید.

•
مسئولیت بخشی از کد را بر عهده بگیرید که در حال حاضر به خوبی نگهداری نمی‌شود یا خودتان شخصاً در آن مشارکت داشته‌اید (اگر احساس کنیم نمی‌توانیم چیزی را بدون بازبینی شما ادغام کنیم، به‌زودی قادر خواهید بود خودتان آن‌ها را ادغام کنید).

یا:

  • دو درخواست ادغام (merge request) بزرگِ کد را در طول چندین انتشار ارائه دهید (برای مثال یک checker در نسخه 2.13 و باگ متعاقب آن پس از انتشار، و یک رفع باگ پیچیده در 2.14). در غیر این صورت، مشارکت مستمر در بیش از ۳ انتشار همراه با مهارت‌های فنی و فردی عالی.
  • ارزیابی گزارش‌ها (triage) به مدت چندین ماه (بستن موارد تکراری، مرتب‌سازی مسائل، پاسخ به پرسش‌ها...).
  • یکی از مدیران (admin) بدون آنکه خودتان درخواست کرده باشید، پیشنهاد دهد که maintainer شوید
  • تأیید به اتفاق آرا یا موافقت خنثی را از نگهدارندگان فعلی به دست آورید.

  • با چندصد کامیت در یک دوره زمانی طولانی همراه با مهارت‌های ارتباطی عالی و کیفیت کد بالا مشارکت کنید.
  • نگهداری از pylint به مدت چندین سال (بازبینی کد، تریاژ و وظایف نگهداری).
  • در این مقطع، احتمالاً باید مدیر دیگری پروژه را ترک کرده باشد یا برای سال‌ها غیرفعال شده باشد.
  • یکی از مدیران بدون آنکه خودتان درخواست کرده باشید، پیشنهاد دهد که admin شوید.
  • تأیید به اتفاق آرا یا موافقت خنثی را از مدیران فعلی به دست آورید.

از همگان انتظار می‌رود از مرام‌نامه اخلاقی پیروی کنند. pylint یک عمل‌سالاری (do-ocracy) / مردم‌سالاری است. شما مجاز نیستید به صرف مشارکت زیاد، رفتار نامناسبی داشته باشید. اما اگر قرار نیست در آینده کارهای نگهداری را انجام دهید، ممکن است نظرات معتبر شما توسط کسانی که تحت تأثیر آن قرار می‌گیرند در نظر گرفته نشود.

عمومی:

  • ما درستی (صحت) را بر عملکرد ترجیح می‌دهیم، زیرا pylint در وهله اول به‌خاطر عملکردش استفاده نمی‌شود. کارایی همچنان مهم است و باید از همان آغاز مد نظر قرار گیرد.
  • سپس اگر دستیابی به درستی ناممکن باشد، منفی‌های کاذب را بر مثبت‌های کاذب ترجیح می‌دهیم.
  • ما تلاش می‌کنیم پیکربندی را معقول نگه داریم، اما اگر نیاز به اتخاذ تصمیم دشواری باشد، یک گزینه اضافه می‌کنیم تا pylint (پس از پیکربندی) با شرایط گوناگون سازگار شود (multiple sizes fit all).

مکان افزودن یک checker یا پیام جدید:

  • پیام‌های خطا (مواردی که در صورت اجرا منجر به خطا خواهند شد) باید بررسی‌های توکار (builtin) باشند که به‌طور پیش‌فرض فعال هستند
  • پیام‌هایی که حتی اندکی سلیقه‌ای (opinionated) هستند، باید اختیاری (opt-in) باشند (به عنوان افزونه اضافه شوند <#plugins>)
  • ما از بررسی‌های سلیقه‌ای (مانند while checker) رویگردان نیستیم، اما چیزی به نام «بیش از حد سلیقه‌ای» وجود دارد؛ اگر چیزی بیش از حد سلیقه‌ای باشد باید یک افزونه خارجی pylint باشد <#plugins>.

    هنگامی که درباره موضوعی توافق نظر وجود نداشته باشد، کاربران، نگه‌دارندگان و مدیران تا رسیدن به توافق گفتگو می‌کنند.

    بسته به دشواری گفتگو و اهمیت تصمیم‌گیری سریع، تصمیم می‌تواند به روش‌های زیر اتخاذ شود:

  • به‌صورت متفق‌القول میان شرکت‌کنندگان در گفتگو، مشارکت‌کنندگان و نگه‌دارندگان (ترجیحاً)
  • با نظرسنجی از شرکت‌کنندگان در گفتگو با استفاده از ایموجی در issue و سپس اعمال نظر اکثریت، در صورتی که هیچ نگه‌دارنده‌ای نظر سرسختانه‌ای در مورد موضوع نداشته باشد.
  • با نظر اکثریت مدیران، در صورتی که هیچ مدیری نظر سرسختانه‌ای در مورد موضوع نداشته باشد.
  • با نظرسنجی از همه کاربران در یک issue جدید که برای چندین ماه سنجاق (pin) خواهد شد، پیش از تصمیم‌گیری، در صورتی که دو مدیر نظرات متضاد و سرسختانه‌ای نسبت به موضوع داشته باشند. هنگامی که نتیجه مشخص شد، تصمیم اکثریت دیگر جای بحث نخواهد داشت.

pyreverse ابزاری قدرتمند است که از کدهای Python شما نمودارهای UML ایجاد می‌کند. این ابزار به شما در مصورسازی موارد زیر کمک می‌کند:

  • وابستگی‌ها و ساختار بسته‌ها
  • سلسله‌مراتب و روابط کلاس‌ها
  • سازمان‌دهی متدها و خصوصیات

pyreverse از چندین قالب خروجی پشتیبانی می‌کند:

•
قالب‌های بومی (Native):
  • .dot/.gv (Graphviz)
  • .puml/.plantuml (PlantUML)
  • .mmd/.html (MermaidJS)
•
قالب‌های اضافی (نیازمند نصب Graphviz):
  • تمامی قالب‌های خروجی Graphviz در https://graphviz.org/docs/outputs (مانند PNG، SVG، PDF و غیره)
  • pyreverse ابتدا یک فایل موقت .gv ایجاد می‌کند که سپس برای تولید تصویر نهایی به Graphviz ارسال می‌شود

راهنمای Usage <> را برای آگاهی از گزینه‌های موجود بررسی کنید، یا به Example Output <> برای مشاهده نمودارهای نمونه و موارد استفاده معمول مراجعه نمایید.

دستور pyreverse از طریق خط فرمان با نحو (syntax) زیر اجرا می‌شود:

pyreverse [options] <packages>

که در آن <packages> یک یا چند بسته یا ماژول Python برای تحلیل است.

گزینه‌های موجود در دسته‌بندی‌های زیر سازمان‌دهی شده‌اند:

  • فیلترسازی و محدوده - کنترل این‌که کدام کلاس‌ها و روابط در نمودارهای شما ظاهر شوند
  • گزینه‌های نمایش - سفارشی‌سازی ظاهر بصری شامل رنگ‌ها و برچسب‌ها
  • کنترل خروجی - انتخاب قالب‌های خروجی و تنظیم دایرکتوری مقصد
  • پیکربندی پروژه - تعیین تنظیمات پروژه مانند ریشه‌های سورس و فایل‌های نادیده‌گرفته‌شده

نمایش تمام نیاکان (اجداد) همهٔ کلاس‌ها در <projects>.

پیش‌فرض: None

نمایش تمام کلاس‌های مرتبط با کلاس‌های هدف، شامل وابستگی‌های غیرمستقیم.

پیش‌فرض: None

ایجاد یک نمودار کلاس با تمام کلاس‌های مرتبط با <class>؛ این گزینه به‌طور پیش‌فرض از گزینه‌های -ASmy استفاده می‌کند.

پیش‌فرض: None

فیلتر کردن ویژگی‌ها و توابع مطابق با <mode>. حالت‌های معتبر عبارتند از: 'PUB_ONLY' فیلتر کردن تمام ویژگی‌های غیرعمومی [پیش‌فرض]، معادل PRIVATE+SPECIAL 'ALL' بدون فیلتر 'SPECIAL' فیلتر کردن توابع خاص پایتون به جز سازنده (constructor) 'OTHER' فیلتر کردن ویژگی‌های محافظت‌شده و خصوصی

پیش‌فرض: PUB_ONLY

حداکثر عمق بسته‌ها/پیمانه‌ها برای گنجاندن در نمودار، نسبت به عمیق‌ترین بستهٔ مشخص‌شده. عمق ۰ تنها بسته‌ها/پیمانه‌های مشخص‌شده را نشان می‌دهد، در حالی که ۱ فرزندان بی‌واسطهٔ آن‌ها را در بر می‌گیرد و به همین ترتیب. هنگام مشخص کردن بسته‌های تو در تو، عمق از عمیق‌ترین سطح بسته محاسبه می‌شود. در صورت عدم تعیین، تمام بسته‌ها/پیمانه‌ها در سلسله‌مراتب نمایش داده می‌شوند.

پیش‌فرض: None

نمایش <ancestor> نسل از کلاس‌های نیا که در <projects> نیستند.

پیش‌فرض: None

نمایش <association_level> سطح از کلاس‌های مرتبط که در <projects> نیستند.

پیش‌فرض: None

گنجاندن اشیاء توکار (builtin) در نمایش کلاس‌ها.

پیش‌فرض: False

گنجاندن اشیاء کتابخانهٔ استاندارد در نمایش کلاس‌ها.

پیش‌فرض: False

فهرستی از رنگ‌ها جداشده با ویرگول برای رنگ‌آمیزی بر اساس عمق بسته.

پیش‌فرض: ('#77AADD', '#99DDFF', '#44BB99', '#BBCC33', '#AAAA00', '#EEDD88', '#EE8866', '#FFAABB', '#DDDDDD')

استفاده از خروجی رنگی. کلاس‌ها/پیمانه‌های متعلق به یک بسته رنگ یکسانی دریافت می‌کنند.

پیش‌فرض: False

استفاده از رنگ‌های جداگانه تا عمق بستهٔ <depth>. در اعماق بیشتر مجدداً از رنگ‌ها استفاده خواهد شد.

پیش‌فرض: 2

گنجاندن نام پیمانه در نمایش کلاس‌ها.

پیش‌فرض: None

تنها نمایش گره‌های دارای اتصال.

پیش‌فرض: False

عدم نمایش ویژگی‌ها و متدها در کادرهای کلاس؛ این گزینه مقادیر -f را غیرفعال می‌کند.

پیش‌فرض: False.SS کنترل خروجی (Output Control)

در صورت در دسترس بودن قالب، یک فایل خروجی *.<format> ایجاد می‌کند. قالب‌های در دسترس عبارتند از: .dot، .puml، .plantuml، .mmd، .html. برای هر قالب دیگری تلاش می‌شود با استفاده از ابزار خط فرمان 'dot' ایجاد گردد، که نیازمند نصب graphviz است. در این حالت، این قالب‌های اضافی در دسترس خواهند بود (ببینید: `قالب‌های خروجی Graphviz https://graphviz.org/docs/outputs`_).

پیش‌فرض: dot

مسیر دایرکتوری خروجی را تنظیم می‌کند.

پیش‌فرض: ""

فایل‌ها یا دایرکتوری‌هایی که باید نادیده گرفته شوند. این موارد باید نام پایه باشند، نه مسیر.

پیش‌فرض: ('CVS',)

نام پروژه را تعیین می‌کند. این نام بعداً به انتهای نام فایل‌های خروجی افزوده خواهد شد.

پیش‌فرض: ""

مسیرهایی را به فهرست ریشه‌های سورس (source roots) اضافه می‌کند. از الگوهای تطبیق (globbing) پشتیبانی می‌کند. ریشه سورس، یک مسیر مطلق یا مسیری نسبت به دایرکتوری کاری فعلی است که برای تعیین فضای نام بسته برای ماژول‌های مستقر ذیل ریشه سورس به کار می‌رود.

پیش‌فرض: ()

خروجی pyreverse را پرجزئیات‌تر (verbose) می‌کند. عمدتاً برای اشکال‌زدایی مفید است.

پیش‌فرض: False

نمودارهای نمونه تولیدشده با قالب خروجی .puml در زیر نشان داده شده‌اند.

[تصویر: نمودار بسته تولیدشده توسط pyreverse] [تصویر]

[تصویر: نمودار کلاس تولیدشده توسط pyreverse] [تصویر]

در بسیاری از موارد، ایجاد یک نمودار واحد که همه کلاس‌های موجود در پروژه را به تصویر بکشد، به نموداری غول‌پیکر و دشوار برای مدیریت منجر می‌شود. در حالی که محدود کردن مسیر ورودی به یک بسته یا ماژول منفرد می‌تواند تا حد زیادی به کوچک‌تر کردن دامنه کمک کند، گزینه -c روش دیگری برای ایجاد نمودار کلاس با تمرکز بر یک کلاس منفرد و وابستگی‌های همکار آن (collaborators) ارائه می‌دهد. برای مثال، اجرای:

pyreverse -ASmy -c pylint.checkers.classes.ClassChecker pylint

نمودارهای کامل کلاس و بسته را برای pylint تولید می‌کند، اما علاوه بر آن فایلی با نام pylint.checkers.classes.ClassChecker.dot را نیز ایجاد خواهد کرد: [تصویر: نمودار بسته تولیدشده توسط pyreverse] [تصویر]

اسکریپت کنسولی symilar بلوک‌های متنی کپی‌پیست‌شده را در مجموعه‌ای از فایل‌ها پیدا می‌کند. این ابزار یک رابط خط فرمان اختصاصی برای بررسی پیام duplicate-code ارائه می‌دهد.

می‌توان آن را به این صورت فراخوانی کرد:

symilar [-d|--duplicates min_duplicated_lines] [-i|--ignore-comments] [--ignore-docstrings] [--ignore-imports] [--ignore-signatures] file1...

تمامی فایل‌هایی که باید بررسی شوند، باید به صورت صریح مشخص گردند، مانند:

symilar foo.py, bar.py, subpackage/spam.py, subpackage/eggs.py

symilar خروجی‌ای مشابه زیر تولید می‌کند:

17 similar lines in 2 files
==tests/data/clientmodule_test.py:3
==tests/data/suppliermodule_test.py:12
  class Ancestor:
      """ Ancestor method """
      cls_member = DoNothing()
      def __init__(self, value):
          local_variable = 0
          self.attr = 'this method shouldn\'t have a docstring'
          self.__value = value
      def get_value(self):
          """ nice docstring ;-) """
          return self.__value
      def set_value(self, value):
          self.__value = value
          return 'this method shouldn\'t have a docstring'
TOTAL lines=58 duplicates=17 percent=29.31

این فهرست کامل تغییرات در نسخه‌های فرعی pylint 4.x بر اساس دسته‌بندی است.

:انتشار: 4.0 :تاریخ: 2025-10-12

  • اکنون Pylint از Python 3.14 پشتیبانی می‌کند.
  • موتور استنتاج Pylint (astroid) اکنون بسیار دقیق‌تر شده و مفهوم بولی ضمنی (implicit booleanness) و عبارت‌های سه‌تایی را درک می‌کند. (با تشکر از @zenlyj!)

این مثال را در نظر بگیرید:

class Result:
    errors: dict | None = None
result = Result()
if result.errors:
    result.errors[field_key]
    # inference engine understands result.errors cannot be None
    # pylint no longer raises unsubscriptable-object

نسخه مورد نیاز astroid اکنون 4.0.0 است. برای اطلاع از اصلاحات، ویژگی‌ها و بهبودهای عملکردی بیشتر که به pylint مربوط می‌شوند، تغییرات astroid را در https://pylint.readthedocs.io/projects/astroid/en/latest/changelog.html#what-s-new-in-astroid-4-0-0 ببینید.

•
رسیدگی به invalid-name در سطح ماژول ناقص بود. اکنون ثوابت سطح ماژول که مقداردهی مجدد می‌شوند به عنوان متغیر در نظر گرفته شده و به جای --const-rgx با --variable-rgx بررسی می‌شوند. لیست‌ها، مجموعه‌ها و اشیای سطح ماژول می‌توانند با هر یک از این دو regex تطابق یافته و تأیید شوند.

در اینجا، LIMIT دوباره مقداردهی شده است، بنابراین pylint فقط از --variable-rgx استفاده می‌کند:

LIMIT = 500  # [invalid-name]
if sometimes:
    LIMIT = 1  # [invalid-name]

اگر این وضعیت مطلوب نیست، با استفاده از انتساب انحصاری (exclusive) بازنویسی کنید تا مشخص باشد این مقداردهی تنها یک‌بار انجام می‌شود:

if sometimes:
    LIMIT = 1
else:
    LIMIT = 500  # exclusive assignment: uses const regex, no warning

لیست‌ها، مجموعه‌ها و اشیاء حتی در صورت مقداردهی مجدد، همچنان با هر یک از const-rgx یا variable-rgx پذیرفته می‌شوند، اما دیگر به طور کامل نادیده گرفته نمی‌شوند:

MY_LIST = []
my_list = []
My_List = []  # [invalid-name]

به یاد داشته باشید که عبارات باقاعده https://pylint.readthedocs.io/en/latest/user_guide/messages/convention/invalid-name.html و فهرست‌های مجاز https://pylint.readthedocs.io/en/latest/user_guide/configuration/all-options.html#good-names را مطابق سلیقه خود تنظیم کنید..SS در Pylint 4.0.7 چه مواردی جدید است؟

تاریخ انتشار: 2026-08-09

•
رفع یک هشدار کاذب برای invalid-name هنگامی که به یک متغیر در سطح ماژول، نمونه‌ای از یک زیرکلاس TypedDict انتساب داده می‌شود. چنین نامی یک مقدار است، نه تعریف نوع؛ بنابراین اکنون به جای class-rgx در برابر عبارت باقاعدهٔ ثابت یا متغیر بررسی می‌شود.

بسته شدن #11231 (#11231 https://github.com/pylint-dev/pylint/issues/11231)

  • رفع یک خرابی در بررسی bad-open-mode هنگامی که آرگومان mode در open برابر با ثابت NotImplemented است (Python >= 3.14).

    بسته شدن #11099 (#11099 https://github.com/pylint-dev/pylint/issues/11099)

  • رفع یک خرابی در بررسی‌های not-context-manager و not-async-context-manager هنگامی که مدیر بافت (context manager) به مقداری بدون نام استنتاج می‌شود، مانند slice بازگردانده‌شده توسط with slice(...) / async with slice(...).

    بسته شدن #11102 (#11102 https://github.com/pylint-dev/pylint/issues/11102)

  • رفع یک هشدار کاذب برای nested-min-max (W3301) هنگامی که فراخوانی درونی min/max دارای یک آرگومان کلیدواژه‌ای مانند key= باشد. مسطح‌سازی فراخوانی باعث حذف آرگومان کلیدواژه‌ای و تغییر نتیجه می‌شد، بنابراین فراخوانی‌های تو در تویی که فراخوانی درونی آن‌ها دارای آرگومان کلیدواژه‌ای است دیگر علامت‌گذاری نمی‌شوند.

    بسته شدن #11130 (#11130 https://github.com/pylint-dev/pylint/issues/11130)

  • رفع یک پیشنهاد نادرست از nested-min-max (W3301): هنگام بازنویسی یک min/max تو در تو به یک فراخوانی بازشده (splat call)، آرگومان‌های بعد از فراخوانی بازشده به‌صورت ناخواسته حذف می‌شدند و در نتیجه کد پیشنهادی حاصل را تغییر می‌داد.

    بسته شدن #11134 (#11134 https://github.com/pylint-dev/pylint/issues/11134)

  • رفع یک هشدار کاذب برای too-many-locals (R0914): پارامترهای نوع PEP 695، یعنی T1 و T2 در امضای عمومی def f[T1, T2]، به عنوان متغیرهای محلی شمرده می‌شدند. آن‌ها ساختارهای سیستم نوع هستند، نه متغیرهای محلی زمان اجرا، و اکنون از شمارش متغیرهای محلی مستثنی شده‌اند.

    بسته شدن #11136 (#11136 https://github.com/pylint-dev/pylint/issues/11136)

  • رفع صدور پیشنهاد مخدوش توسط literal-comparison (R0123) برای شناسه‌هایی که حاوی is هستند (برای مثال axis is 5 به صورت ax== == 5 تبدیل می‌شد). پیشنهاد اکنون از عملوندها و عملگر بازسازی می‌شود.

    بسته شدن #11146 (#11146 https://github.com/pylint-dev/pylint/issues/11146)

  • رفع هشدارهای کاذب در bad-string-format-type (E1307) برای قالب‌بندی‌های معتبر %: اعمال %i/%u روی یک float (هر دو مانند %d برش می‌دهند) و اعمال %a روی هر نوع غیر int (%a مانند %s/%r مستقل از نوع است).

    بسته شدن #11147 (#11147 https://github.com/pylint-dev/pylint/issues/11147)

  • رفع یک هشدار کاذب برای useless-parent-delegation / W0246 <#useless-parent-delegation> هنگامی که یک بازنویسی (override) مقدار پیش‌فرض یک پارامتر فقط ترتیبی (positional-only) را تغییر می‌دهد.

    بسته شدن #11148 (#11148 https://github.com/pylint-dev/pylint/issues/11148)

  • رفع یک خرابی در comparison-with-callable هنگام مقایسه یک تابع lambda که به عنوان یک مشخصه کلاس (class attribute) منتسب شده است.

    بسته شدن #11175 (#11175 https://github.com/pylint-dev/pylint/issues/11175)

  • پیام too-many-lines ممکن بود در خطی گزارش شود که پراگمای # pylint: disable=too-many-lines در ماژول تحلیل‌شده قبلی قرار داشت. موقعیت پراگماها اکنون بین ماژول‌ها بازنشانی می‌شود، بنابراین پیام صرف‌نظر از اینکه چه فایل‌هایی پیش‌تر تحلیل شده‌اند، در خط ۱ (یا در پراگمای خود ماژول فعلی) گزارش می‌شود.

    ارجاع به #11191 (#11191 https://github.com/pylint-dev/pylint/issues/11191)

  • رفع یک خرابی هنگامی که یک فراخوانی، دیکشنری‌ای را که کلیدهای آن ثابت‌های رشته‌ای نیستند باز (unpack) می‌کند، مانند copy.copy(**{-1: 1}).

    بسته شدن #11222 (#11222 https://github.com/pylint-dev/pylint/issues/11222)

تاریخ انتشار: 2026-06-14

  • پیام implicit-str-concat دیگر برای الحاق ضمنی یک رشته خام (raw) با یک رشته غیرخام صادر نمی‌شود (مانند r"\d" "\n"). چنین لیترال‌هایی نمی‌توانند در یک رشته واحد ادغام شوند، بنابراین الحاق عامدانه بوده است و ناشی از ویرگول فراموش‌شده نیست.

    بسته شدن #6663 (#6663 https://github.com/pylint-dev/pylint/issues/6663)

  • رفع یک هشدار کاذب برای invalid-name (C0103) که در آن مقدار پیش‌فرض typevar-rgx، نام‌های TypeVar حاوی ارقام مانند Ec2T را رد می‌کرد.

    بسته شدن #8499 (#8499 https://github.com/pylint-dev/pylint/issues/8499)

  • رفع یک هشدار کاذب برای too-many-arguments در متدهای (غیرایستا) و classmethodها.

    بسته شدن #8675 (#8675 https://github.com/pylint-dev/pylint/issues/8675)

  • رفع یک هشدار کاذب برای no-member هنگامی که یک مقدار به چند نوع ممکن استنتاج می‌شود و حداقل یکی از آن‌ها یک __getattr__ پویا تعریف می‌کند.

    بسته شدن #9833 (#9833 https://github.com/pylint-dev/pylint/issues/9833)

  • رفع یک هشدار کاذب برای function-redefined (E0102) هنگام استفاده مجدد از نام‌هایی که با dummy-variables-rgx مطابقت دارند (مانند _)، که برای تعاریف گام‌های pytest-bdd متداول است. این تغییر رفتار نسخه پیش از pylint 4.0.0 را بازمی‌گرداند؛ در نتیجه منفی کاذب برطرف‌شده در #9894 مجدداً برای توابعی که نامشان با dummy-variables-rgx مطابقت دارد معرفی می‌شود.

    بسته شدن #10665 (#10665 https://github.com/pylint-dev/pylint/issues/10665)

  • رفع هشدار کاذب undefined-variable هنگامی که نامی که به عنوان آرگومان metaclass در یک کلاس تو در تو استفاده شده است، بعداً در ماژول دوباره مورد ارجاع قرار می‌گیرد.

    بسته شدن #10823 (#10823 https://github.com/pylint-dev/pylint/issues/10823)

  • رفع یک هشدار کاذب برای unused-variable که در آن متغیرهای سراسری مطابق با dummy-variables-rgx هنگام غیرفعال بودن allow-global-unused-variables همچنان به عنوان استفاده‌نشده گزارش می‌شدند.

    بسته شدن #10890 (#10890 https://github.com/pylint-dev/pylint/issues/10890)

  • رفع یک هشدار کاذب برای bad-dunder-name هنگامی که یک مشخصه __suppress_context__ تعریف‌شده توسط کاربر روی زیرکلاس‌های استثنا وجود دارد.

    بسته شدن #10960 (#10960 https://github.com/pylint-dev/pylint/issues/10960)

  • رفع هشدار کاذب used-before-assignment برای نام‌هایی که توسط from X import * در تمام شاخه‌های یک زنجیره if/elif/else مقید (bound) شده‌اند.

    ارجاع به #10980 (#10980 https://github.com/pylint-dev/pylint/issues/10980)

  • بررسی امضای __call__ فرامعرف (metaclass) هنگام ارزیابی آرگومان‌های فراخوانی یک کلاس.

    بسته شدن #11032 (#11032 https://github.com/pylint-dev/pylint/issues/11032)

  • رفع هشدار کاذب method-hidden هنگامی که cached_property مستقیماً با from functools import cached_property وارد می‌شود.

    ارجاع به #11037 (#11037 https://github.com/pylint-dev/pylint/issues/11037)

  • اصلاح پیشنهاد unnecessary-comprehension برای ساختار درک دیکشنری (dict comprehension) که مستقیماً روی یک دیکشنری پیمایش می‌کند، مانند {a: b for a, b in d}. از آنجا که پیمایش روی یک دیکشنری کلیدهای آن را برمی‌گرداند، این پیشنهاد اکنون به جای dict(d) نادرست (که صرفاً از d رونوشت می‌گرفت)، به صورت dict(d.keys()) ارائه می‌شود.

    بسته شد #8256 (#8256 https://github.com/pylint-dev/pylint/issues/8256)

  • رفع خرابی در consider-using-enumerate زمانی که هدف حلقهٔ for یک صفت (مانند for self.idx in range(len(x))) باشد و نه یک نام متغیر ساده.

    بسته شد #10099 (#10099 https://github.com/pylint-dev/pylint/issues/10099)

  • رفع خرابی هنگام بررسی attribute-defined-outside-init روی کلاس‌هایی که از یک کلاس پایه که pylint قادر به تحلیل کامل آن نیست، ارث‌بری می‌کنند.

    بسته شد #10892 (#10892 https://github.com/pylint-dev/pylint/issues/10892)

  • رفع بازنویسی خاموش مقدار صریح col_offset=0 (یا هر مقدار صفر دیگر برای line/end_lineno/end_col_offset) با مقدار گرهٔ AST توسط add_message. تابع کمکی داخلی _add_one_message از بررسی ارزیابی نادرست (if not col_offset:) برای تشخیص آرگومان حذف‌شده استفاده می‌کرد که به‌اشتباه یک مقدار معتبر 0 را همانند None در نظر می‌گرفت. اکنون از بررسی همسانی با None استفاده می‌کند.

    ارجاع: #11020 (#11020 https://github.com/pylint-dev/pylint/issues/11020)

  • رفع خرابی در بررسی‌کنندهٔ نام‌ها هنگام ارسال یک مقدار غیرثابت به عنوان آرگومان covariant یا contravariant برای یک TypeVar.

    بسته شد #11022 (#11022 https://github.com/pylint-dev/pylint/issues/11022)

  • رفع خرابی در بررسی‌کنندهٔ متغیرها زمانی که یک نام به متد __init__ ایجادشده توسط dataclass حل می‌شود که فاقد شماره خط است.

    بسته شد #11023 (#11023 https://github.com/pylint-dev/pylint/issues/11023)

  • رفع خرابی در بررسی‌کنندهٔ متغیرها هنگامی که NotImplemented به عنوان شرط یک دستور if استفاده می‌شود، که در پایتون ۳.۱۴ در یک بستر بولی منجر به صدور خطای TypeError می‌شد.

    بسته شد #11025 (#11025 https://github.com/pylint-dev/pylint/issues/11025)

  • جلوگیری از خرابی در بررسی‌کنندهٔ مقدار بولی ضمنی (implicit booleaness) برای فراخوانی‌های بدون آرگومان len().

    بسته شد #11028 (#11028 https://github.com/pylint-dev/pylint/issues/11028)

  • رفع خرابی در بررسی‌کنندهٔ متغیرها زمانی که یک کلاس، متاکلاسی را اعلان می‌کند که زنجیرهٔ دسترسی به صفت آن به یک نام منتهی نمی‌شود (مانند class C(metaclass=None._)). در ابتدا به عنوان pylint-dev/astroid#3066 گزارش شده بود.

    ارجاع: #11031 (#11031 https://github.com/pylint-dev/pylint/issues/11031)

  • رفع خرابی در بررسی‌کنندهٔ نام‌ها زمانی که انتساب زنجیره‌ای یک مقدار TypeAlias دارای مقصدی غیر از نام باشد، مانند یک Subscript (برای مثال a[0] = b = TypeAlias).

    بسته شد #11056 (#11056 https://github.com/pylint-dev/pylint/issues/11056)

  • رفع خرابی در بررسی‌کنندهٔ منسوخ‌شدگی‌ها هنگامی که __import__ با یک آرگومان ثابت غیررشته‌ای فراخوانی می‌شود (برای مثال __import__(1)).

    بسته شد #11059 (#11059 https://github.com/pylint-dev/pylint/issues/11059)

  • جلوگیری از خرابی هنگام ناموفق بودن استنتاج عضو enum در حین بررسی زیرکلاس‌های enum.

    بسته شد #11069 (#11069 https://github.com/pylint-dev/pylint/issues/11069)

  • جلوگیری از خرابی در تحلیل unexpected-keyword-arg زمانی که infer_call_result() در هنگام بازرسی امضای بازگشتی دکوراتور، خطای InferenceError پرتاب می‌کند.

    بسته شد #11070 (#11070 https://github.com/pylint-dev/pylint/issues/11070)

  • رفع خرابی در بررسی‌کنندهٔ نوع (typecheck) زمانی که یک کلاس از یک شیء غیرکلاس (برای مثال یک تابع) به عنوان آرگومان metaclass= خود استفاده می‌کند.

    بسته شد #11071 (#11071 https://github.com/pylint-dev/pylint/issues/11071)

  • مجاز شدن ارقام در نام‌های ParamSpec و TypeVarTuple برای بررسی invalid-name.

    الگوهای پیش‌فرض paramspec-rgx و typevartuple-rgx نام‌های حاوی ارقام (مانند Ec2P، S3Ts) را رد می‌کردند و هشدار کاذب invalid-name (C0103) صادر می‌نمودند. اکنون برای سازگاری با الگوهای typevar و typealias، وجود ارقام در بخش‌های با حروف کوچک مجاز شده است.

    بسته شد #11090 (#11090 https://github.com/pylint-dev/pylint/issues/11090)

•
بررسی‌کنندهٔ duplicate-code دیگر زمانی که پیام آن (R0801) غیرفعال است اجرا نمی‌شود، حتی اگر reports=yes تنظیم شده باشد. پیش‌تر، گزارش این بررسی‌کننده (RP0801) باعث می‌شد که محاسبهٔ سنگین شباهت در هر صورت اجرا شود.

بستن #3443 (#3443 https://github.com/pylint-dev/pylint/issues/3443)

تاریخ انتشار: 2026-02-20

  • رفع مثبت کاذب possibly-used-before-assignment هنگام استفاده از self.fail() در آزمون‌ها.

    بستن #10743 (#10743 https://github.com/pylint-dev/pylint/issues/10743)

  • رفع مثبت کاذب برای logging-unsupported-format هنگامی که هیچ آرگومانی به توابع logging ارائه نشده است.

    طبق مستندات logging در Python، هنگامی که هیچ آرگومانی ارسال نشود هیچ قالب‌بندی‌ای صورت نمی‌گیرد، بنابراین رشته‌هایی مانند logging.error("%test") معتبر هستند.

    بستن #10752 (#10752 https://github.com/pylint-dev/pylint/issues/10752)

  • رفع مثبت کاذب برای invalid-name در جایی که یک فیلد dataclass با نوع Final به‌جای regex مربوط به class_attribute، با regex مربوط به class_const ارزیابی می‌شد.

    بستن #10790 (#10790 https://github.com/pylint-dev/pylint/issues/10790)

  • جلوگیری از صدور unspecified-encoding (W1514) هنگامی که py-version برابر 3.15+ است.

    ارجاع به #10791 (#10791 https://github.com/pylint-dev/pylint/issues/10791)

تاریخ انتشار: 2025-11-30

  • رفع مثبت کاذب برای invalid-name هنگامی که ثابت‌های سطح ماژول در صورت وجود یک صفت هم‌نام در سطح کلاس، به نادرست به عنوان متغیر دسته‌بندی می‌شدند.

    بستن #10719 (#10719 https://github.com/pylint-dev/pylint/issues/10719)

  • رفع مثبت کاذب برای invalid-name بر روی یک نام با حروف بزرگ (UPPER_CASED) درون یک شاخهٔ if که شیئی را انتساب می‌دهد.

    بستن #10745 (#10745 https://github.com/pylint-dev/pylint/issues/10745)

تاریخ انتشار: 2025-11-13

  • افزودن متدهای dunder کلاس Enum شامل _generate_next_value_، _missing_، _numeric_repr_، _add_alias_ و _add_value_alias_ به فهرستی که به --good-dunder-names ارسال می‌شود.

    بستن #10435 (#10435 https://github.com/pylint-dev/pylint/issues/10435)

  • رفع مثبت کاذب برای invalid-name با typing.Annotated.

    بستن #10696 (#10696 https://github.com/pylint-dev/pylint/issues/10696)

  • رفع مثبت کاذب برای f-string-without-interpolation با رشته‌های الگو هنگام استفاده از مشخصات قالب (format spec).

    بستن #10702 (#10702 https://github.com/pylint-dev/pylint/issues/10702)

  • رفع مثبت کاذب هنگامی که یک صفت کلاس با حروف بزرگ (UPPER_CASED) در صورت تعیین نوع با Final خطای invalid-name صادر می‌کرد.

    بستن #10711 (#10711 https://github.com/pylint-dev/pylint/issues/10711)

  • رفع مثبت کاذب برای unbalanced-tuple-unpacking هنگامی که یک تاپل به یک فراخوانی تابع انتساب داده می‌شود و ساختار مقدار بازگشتی تابع مبهم است.

    بستن #10721 (#10721 https://github.com/pylint-dev/pylint/issues/10721)

تاریخ انتشار: 2025-10-20

  • رفع مثبت کاذب برای invalid-name / C0103 <#invalid-name> روی یک ثابت در سطح ماژول که تا حدی غیرقابل استنتاج است.

    بسته‌شده در #10652 (#10652 https://github.com/pylint-dev/pylint/issues/10652)

  • رفع یک مثبت کاذب برای invalid-name / C0103 <#invalid-name> روی انتساب‌های انحصاری در سطح ماژول متشکل از سه شاخه یا بیشتر. تا زمان انجام بازآرایی بیشتر برای حذف این منفی کاذب، خطای disallowed-name / C0104 <#disallowed-name> روی نام‌های سطح ماژول که قابل استنتاج نیستند صادر نخواهد شد.

    بسته‌شده در #10664 (#10664 https://github.com/pylint-dev/pylint/issues/10664)

  • رفع مثبت کاذب برای invalid-name / C0103 <#invalid-name> در نمونه‌های TypedDict.

    بسته‌شده در #10672 (#10672 https://github.com/pylint-dev/pylint/issues/10672)

تاریخ انتشار: 2025-10-14

تاریخ انتشار: 2025-10-12

  • بررسی invalid-name اکنون بین ثابت‌های در سطح ماژول که تنها یک بار انتساب یافته‌اند و آن‌هایی که مجدداً مقداردهی شده‌اند تمایز قائل می‌شود و برای دومی --variable-rgx را اعمال می‌کند. مقادیری غیر از لیترال‌ها (فهرست‌ها، مجموعه‌ها، اشیاء) می‌توانند با هر دو عبارت منظمِ ثابت یا متغیر تطابق داشته باشند (برای مثال "LOGGER" یا "logger" اما نه "LoGgEr").

    به یاد داشته باشید که می‌توان --good-names یا --good-names-rgxs را برای مجاز دانستن صریح نام‌های مناسب مشخص کرد.

    بسته‌شده در #3585 (#3585 https://github.com/pylint-dev/pylint/issues/3585)

  • آرگومان بلااستفادهٔ pylintrc در PyLinter.__init__() منسوخ شده و حذف خواهد شد.

    ارجاع به #6052 (#6052 https://github.com/pylint-dev/pylint/issues/6052)

  • بلوک‌های کد کامنت‌شده مانند # bar() # TODO: remove dead code دیگر هشدار fixme را صادر نخواهند کرد.

    ارجاع به #9255 (#9255 https://github.com/pylint-dev/pylint/issues/9255)

  • کلاس Run در pyreverse تغییر یافت تا دیگر sys.exit() را در __init__ خود فراخوانی نکند. اکنون باید Run(args).run() را فراخوانی کنید که در عوض کد وضعیت خروج را برمی‌گرداند. داشتن کلاسی که همیشه استثنای SystemExit ایجاد می‌کرد، یک باگ تلقی می‌شد.

    استفادهٔ عادی از pyreverse از طریق خط فرمان تحت تأثیر این تغییر قرار نخواهد گرفت.

    ارجاع به #9689 (#9689 https://github.com/pylint-dev/pylint/issues/9689)

  • گزینهٔ suggestion-mode حذف شد، زیرا pylint اکنون همیشه به جای پیام‌های خطای مثبت کاذب، راهنمایی‌های کاربرپسند صادر می‌کند. در صورت تعریف شدن در فایل پیکربندی، باید آن را حذف کنید.

    ارجاع به #9962 (#9962 https://github.com/pylint-dev/pylint/issues/9962)

  • ماژول بررسی‌کنندهٔ async.py به async_checker.py تغییر نام یافته است، زیرا async یک کلیدواژهٔ پایتون است و نمی‌توان آن را مستقیماً وارد کرد (import). این تغییر امکان آزمون بهتر و گسترش‌پذیری کارایی بررسی‌کنندهٔ async را فراهم می‌سازد.

    ارجاع به #10071 (#10071 https://github.com/pylint-dev/pylint/issues/10071)

  • شناسهٔ پیام (message-id) در continue-in-finally از E0116 به W0136 تغییر یافت. این هشدار اکنون برای تمام نسخه‌های پایتون صادر می‌شود، زیرا در پایتون 3.14 موجب ایجاد هشدار نحو (syntax warning) خواهد شد. سند PEP 765 - Disallow return/break/continue that exit a finally block https://peps.python.org/pep-0765 را ببینید.

    ارجاع به #10480 (#10480 https://github.com/pylint-dev/pylint/issues/10480)

  • پشتیبانی از نام مستعار nmp.NaN برای numpy.NaN در 'nan-comparison / W0177 <#nan-comparison>' حذف شد. به جای آن از np یا numpy استفاده کنید.

    ارجاع به #10583 (#10583 https://github.com/pylint-dev/pylint/issues/10583)

  • نسخهٔ مورد نیاز برای isort به 5.0.0=< ارتقا یافته است. سازگاری داخلی برای نسخه‌های قدیمی‌تر isort که از طریق pylint.utils.IsortDriver ارائه می‌شد، حذف گردیده است.

    ارجاع به #10637 (#10637 https://github.com/pylint-dev/pylint/issues/10637)

•
برخی قالب‌بندی‌های نادرست ناشی از محدودیت utf-8 جلوگیری شود. این پیام اکنون به‌جای ' از " استفاده می‌کند تا با خروجی ast در python سازگاری بهتری داشته باشد.

Refs #8736 (#8736 https://github.com/pylint-dev/pylint/issues/8736)

  • بهبود pyreverse برای تشخیص درست بین انواع روابط UML (ارتباط/association، تجمیع/aggregation، ترکیب/composition) بر پایه معناشناسی مالکیت شیء. یادداشت‌های نوع بدون مقداردهی اولیه اکنون به عنوان association، مقداردهی‌های پارامتر به عنوان aggregation و نمونه‌سازی شیء به عنوان composition در نظر گرفته می‌شوند.

    Closes #9045 Closes #9267 (#9045 https://github.com/pylint-dev/pylint/issues/9045)

  • بررسی fixme اکنون می‌تواند با استفاده از check-fixme-in-docstring = true در بخش [tool.pylint.miscellaneous]، علاوه بر کامنت‌ها در docstringها نیز جستجو کند.

    Closes #9255 (#9255 https://github.com/pylint-dev/pylint/issues/9255)

  • بررسی‌های use-implicit-booleaness-not-x اکنون میان مقایسه‌های استفاده‌شده در زمینه‌های بولی و مواردی که این‌گونه نیستند تمایز قائل می‌شوند، که امکان ارائه پیشنهادهای بازسازی کد (refactoring) دقیق‌تری را فراهم می‌سازد.

    Closes #9353 (#9353 https://github.com/pylint-dev/pylint/issues/9353)

  • گزینه verbose اکنون نام فایل‌های بررسی‌شده را در خروجی نمایش می‌دهد. پیش از این، این گزینه تنها تعداد فایل‌های بررسی‌شده و نادیده‌گرفته‌شده را شامل می‌شد.

    Closes #9357 (#9357 https://github.com/pylint-dev/pylint/issues/9357)

  • گزارش‌دهنده رنگی (colorized reporter) اکنون پیام‌ها یا دسته‌بندی‌هایی را که به عنوان fail-on پیکربندی شده‌اند با رنگ قرمز معکوس (red inverse) نمایش می‌دهد. این امر یافتن سریع خطاهایی را که باعث شکست کارهای CI ابزار pylint می‌شوند، آسان‌تر می‌کند.

    Closes #9898 (#9898 https://github.com/pylint-dev/pylint/issues/9898)

  • بهبود پشتیبانی از دکوراتور @property در pyreverse برای نمایش صحیح نوع‌های بازگشتی مشخصه‌های نشانه‌گذاری‌شده هنگام تولید نمودارهای کلاس.

    Closes #10057 (#10057 https://github.com/pylint-dev/pylint/issues/10057)

  • افزودن گزینه --max-depth به pyreverse برای کنترل پیچیدگی نمودار. عمق 0 تنها بسته‌های سطح بالا را نشان می‌دهد، 1 یک سطح از زیربسته‌ها را نمایش می‌دهد و غیره. این ویژگی با محدود کردن عمق بسته‌ها و کلاس‌های نمایش‌داده‌شده، به مدیریت مصورسازی پایگاه‌های کد بزرگ کمک می‌کند.

    Refs #10077 (#10077 https://github.com/pylint-dev/pylint/issues/10077)

  • مدیریت ارزیابی معوق نشانه‌گذاری‌ها (deferred evaluation of annotations) در Python 3.14.

    Closes #10149 (#10149 https://github.com/pylint-dev/pylint/issues/10149)

  • بهبود pyreverse برای تشخیص صحیح تجمیع‌ها (aggregations) در عبارت‌های جامع (comprehensions شامل list، dict، set و generator).

    Closes #10236 (#10236 https://github.com/pylint-dev/pylint/issues/10236)

  • pyreverse: افزودن پشتیبانی از خروجی رنگی هنگام استفاده از قالب‌های خروجی mmd (MermaidJS) و html.

    Closes #10242 (#10242 https://github.com/pylint-dev/pylint/issues/10242)

  • اکنون از pypy 3.11 به‌طور رسمی پشتیبانی می‌شود.

    Refs #10287 (#10287 https://github.com/pylint-dev/pylint/issues/10287)

  • افزودن پشتیبانی از Python 3.14.

    Refs #10467 (#10467 https://github.com/pylint-dev/pylint/issues/10467)

  • افزودن شیوه‌های نام‌گذاری برای ParamSpec و TypeVarTuple که با سبک TypeVar همخوانی دارد.

    Refs #10541 (#10541 https://github.com/pylint-dev/pylint/issues/10541)

  • افزودن بررسی‌کننده match-statements و پیام زیر: bare-name-capture-pattern. این بررسی هنگامی که یک الگوی گرفتن نام (name capture pattern) در دستور match به‌کار رود و باعث غیرقابل‌دسترس شدن سایر الگوها شود، یک پیام خطا صادر می‌کند. این کد در زمان اجرا یک SyntaxError است.

    Closes #7128 (#7128 https://github.com/pylint-dev/pylint/issues/7128)

  • افزودن بررسی جدید async-context-manager-with-regular-with برای تشخیص مدیران زمینه ناهمگام (async context managers) که به‌جای async with با دستورات معمولی with استفاده شده‌اند.

    Refs #10408 (#10408 https://github.com/pylint-dev/pylint/issues/10408)

  • افزودن هشدار break-in-finally. استفاده از break درون بند finally در Python 3.14 یک هشدار نحوی ایجاد خواهد کرد. سند PEP 765 - Disallow return/break/continue that exit a finally block https://peps.python.org/pep-0765 را ببینید.

    Refs #10480 (#10480 https://github.com/pylint-dev/pylint/issues/10480)

  • افزودن بررسی‌های جدید برای استفاده‌های نادرست از الگوهای کلاس در match https://docs.python.org/3/reference/compound_stmts.html#match.
  • پیام invalid-match-args-definition / E1902 <#invalid-match-args-definition> در صورتی که object.__match_args__ https://docs.python.org/3/reference/datamodel.html#object.__match_args__ یک چندتایی (tuple) از رشته‌ها نباشد، صادر می‌شود.
  • پیام too-many-positional-sub-patterns / E1903 <#too-many-positional-sub-patterns> اگر تعداد زیرالگوهای موضعی بیشتر از مقدار مشخص‌شده در object.__match_args__ https://docs.python.org/3/reference/datamodel.html#object.__match_args__ باشد، صادر می‌شود.
  • پیام multiple-class-sub-patterns / E1904 <#multiple-class-sub-patterns> اگر چند زیرالگو برای یک ویژگی (attribute) یکسان وجود داشته باشد، صادر می‌شود.

Refs #10559 (#10559 https://github.com/pylint-dev/pylint/issues/10559)

•
افزودن بررسی‌های تکمیلی برای استفاده‌های غیربهینه از الگوهای کلاس در match https://docs.python.org/3/reference/compound_stmts.html#match.
  • پیام match-class-bind-self / R1905 <#match-class-bind-self> زمانی صادر می‌شود که به‌جای استفاده از الگوی as، نامی به self متصل شده باشد.
  • پیام match-class-positional-attributes / R1906 <#match-class-positional-attributes> زمانی صادر می‌شود که یک الگوی کلاس دارای مشخصه‌های موضعی باشد در حالی که امکان استفاده از کلمات کلیدی وجود داشته است.

Refs #10587 (#10587 https://github.com/pylint-dev/pylint/issues/10587)

•
افزودن پیام consider-math-not-float. فراخوانی‌های float("nan") و float("inf") به‌اندازه ۴ برابر کندتر از همتایان خود یعنی math.inf و math.nan هستند (بدون در نظر گرفتن زمان وارد کردن اولیه math) و همچنین هنگام استفاده از mypy دارای نوع مناسبی نیستند. این بررسی همچنین به عنوان یک مزیت جانبی، اشتباهات تایپی در فراخوانی‌های float را شناسایی می‌کند.

برای کارکرد این بررسی، باید بررسی‌کننده Code Style <#pylint-extensions-code-style> فعال باشد.

Refs #10621 (#10621 https://github.com/pylint-dev/pylint/issues/10621)

  • رفع یک مثبت کاذب برای used-before-assignment هنگامی که متغیر تعریف‌شده درون یک if و از طریق یک عبارت نام‌گذاری‌شده (عملگر walrus)، بعداً تحت محافظت همان شرط if استفاده می‌شود.

    Closes #10061 (#10061 https://github.com/pylint-dev/pylint/issues/10061)

  • رفع no-name-in-module / E0611 <#no-name-in-module> برای اعضای concurrent.futures با Python 3.14.

    Closes #10632 (#10632 https://github.com/pylint-dev/pylint/issues/10632)

  • رفع منفی کاذب برای used-before-assignment هنگامی که یک واردسازی TYPE_CHECKING پیش از استفاده نادرست، به‌عنوان یادداشت نوع (type annotation) استفاده شده باشد.

    Refs #8893 (#8893 https://github.com/pylint-dev/pylint/issues/8893)

  • موارد match اکنون به‌عنوان یال در گراف McCabe شمارش می‌شوند و بر همین اساس پیچیدگی را افزایش می‌دهند.

    Refs #9667 (#9667 https://github.com/pylint-dev/pylint/issues/9667)

  • بررسی ثابت‌های در سطح ماژول دارای یادداشت نوع برای invalid-name. به یاد داشته باشید که const-naming-style یا const-rgx را مطابق سلیقه خود تنظیم کنید.

    Closes #9770 (#9770 https://github.com/pylint-dev/pylint/issues/9770)

  • رفع منفی کاذب در مواردی که function-redefined (E0102) برای توابعی با زیرخط آغازین گزارش نمی‌شد.

    Closes #9894 (#9894 https://github.com/pylint-dev/pylint/issues/9894)

  • اکنون یک خطای logging-too-few-args برای رشته قالب‌بندی بدون هیچ آرگومان درون‌یابی صادر می‌شود (یعنی برای مواردی مانند logging.debug("Awaiting process %s") یا logging.debug("Awaiting process {pid}")). پیش از این برای چنین مواردی خطایی صادر نمی‌شد.

    Closes #9999 (#9999 https://github.com/pylint-dev/pylint/issues/9999)

  • رفع منفی کاذب برای used-before-assignment هنگامی که تابعی درون یک بلوک محافظت‌شده با TYPE_CHECKING تعریف شده و بعداً استفاده می‌شود.

    Closes #10028 (#10028 https://github.com/pylint-dev/pylint/issues/10028)

  • رفع یک منفی کاذب برای possibly-used-before-assignment هنگامی که متغیری به‌صورت شرطی تعریف شده و بعداً به یک متغیر دارای یادداشت نوع تخصیص داده می‌شود.

    Closes #10421 (#10421 https://github.com/pylint-dev/pylint/issues/10421)

  • رفع منفی کاذب برای deprecated-module هنگامی که متد __import__ به‌جای دستور import استفاده می‌شود.

    Refs #10453 (#10453 https://github.com/pylint-dev/pylint/issues/10453)

  • شمارش موارد match برای بررسی too-many-branches.

    Refs #10542 (#10542 https://github.com/pylint-dev/pylint/issues/10542)

  • رفع منفی کاذب در مواردی که unused-import / W0611 <#unused-import> برای نام‌های ارجاع‌داده‌شده در دستور قبلیِ global گزارش نمی‌شد.

    Refs #10633 (#10633 https://github.com/pylint-dev/pylint/issues/10633)

  • هنگام نمایش یونیکدهای دارای جانشین (surrogates) (یا سایر خطاهای احتمالی UnicodeEncodeError)، ابزار pylint اکنون به‌جای فروپاشی، نویسه '?' را نمایش می‌دهد (با استفاده از encode(encoding="utf-8", errors="replace")). کلاس‌های آزمون‌های کارکردی نیز برای رسیدگی به این مورد به‌روزرسانی شده‌اند.

    Closes #8736. (#8736 https://github.com/pylint-dev/pylint/issues/8736)

  • رفع اشکال در unidiomatic-typecheck که تنها سمت چپ را بررسی می‌کرد.

    Closes #10217 (#10217 https://github.com/pylint-dev/pylint/issues/10217)

  • رفع فروپاشی ناشی از رشته‌های قالب‌بندی ناصحیح هنگام استفاده از .format با آرگومان‌های کلیدواژه‌ای.

    Closes #10282 (#10282 https://github.com/pylint-dev/pylint/issues/10282)

  • رفع مثبت کاذب inconsistent-return-statements هنگام استفاده از توابع quit() یا exit().

    Closes #10508 (#10508 https://github.com/pylint-dev/pylint/issues/10508)

  • رفع فروپاشی در nested-min-max / W3301 <#nested-min-max> هنگام استفاده مستقیم از builtins.min یا builtins.max به‌جای min یا max.

    Closes #10626 (#10626 https://github.com/pylint-dev/pylint/issues/10626)

  • رفع یک فروپاشی در unnecessary-dict-index-lookup / R1733 <#unnecessary-dict-index-lookup> هنگامی که نمایه یک فهرست شمارش‌شده (enumerated list) درون یک حلقه for حذف می‌شد.

    Closes #10627 (#10627 https://github.com/pylint-dev/pylint/issues/10627)

•
حذف پشتیبانی از راه‌اندازی pylint با Python 3.9. کدهایی که از Python 3.9 پشتیبانی می‌کنند همچنان می‌توانند با تنظیم --py-version=3.9 تحلیل (lint) شوند.

ارجاع به #10405 (#10405 https://github.com/pylint-dev/pylint/issues/10405)

•
اصلاح چارچوب آزمون جهت امکان‌پذیر ساختن خروجی‌های آزمون متفاوت برای نسخه‌های مختلف Python.

ارجاع به #10382 (#10382 https://github.com/pylint-dev/pylint/issues/10382)

این فهرست کامل تغییرات در نسخه‌های فرعی (minor) pylint 3.x بر اساس دسته‌بندی است.

:انتشار: 3.3 :تاریخ: 2024-09-20

تاریخ انتشار: 2025-10-05

•
رفع خرابی (crash) در unnecessary-list-index-lookup هنگام آغاز شمارش با استفاده از منفی طول یک پیمایش‌پذیر (iterable) درون یک dict comprehension، در وضعیتی که فراخوانی len تنها در همین dict comprehension انجام شده بود و نه در جای دیگر. همچنین رویکرد تغییر کرد تا در تمام حالات به جز موارد ساده از استنتاج (inference) استفاده شود، تا نیازی نباشد خرابی‌ها را یکی‌یکی برای عبارت‌های با پیچیدگی دلخواه در enumerate رفع کنیم.

بسته شد: #10510 (#10510 https://github.com/pylint-dev/pylint/issues/10510)

تاریخ انتشار: 2025-08-09

این انتشار وصله‌ای (patch release) شامل یک رفع مشکل استثنایی برای یک مورد منفی کاذب (false negative) است. برای جزئیات، ببینید: https://github.com/pylint-dev/pylint/pull/10482#issuecomment-3164514082

•
رفع منفی کاذب برای used-before-assignment / E0601 <#used-before-assignment> همراه با from __future__ import annotations در تعاریف توابع.

ارجاع به #10482 (#10482 https://github.com/pylint-dev/pylint/issues/10482)

  • رفع باگی در Pyreverse که در آن تجمع‌ها (aggregations) و رابطه‌ها (associations) صرف‌نظر از --filter-mode انتخاب‌شده (مانند PUB_ONLY، ALL و غیره) در نمودارها گنجانده می‌شدند.

    بستن #10373 (#10373 https://github.com/pylint-dev/pylint/issues/10373)

  • رفع رندر شدن نادرست دو خط زیرین (double underscore) به‌صورت پررنگ (bold) در خروجی Mermaid در pyreverse.

    بستن #10402 (#10402 https://github.com/pylint-dev/pylint/issues/10402)

تاریخ انتشار: 2025-05-04

•
مقایسه بین دو فراخوانی type() دیگر هشدار unidiomatic-typecheck / C0123 <#unidiomatic-typecheck> را ایجاد نخواهد کرد؛ این رفتار با آنچه پیش‌تر فقط برای == اعمال می‌شد هماهنگ است.

بستن #10161 (#10161 https://github.com/pylint-dev/pylint/issues/10161)

  • رفع خرابی (crash) هنگام وارد کردن (import) دکوراتور کلاسی که وجود نداشت و پس از تعریف کلاس، با یکی از ویژگی‌های کلاس (class attribute) هم‌نام بود.

    بستن #10105 (#10105 https://github.com/pylint-dev/pylint/issues/10105)

  • رفع خرابی (crash) ناشی از رشته‌های قالب‌بندی نامعتبر هنگام استفاده از .format با آرگومان‌های کلیدواژه‌ای.

    بستن #10282 (#10282 https://github.com/pylint-dev/pylint/issues/10282)

  • استفاده از یک برش (slice) به عنوان دکوراتور کلاس اکنون به جای خرابی (crash)، پیام not-callable / E1102 <#not-callable> را صادر می‌کند. بسیاری از بررسی‌های مربوط به دکوراتورها (بیش از آنکه بتوان فهرست کرد)، در صورتی که دکوراتور نتواند فوراً به یک تابع یا تعریف کلاس استنتاج شود، میان‌بُر زده می‌شوند.

    بستن #10334 (#10334 https://github.com/pylint-dev/pylint/issues/10334)

•
الگوریتم مورد استفاده برای پیشنهادات no-member / E1101 <#no-member> اکنون کارآمدتر شده و هنگامی که امتیاز فاصله بالاتر از آستانه باشد، محاسبه را متوقف می‌کند.

ارجاع به #10277 (#10277 https://github.com/pylint-dev/pylint/issues/10277)

تاریخ انتشار: 2025-03-20

•
رفع یک مثبت کاذب برای used-before-assignment / E0601 <#used-before-assignment> هنگامی که نوع بازگشتی مشخص‌شده برای یک تابع درونی، کلاسی تعریف‌شده در سطح ماژول (module scope) باشد.

بستن #9391 (#9391 https://github.com/pylint-dev/pylint/issues/9391)

تاریخ انتشار: 2025-03-09

•
بارگذاری فایل‌های انتشار در PyPI از طریق Trusted Publishing.

بستن #10256 (#10256 https://github.com/pylint-dev/pylint/issues/10256)

تاریخ انتشار: 2025-01-28

تاریخ انتشار: 2024-12-23

•
رفع خطای Unable to import 'collections.abc' (import-error) در Python 3.13.1.

بستن #10112 (#10112 https://github.com/pylint-dev/pylint/issues/10112)

تاریخ انتشار: 2024-12-01

•
رفع یک مثبت کاذب برای potential-index-error / E0643 <#potential-index-error> هنگامی که یک تکرارپذیر (iterable) اندیس‌گذاری‌شده حاوی عنصری ستاره‌دار است که به بیش از یک مورد ارزیابی می‌شود.

بستن #10076 (#10076 https://github.com/pylint-dev/pylint/issues/10076)

•
رفع اشکال در کارکرد گزینه --source-root هنگامی که فایل‌های منبع در یک زیردایرکتوری از ریشه منبع قرار دارند (مثلاً هنگام استفاده از ساختار /src).

بستن #10026 (#10026 https://github.com/pylint-dev/pylint/issues/10026)

تاریخ انتشار: 2024-09-24

•
رفع پس‌رفتی (regression) که باعث می‌شد برخی f-strings به عنوان رشته استنتاج نشوند.

بستن #9947 (#9947 https://github.com/pylint-dev/pylint/issues/9947)

تاریخ انتشار: 2024-09-20

•
ما symilar را از getopt به argparse منتقل کردیم، بنابراین خروجی خطا و راهنما (به شکلی بهتر) تغییر یافته است. خروج برنامه اکنون به جای این‌که گاه با ۱ و گاه با ۲ باشد، با کد ۲ انجام می‌شود. خروجی خطا دیگر توسط اجراکننده (runner) ضبط نمی‌شود. همچنین دیگر امکان تعیین مقدار برای گزینه‌های بولی وجود ندارد (برای نمونه، --ignore-comments 1 باید به --ignore-comments تبدیل شود).

ارجاع به #9731 (#9731 https://github.com/pylint-dev/pylint/issues/9731)

•
افزودن خطای جدید declare-non-slot / E0245 <#declare-non-slot> که زمانی گزارش می‌شود که یک کلاس دارای عضو __slots__ بوده و یک راهنمای نوع (type hint) در کلاس، در __slots__ موجود نباشد.

ارجاع به #9499 (#9499 https://github.com/pylint-dev/pylint/issues/9499)

  • افزودن too-many-positional-arguments / R0917 <#too-many-positional-arguments> برای امکان تمایز بین پیکربندیِ تعداد بیش از حد کل آرگومان‌ها (همراه با پارامترهای keyword-only تعیین‌شده پس از *) از پیکربندی تعداد بیش از حد آرگومان‌های positional-or-keyword یا positional-only.

    به عنوان بخشی از ارزیابی این‌که آیا این بررسی برای پروژهٔ شما مناسب است یا خیر، مطمئن شوید که مقدار --max-positional-arguments را تنظیم کنید.

    بستن #9099 (#9099 https://github.com/pylint-dev/pylint/issues/9099)

  • افزودن using-exception-groups-in-unsupported-version / W2603 <#using-exception-groups-in-unsupported-version> و using-generic-type-syntax-in-unsupported-version / W2604 <#using-generic-type-syntax-in-unsupported-version> برای موارد استفاده از ویژگی‌های پایتون 3.11+ یا 3.12+ در نسخه‌های پشتیبانی‌شدهٔ پایین‌تر که با --py-version ارائه شده‌اند.

    بستن #9791 (#9791 https://github.com/pylint-dev/pylint/issues/9791)

  • افزودن using-assignment-expression-in-unsupported-version / W2605 <#using-assignment-expression-in-unsupported-version> برای موارد استفاده از := (عملگر والروس / walrus) در نسخه‌های پایتون پایین‌تر از 3.8 ارائه‌شده با --py-version.

    بستن #9820 (#9820 https://github.com/pylint-dev/pylint/issues/9820)

  • افزودن using-positional-only-args-in-unsupported-version / W2606 <#using-positional-only-args-in-unsupported-version> برای موارد استفاده از آرگومان‌های positional-only در نسخه‌های پایتون پایین‌تر از 3.8 ارائه‌شده با --py-version.

    بستن #9823 (#9823 https://github.com/pylint-dev/pylint/issues/9823)

  • افزودن unnecessary-default-type-args / R6007 <#unnecessary-default-type-args> به افزونهٔ typing برای تشخیص استفاده از آرگومان‌های نوع پیش‌فرض غیرضروری برای typing.Generator https://docs.python.org/3/library/typing.html#typing.Generator و typing.AsyncGenerator https://docs.python.org/3/library/typing.html#typing.AsyncGenerator.

    ارجاع به #9938 (#9938 https://github.com/pylint-dev/pylint/issues/9938)

  • استفاده از --enable به همراه --disable=all اکنون در صورت به‌کارگیری یک msg code ناشناخته، خطا ایجاد می‌کند. پیام‌های داخلی pylint دیگر تحت تأثیر --disable=all قرار نمی‌گیرند.

    بستن #9403 (#9403 https://github.com/pylint-dev/pylint/issues/9403)

  • عبارت‌های باقاعدهٔ غیرقابل کامپایل برای مسیرها در پیکربندی یا آرگومان‌های داده‌شده به pylint دیگر موجب کرش کردن برنامه نخواهند شد، بلکه یک خطای argparse صادر کرده و در عوض پیام خطای حاصل از re.compile را نمایش می‌دهند.

    بستن #9680 (#9680 https://github.com/pylint-dev/pylint/issues/9680)

  • رفع باگی که در آن فایل tox.ini حاوی پیکربندی pylint، در صورت موجود بودن در دایرکتوری جاری، نادیده گرفته می‌شد.

    فایل‌های .cfg و .ini حاوی پیکربندی Pylint اکنون می‌توانند از بخشی به نام [pylint] استفاده کنند. این بهبود بر حالتی تأثیر می‌گذارد که این نوع فایل‌ها در صورت موجود بودن و عدم ارجاع صریح با استفاده از گزینهٔ --rcfile، به عنوان پیش‌فرض مورد استفاده قرار می‌گیرند.

    بستن #9727 (#9727 https://github.com/pylint-dev/pylint/issues/9727)

  • بهبود شناسایی فایل‌ها برای دایرکتوری‌هایی که بسته‌های پایتون نیستند.

    بستن #9764 (#9764 https://github.com/pylint-dev/pylint/issues/9764)

  • تمام متغیرها، کلاس‌ها، توابع و نام‌های فایلی که شامل واژهٔ 'similar' بودند، در حالی که در واقع به 'symilar' (برنامهٔ مستقل برای بررسی duplicate-code / R0801 <#duplicate-code>) اشاره داشتند، به 'symilar' تغییر نام داده شدند.

    بستن #9734 (#9734 https://github.com/pylint-dev/pylint/issues/9734)

  • حذف کدهای مربوط به کلاس‌های سبک قدیم (Python 2) و حذف بررسی برای کلاس‌های سبک جدید؛ چرا که در Python 3 همه چیز سبک جدید (new-style) است. مستندات بررسی‌کنندهٔ استثناها برای حذف ارجاع به کلاس سبک جدید به‌روزرسانی شد.

    ارجاع به #9925 (#9925 https://github.com/pylint-dev/pylint/issues/9925)

انتشار
3.2
تاریخ
اعلام خواهد شد (TBA)

تاریخ انتشار: 2024-08-31

•
رفع هشدار مثبت کاذب unreachable برای توابع coroutine با نوع بازگشتی NoReturn.

بستن #9840. (#9840 https://github.com/pylint-dev/pylint/issues/9840)

  • رفع crash در بررسی‌کنندهٔ بازآفرینی کد (refactoring checker) هنگام فراخوانی یک lambda که به عنوان یک متد مقید (bound) شده است.

    بستن #9865 (#9865 https://github.com/pylint-dev/pylint/issues/9865)

  • رفع crash در undefined-loop-variable هنگام ارائهٔ آرگومان iterable به enumerate().

    بستن #9875 (#9875 https://github.com/pylint-dev/pylint/issues/9875)

  • رفع خطای مربوط به عدم قطعیت در پیام خطا در حالتی که نام یک ماژول با ماژولی دیگر در یک فضای نام (namespace) جداگانه یکسان باشد.

    ارجاع به #9883 (#9883 https://github.com/pylint-dev/pylint/issues/9883)

تاریخ انتشار: 2024-07-21

  • خاموش‌سازی هشدارهای مثبت کاذب برای unexpected-keyword-arg هنگامی که pylint نمی‌تواند تشخیص دهد کدام‌یک از دو یا چند کلاس با تعریف پویا در حال نمونه‌سازی (instantiate) است.

    بستن #9672 (#9672 https://github.com/pylint-dev/pylint/issues/9672)

  • رفع هشدار مثبت کاذب برای missing-param-doc در جایی که انتظار می‌رفت متدی که با typing.overload تزیین شده است، دارای یک docstring برای مشخص کردن پارامترهایش باشد.

    بستن #9739 (#9739 https://github.com/pylint-dev/pylint/issues/9739)

  • رفع یک پس‌رفت (regression) که باعث صدور هشدار invalid-name برای صفات کلاسی می‌شد که صرفاً نام‌های نامعتبر یک کلاس والد (ancestor) را بازنویسی (override) می‌کردند.

    بستن #9765 (#9765 https://github.com/pylint-dev/pylint/issues/9765)

  • رفتار یکسان با assert_never() هنگامی که از typing_extensions وارد (import) می‌شود.

    بستن #9780 (#9780 https://github.com/pylint-dev/pylint/issues/9780)

  • رفع هشدار مثبت کاذب برای consider-using-min-max-builtin هنگامی که مقصد انتساب یک صفت (attribute) است.

    ارجاع به #9800 (#9800 https://github.com/pylint-dev/pylint/issues/9800)

تاریخ انتشار: 2024-06-28

•
رفع مثبت کاذب unreachable-code هنگام استفاده از typing.Any به‌عنوان نوع بازگشتی در python 3.8؛ با این حال typing.NoReturn دیگر برای python 3.8 در نظر گرفته نمی‌شود.

بسته شد #9751 (#9751 https://github.com/pylint-dev/pylint/issues/9751)

تاریخ انتشار: 2024-06-26

•
جلوگیری از صدور possibly-used-before-assignment هنگام اتکا به نام‌هایی که صرفاً احتمالاً در بلوک‌های شرطیِ محافظت‌شده توسط توابع دارای حاشیه‌نویسی typing.Never یا typing.NoReturn تعریف نشده‌اند.

بسته شد #9674 (#9674 https://github.com/pylint-dev/pylint/issues/9674)

  • رفع کرش هنگامی که شماره خط (lineno) متغیری که به‌عنوان حاشیه‌نویسی استفاده شده بود برای undefined-variable در دسترس نبود.

    بسته شد #8866 (#8866 https://github.com/pylint-dev/pylint/issues/8866)

  • رفع کرش هنگامی که مقدار start در یک enumerate غیرثابت و استنتاج آن غیرممکن بود (مانند ``enumerate(apples, start=int(random_apple_index)``) برای unnecessary-list-index-lookup.

    بسته شد #9078 (#9078 https://github.com/pylint-dev/pylint/issues/9078)

  • رفع کرش در symilar هنگامی که گزینه کوتاه -d یا -i به‌درستی شناخته نمی‌شد. هنوز انجام -d=1 غیرممکن است (باید از -d 1 استفاده کنید).

    بسته شد #9343 (#9343 https://github.com/pylint-dev/pylint/issues/9343)

تاریخ انتشار: 2024-06-06

  • کلاس‌هایی که تنها یک سه‌نقطه (...) در بدنهٔ خود دارند، در صورت تک‌خطی بودن (مطابق با شیوه‌نامهٔ ۲۰۲۴ ابزار black) دیگر هشدار multiple-statements / C0321 <#multiple-statements>' را برنمی‌انگیزند.

    بسته شد #9398 (#9398 https://github.com/pylint-dev/pylint/issues/9398)

  • رفع مثبت کاذب برای redefined-outer-name هنگامی که نامی در یک بلوک مدیریت استثنا تعریف شده که با یک متغیر محلیِ تعریف‌شده در بدنهٔ تابع هم‌نام است.

    بسته شد #9671 (#9671 https://github.com/pylint-dev/pylint/issues/9671)

  • رفع مثبت کاذب برای use-yield-from هنگام استفاده از مقدار بازگشتیِ اتمِ yield.

    بسته شد #9696 (#9696 https://github.com/pylint-dev/pylint/issues/9696)

تاریخ انتشار: 2024-05-20

  • رفع چندین مثبت کاذب برای نحو کلاس جامع (generic class syntax) که در Python 3.12 (PEP 695) اضافه شده است.

    بسته شد #9406 (#9406 https://github.com/pylint-dev/pylint/issues/9406)

  • مستثنی کردن مدیر زمینه (context manager) بدون پاک‌سازی از بررسی‌های contextmanager-generator-missing-cleanup.

    بسته شد #9625 (#9625 https://github.com/pylint-dev/pylint/issues/9625)

    تاریخ انتشار: 2024-05-18

  • مستثنی کردن شاخه‌های if/else حاوی توابع پایان‌دهنده (مانند sys.exit()) از بررسی‌های possibly-used-before-assignment.

    بسته شد #9627 (#9627 https://github.com/pylint-dev/pylint/issues/9627)

  • عدم صدور هشدارهای typevar-name-incorrect-variance برای TypeVarهای سبک PEP 695. تغییرپذیری (variance) به‌طور خودکار توسط بررسی‌کننده نوع استنتاج می‌شود. افزودن پسوند _co یا _contra می‌تواند به استدلال در مورد TypeVar کمک کند.

    ارجاع به #9638 (#9638 https://github.com/pylint-dev/pylint/issues/9638)

  • رفع یک مثبت کاذب برای possibly-used-before-assignment هنگام استفاده از typing.assert_never() (نسخه 3.11+) برای نشان دادن جامعیت (exhaustiveness).

    بسته شد #9643 (#9643 https://github.com/pylint-dev/pylint/issues/9643)

  • رفع یک منفی کاذب برای --ignore-patterns هنگامی که دایرکتوری مورد بررسی با نقطه (.) مشخص شده و همه فایل‌ها نادیده گرفته می‌شوند، به جای اینکه فقط فایل‌هایی که نامشان با نقطه آغاز می‌شود نادیده گرفته شوند.

    بسته شد #9273 (#9273 https://github.com/pylint-dev/pylint/issues/9273)

  • بازگرداندن بخش "errors / warnings by module" به خروجی گزارش (با -ry).

    بسته شد #9145 (#9145 https://github.com/pylint-dev/pylint/issues/9145)

  • هشدار trailing-comma-tuple اکنون پس از حذف یک بهینه‌سازی بیش‌ازحد، در صورتی که به‌صورت سراسری غیرفعال ولی از طریق کنترل محلی پیام فعال شده باشد، باید به‌درستی صادر شود.

    ارجاع به #9608. (#9608 https://github.com/pylint-dev/pylint/issues/9608)

  • افزودن گزینه --prefer-stubs=yes برای فعال‌سازی اختیاری قابلیت astroid 3.2 که فایل‌های خرد (stub) .pyi را به فایل‌های همنام .py ترجیح می‌دهد. این کار پتانسیل کاهش خطاهای no-member را دارد، اما به قیمت خطاهای بیشتری مانند not-an-iterable از بدنه توابعی که به صورت ... ظاهر می‌شوند تمام می‌شود.

    پیش‌فرض no است.

    بسته شد #9626 بسته شد #9623 (#9626 https://github.com/pylint-dev/pylint/issues/9626)

•
به‌روزرسانی نسخه astroid به 3.2.1. این کار برخی گزارش‌های RecursionError را حل کرده و همچنین ویژگی prefer .pyi stubs را در astroid 3.2.0 با گزینه پیش‌گفته --prefer-stubs=y به‌صورت اختیاری (opt-in) درمی‌آورد.

ارجاع به #9139 (#9139 https://github.com/pylint-dev/pylint/issues/9139)

تاریخ انتشار: 2024-05-14

  • درک six.PY2 و six.PY3 برای وارد کردن‌های شرطی (conditional imports).

    بسته شد #3501 (#3501 https://github.com/pylint-dev/pylint/issues/3501)

  • یک گزارشگر جدید github اضافه شده است. این گزارشگر خروجی pylint را در قالبی بازمی‌گرداند که Github می‌تواند برای حاشیه‌نویسی خودکار کد از آن استفاده کند. از آن با pylint --output-format=github در Github Workflows خود استفاده کنید.

    بسته شد #9443. (#9443 https://github.com/pylint-dev/pylint/issues/9443)

  • افزودن بررسی possibly-used-before-assignment هنگام اتکا به نام‌ها پس از ساختار شرطی if/else، در حالتی که یکی از شاخه‌ها نتواند نام را تعریف کند، استثنا ایجاد کند (raise)، یا مقداری بازگرداند (return).

    بسته شد #1727 (#1727 https://github.com/pylint-dev/pylint/issues/1727)

  • بررسی مولدهایی (generators) که از contextmanagerهایی استفاده می‌کنند که پاک‌سازی را به‌درستی انجام نمی‌دهند. هدف این بررسی، آگاهی‌بخشی در مواردی است که یک مولد به‌طور کامل مصرف (exhaust) نمی‌شود و contextmanager به‌درستی پاک‌سازی نمی‌گردد. یک contextmanager باید مقداری غیرثابت تولید کند (yield) و پاک‌سازی را برای GeneratorExit انجام ندهد. مولدِ استفاده‌کننده باید تلاش کند تا از مقدار زمینه تولیدشده با with x() as y استفاده کند و نه صرفاً با with x().

    بسته شد #2832 (#2832 https://github.com/pylint-dev/pylint/issues/2832)

  • گره‌های If و Try اکنون برای دستورهای return بلااستفاده نیز بررسی می‌شوند.

    بسته شدن #9449. (#9449 https://github.com/pylint-dev/pylint/issues/9449)

  • رفع منفی کاذب برای property-with-parameters در مواردی که پارامترها به صورت positional-only، keyword-only، variadic positional یا variadic keyword هستند.

    بسته شدن #9584 (#9584 https://github.com/pylint-dev/pylint/issues/9584)

اکنون pylint مقادیر بازگشتی دکوراتور @overload را بهتر درک می‌کند.

بسته شدن #4696 (#4696 https://github.com/pylint-dev/pylint/issues/4696) ارجاع به #9606 (#9606 https://github.com/pylint-dev/pylint/issues/9606)

  • ماژول‌های نادیده‌گرفته‌شده اکنون به‌جای اینکه ابتدا بررسی و سپس نادیده گرفته شوند، دیگر اصلاً بررسی نمی‌شوند. این امر باید سرعت تحلیل پایگاه‌کدهای بزرگی را که دارای ماژول‌های نادیده‌گرفته‌شده هستند، افزایش دهد.

    بسته شدن #9442 (#9442 https://github.com/pylint-dev/pylint/issues/9442) (#9442 https://github.com/pylint-dev/pylint/issues/9442)

  • منطق ImportChecker اصلاح شده است تا در صورت امکان از context files اجتناب کند. این تغییر، کش‌کردن جستجوهای ماژول را در astroid ممکن ساخته و زمان اجرا را کاهش می‌دهد.

    ارجاع به #9310. (#9310 https://github.com/pylint-dev/pylint/issues/9310)

  • بررسی داخلی برای فعال بودن یا نبودن trailing-comma-tuple برای یک فایل، اکنون به‌جای اینکه برای هر نشانه (token) یک بار انجام شود، یک بار به ازای هر فایل انجام می‌شود.

    ارجاع به #9608. (#9608 https://github.com/pylint-dev/pylint/issues/9608)

انتشار
3.1
تاریخ
2024-02-25

دو بررسی جدید -- use-yield-from، deprecated-attribute -- و تعدادی رفع اشکال.

تاریخ انتشار: 2024-05-13

  • در نظر گرفتن attrs.define و attrs.frozen به‌عنوان دکوراتورهای dataclass در بررسی too-few-public-methods.

    بسته شدن #9345 (#9345 https://github.com/pylint-dev/pylint/issues/9345)

  • رفع یک مثبت کاذب در singledispatchmethod-function هنگامی که یک متد هم با functools.singledispatchmethod و هم با staticmethod تزیین شده باشد.

    بسته شدن #9531 (#9531 https://github.com/pylint-dev/pylint/issues/9531)

  • رفع یک مثبت کاذب برای consider-using-dict-items هنگام پیمایش با استفاده از keys() و سپس حذف یک مورد با استفاده از کلید برای جستجو (lookup).

    بسته شدن #9554 (#9554 https://github.com/pylint-dev/pylint/issues/9554)

تاریخ انتشار: 2024-02-25

  • پیام جدید use-yield-from به بازبین بازآرایی (refactoring checker) افزوده شد. این پیام زمانی صادر می‌شود که بتوان ساختار yielding در یک حلقه را با yield from جایگزین کرد.

    بسته شدن #9229. (#9229 https://github.com/pylint-dev/pylint/issues/9229)

  • پیام deprecated-attribute برای بررسی ویژگی‌های منسوخ‌شده در کتابخانه استاندارد (stdlib) افزوده شد.

    بسته شدن #8855 (#8855 https://github.com/pylint-dev/pylint/issues/8855)

  • گسترش پیام‌های broad-exception-raised / W0719 <#broad-exception-raised> و broad-exception-caught / W0718 <#broad-exception-caught> به دستور *except.

    بسته شدن #8827 (#8827 https://github.com/pylint-dev/pylint/issues/8827)

  • رفع یک مورد منفی کاذب برای بلوک‌های غیرضروری if که از ترتیبی از آرگومان‌ها متفاوت از مقدار مورد انتظار استفاده می‌کردند.

    بسته شدن #8947. (#8947 https://github.com/pylint-dev/pylint/issues/8947)

•
بهبود پیام ارائه‌شده برای بررسی wrong-import-order / C0411 <#wrong-import-order>. به جای دستور واردکردن ("import x")، اکنون پیام مشخص می‌کند که کدام واردکردن خارج از ترتیب است و چه مواردی باید پس از آن قرار گیرند. همان‌طور که در گزارش اشکال مطرح شده بود، این تغییر به‌ویژه زمانی مفید است که چندین واردکردن در یک خط قرار دارند و از قرارداد PEP8 پیروی نمی‌کنند.

پیامْ موارد واردکردن را به صورت زیر گزارش خواهد کرد: برای "import X"، پیام "(standard/third party/first party/local) import X" گزارش می‌شود برای "import X.Y" و "from X import Y"، پیام "(standard/third party/first party/local) import X.Y" گزارش می‌شود دسته‌بندی واردکردن به این منظور مشخص شده است تا دلیل صدور پیام توسط pylint توضیح داده شود و توسعه‌دهنده برای نحوه رفع مشکل راهنمایی گردد.

بسته شدن #8808 (#8808 https://github.com/pylint-dev/pylint/issues/8808)

•
به‌روزرسانی نسخه astroid به 3.1.0.

ارجاع به #9457 (#9457 https://github.com/pylint-dev/pylint/issues/9457)

انتشار (Release)
3.0.0
تاریخ (Date)
2023-10-02

ابزار Pylint اکنون به‌طور رسمی از python 3.12 پشتیبانی می‌کند.

این نسخه اصلی که مدت‌ها در انتظار آن بودیم، علاوه بر اعمال تغییرات ساختارشکن (breaking changes) ضروری و منسوخ‌سازی‌هایی که از مدت‌ها پیش اعلام شده بود، بهبودهای مهمی در قابلیت استفاده و کارایی به همراه دارد. همچنین مستندسازی هر پیام به همراه مثال در آستانه تکمیل است.

نسخه موردنیاز astroid اکنون 3.0.0 است. برای اطلاع از رفع اشکال‌ها، ویژگی‌ها و بهبودهای کارایی مضاعف قابل اعمال روی pylint، به یادداشت‌های تغییرات astroid در https://pylint.readthedocs.io/projects/astroid/en/latest/changelog.html#what-s-new-in-astroid-3-0-0 مراجعه کنید.

کد پروژه اکنون به طور کامل با اعلان نوع مشخص شده است (fully typed). پیام invalid-name دیگر به‌طور پیش‌فرض حداقل طول ۳ نویسه را بررسی نمی‌کند. وابستگی‌هایی مانند wrapt یا setuptools حذف شدند.

یک گزارش‌گر جدید به نام json2 اضافه شده است. این گزارش‌گر خروجی غنی‌تری ارائه می‌دهد که تجزیه آن ساده‌تر است و اطلاعات بیشتری فراهم می‌کند؛ در ادامه یک نمونه خروجی آمده است:

{
    "messages": [
        {
            "type": "convention",
            "symbol": "line-too-long",
            "message": "Line too long (1/2)",
            "messageId": "C0301",
            "confidence": "HIGH",
            "module": "0123",
            "obj": "",
            "line": 1,
            "column": 0,
            "endLine": 1,
            "endColumn": 4,
            "path": "0123",
            "absolutePath": "0123"
        }
    ],
    "statistics": {
        "messageTypeCount": {
            "fatal": 0,
            "error": 0,
            "warning": 0,
            "refactor": 0,
            "convention": 1,
            "info": 0
        },
        "modulesLinted": 1,
        "score": 5.0
    }
}

تاریخ انتشار: 2024-02-23

  • هشدار used-before-assignment دیگر هنگام استفاده از یک نام در حلقه و وابستگی به انتساب قبلی آن نام در یک بلوک except جفت‌شده با else: continue صادر نمی‌شود.

    بستن #6804 (#6804 https://github.com/pylint-dev/pylint/issues/6804)

  • جلوگیری از هشدارهای نادرست برای no-member مربوط به ویژگی‌های تابع که توسط دکوراتورها فراهم شده‌اند.

    بستن #9246 (#9246 https://github.com/pylint-dev/pylint/issues/9246)

  • رفع هشدار نادرست nested-min-max / W3301 <#nested-min-max> برای لیست‌های تو در تو.

    بستن #9307 (#9307 https://github.com/pylint-dev/pylint/issues/9307)

  • رفع هشدار نادرست برای used-before-assignment در بلوک finally هنگامی که انتساب‌ها هم در بلوک try و هم در هر یک از گرداننده‌های استثنا صورت گرفته باشند.

    بستن #9451 (#9451 https://github.com/pylint-dev/pylint/issues/9451)

•
گرفتن خطای نادرست ValueError با عنوان "generator already executing" برای Python 3.12.0 - 3.12.2. این مورد در بالادست (upstream) در Python 3.12.3 برطرف شده است.

بستن #9138 (#9138 https://github.com/pylint-dev/pylint/issues/9138)

تاریخ انتشار: 2023-12-11

  • رفع هشدار نادرست برای unnecessary-lambda هنگامی که فراخوانی دارای آرگومان‌های کلیدواژه‌ای است اما تابع lambda فاقد آن است.

    بستن #9148 (#9148 https://github.com/pylint-dev/pylint/issues/9148)

  • رفع پیشنهاد نادرست برای رونوشت سطحی (shallow copy) در unnecessary-comprehension / R1721 <#unnecessary-comprehension>

    نمونه‌ای از پیشنهاد: #pylint: disable=:ref:missing-module-docstring a = [1, 2, 3] b = [x for x in a] b[0] = 0 print(a) # [1, 2, 3]

    پس از تغییر b = [x for x in a] به b = a بر پایهٔ این پیشنهاد، اسکریپت اکنون مقدار [0, 2, 3] را چاپ می‌کند. پیشنهاد درست برای حفظ رفتار اصلی باید استفاده از list(a) باشد.

    بستن #9172 (#9172 https://github.com/pylint-dev/pylint/issues/9172)

  • رفع هشدارهای نادرست برای undefined-variable و unused-argument برای کلاس‌ها و توابعی که از نحو نوع جنریک در Python 3.12 استفاده می‌کنند.

    بستن #9193 (#9193 https://github.com/pylint-dev/pylint/issues/9193)

  • رفع هشدار نادرست pointless-string-statement برای رشته‌های مستندات (docstrings) در نام‌های مستعار نوع (type aliases) در Python 3.12.

    بستن #9268 (#9268 https://github.com/pylint-dev/pylint/issues/9268)

  • رفع هشدار نادرست برای invalid-exception-operation هنگام الحاق تاپل‌هایی از انواع استثنا.

    بستن #9288 (#9288 https://github.com/pylint-dev/pylint/issues/9288)

•
رفع باگی که در آن pylint در صورت وجود فایل __init__.py در یک دایرکتوری، قادر به پیمایش بازگشتی در آن دایرکتوری نبود.

بستن #9210 (#9210 https://github.com/pylint-dev/pylint/issues/9210)

تاریخ انتشار: 2023-10-22

•
رفع مثبت کاذب used-before-assignment برای نحو نوع‌های جنریک (PEP 695، Python 3.12).

بسته‌شده در #9110 (#9110 https://github.com/pylint-dev/pylint/issues/9110)

تاریخ انتشار: 2023-10-05

•
رفع مثبت کاذب برای inherit-non-class در Protocolهای نوع عام (generic Protocols).

بسته‌شده در #9106 (#9106 https://github.com/pylint-dev/pylint/issues/9106)

•
رفع یک فروپاشی (crash) هنگام تعریف کلاس enum که هم‌زمان با دکوراتور dataclasses.dataclass تزیین شده است.

بسته‌شده در #9100 (#9100 https://github.com/pylint-dev/pylint/issues/9100)

تاریخ انتشار: 2023-10-02

•
فعال‌سازی یا غیرفعال‌سازی پیام‌های مجزا اکنون حتی در صورتی که به دنبال آن‌ها --enable=all یا disable=all در همان فایل پیکربندی (یا در خط فرمان) بیاید، اِعمال خواهد شد.

این بدان معناست که در مثال زیر، پیام‌های fixme اکنون صادر خواهند شد:

pylint my_module --enable=fixme --disable=all

برای بازگشت به رفتار پیشین، گزینهٔ زائد قبلی را حذف کنید.

بسته‌شده در #3696 (#3696 https://github.com/pylint-dev/pylint/issues/3696)

  • حذف پشتیبانی از اجرای pylint با Python 3.7. کدی که از Python 3.7 پشتیبانی می‌کند کماکان با تنظیم --py-version=3.7 قابل تحلیل و ارزیابی است.

    ارجاع به #6306 (#6306 https://github.com/pylint-dev/pylint/issues/6306)

  • غیرفعال‌سازی‌های قرار داده شده در یک بلوک try اکنون روی بلوک except نیز اِعمال می‌شوند. پیش از این، این اتفاق تنها در صورت حضور یک بند else رخ می‌داد.

    ارجاع به #7767 (#7767 https://github.com/pylint-dev/pylint/issues/7767)

  • اکنون pyreverse از یک پالت رنگی پیش‌فرض جدید استفاده می‌کند که برای افراد مبتلا به کوررنگی مناسب‌تر است. طرح رنگ از یادداشت‌های Paul Tol در https://personal.sron.nl/~pault برگرفته شده است. اگر رنگ‌های دیگری را ترجیح می‌دهید، می‌توانید از گزینهٔ --color-palette برای مشخص کردن رنگ‌های سفارشی استفاده کنید.

    بسته‌شده در #8251 (#8251 https://github.com/pylint-dev/pylint/issues/8251)

  • تمام موارد مرتبط با ساختار __implements__ حذف شد. این ساختار بر پایهٔ PEP245 بود که در سال ۲۰۰۱ پیشنهاد و در سال ۲۰۰۶ رد شد.

    قابلیت pyreverse برای در نظر گرفتن __implements__ هنگام تولید نمودارها نیز حذف گردید.

    ارجاع به #8404 (#8404 https://github.com/pylint-dev/pylint/issues/8404)

  • pyreverse: پشتیبانی از قالب خروجی .vcg ‏(Visualization of Compiler Graphs) کنار گذاشته شد.

    بسته‌شده در #8416 (#8416 https://github.com/pylint-dev/pylint/issues/8416)

  • هشدار مربوط به یافت شدن دایرکتوری قدیمی و اکنون بلااستفادهٔ حافظهٔ پنهان pylint ‏(pylint.d) حذف شد. دایرکتوری حافظهٔ پنهان در بخش FAQ https://pylint.readthedocs.io/en/latest/faq.html#where-is-the-persistent-data-stored-to-compare-between-successive-runs مستند شده است.

    ارجاع به #8462 (#8462 https://github.com/pylint-dev/pylint/issues/8462)

  • پس از یک دورهٔ منسوخ‌سازی (deprecation)، pylint.config.PYLINTRC حذف شد. به‌جای آن از مولد pylint.config.find_default_config_files استفاده کنید.

    بسته‌شده در #8862 (#8862 https://github.com/pylint-dev/pylint/issues/8862)

•
پیام invalid-name به‌طور پیش‌فرض دیگر حداقل طول ۳ نویسه را بررسی نمی‌کند. (این مورد یک درهم‌آمیختگیِ ناگفته میان دغدغه‌های مربوط به بزرگی و کوچکی حروف (casing) و طول نام بود و کاربران مرتباً گزارش می‌دادند که این رفتار غافلگیرکننده است.)

اگر همچنان بررسی حداقل طول مد نظر باشد، می‌توان آن را به دو روش بازگرداند:

  • اگر دریافت پیام disallowed-name (به‌جای invalid-name) برای شما کافی است، صرفاً گزینهٔ bad-names-rgxs="^..?$" را اضافه کنید که نام‌های دارای ۱ تا ۲ نویسه را رد می‌کند. (اطمینان حاصل کنید که disallowed-name را فعال کرده باشید.)
  • اگر ترجیح می‌دهید پیام invalid-name صادر شود، یا مایلید کنترل دقیق‌تری بر شرایط صدور پیام‌ها داشته باشید (کلاس‌ها در برابر متدها و غیره)، از گزینه‌های عبارت منظم (regex) شرح داده شده در اینجا استفاده کنید: https://pylint.readthedocs.io/en/stable/user_guide/configuration/all-options.html#main-checker. (به‌ویژه به گزینه‌های غیرفعال‌شده (کامنت‌شده) در «پیکربندی نمونه» ارائه‌شده در پایین آن بخش توجه فرمایید.) عبارات منظم پیشین را می‌توان در درخواست ادغام (pull request) به نشانی https://github.com/pylint-dev/pylint/pull/8813 که الزامات طول را حذف کرده است، یافت.

بسته شد #2018 (#2018 https://github.com/pylint-dev/pylint/issues/2018)

•
بررسی‌کنندهٔ مقایسه با رشتهٔ خالی (pylint.extensions.emptystring) و بررسی‌کنندهٔ مقایسه با صفر (pylint.extensions.compare-to-zero) حذف شده‌اند و بررسی‌های آن‌ها اکنون بخشی از بررسی‌کنندهٔ مقادیر بولی ضمنی (implicit booleaness) است:
  • نام compare-to-zero به use-implicit-booleaness-not-comparison-to-zero و نام compare-to-empty-string به use-implicit-booleaness-not-comparison-to-string تغییر یافت و اکنون باید به‌صورت صریح فعال شوند.
  • افزونه‌های pylint.extensions.emptystring و pylint.extensions.compare-to-zero دیگر وجود ندارند و باید از گزینهٔ load-plugins حذف شوند.
  • پیام‌های مربوط به مقادیر بولی ضمنی واضح‌تر و کاربردی‌تر شده‌اند. این کار امکان شفاف‌سازی شباهت‌های آن‌ها را فراهم کرده و با توجه به این‌که بیشتر شرایط لازم برای صادر شدن آن‌ها مشترک است، عملکرد بهتری را ارائه خواهد داد.

بسته شد #6871 (#6871 https://github.com/pylint-dev/pylint/issues/6871)

  • ابزار epylint حذف شد. این ابزار اکنون در این نشانی نگه‌داری می‌شود: https://github.com/emacsorphanage/pylint.

    ارجاع به #7737 (#7737 https://github.com/pylint-dev/pylint/issues/7737)

  • گزینهٔ overgeneral-exceptions اکنون فقط نام‌های کاملاً واجد شرایط (fully qualified names) را در نظر می‌گیرد (builtins.Exception و نه Exception). اگر این گزینه را بازنویسی کرده بودید، اکنون باید از نام کاملاً واجد شرایط استفاده کنید.

    هنوز یک هشدار صادر می‌شود، اما در نسخهٔ 3.1.0 حذف خواهد شد.

    ارجاع به #8411 (#8411 https://github.com/pylint-dev/pylint/issues/8411)

  • پس از یک دورهٔ منسوخ‌سازی (deprecation)، دیگر امکان استفاده از MASTER یا master به‌عنوان بخش پیکربندی در setup.cfg یا tox.ini وجود ندارد. شروع نکردن عنوان بخش با نام ابزار، شیوهٔ نامناسبی است. لطفاً به‌جای آن از pylint.main استفاده کنید.

    ارجاع به #8465 (#8465 https://github.com/pylint-dev/pylint/issues/8465)

  • اکنون هنگام اجرای Pyreverse، آمار بسته چاپ می‌شود و یک پرچم --verbose برای دریافت خروجی اصلی همراه با ماژول‌های تجزیه‌شده اضافه شده است. اگر می‌خواهید خروجی قبلی را حفظ کنید، ممکن است لازم باشد گزینهٔ verbose را فعال نمایید.

    بسته شد #8973 (#8973 https://github.com/pylint-dev/pylint/issues/8973)

  • یک گزارش‌گر جدید json2 اضافه شده است. این گزارش‌گر خروجی غنی‌تری ارائه می‌دهد که تجزیهٔ آن آسان‌تر است و اطلاعات بیشتری فراهم می‌کند.

    در مقایسه با json، تنها تغییرات این است که پیام‌ها اکنون ذیل کلید "messages" قرار دارند و "message-id" اکنون از شیوهٔ نگارش camelCase پیروی کرده و به "messageId" تغییر نام یافته است. گزارش‌گر جدید همچنین «امتیاز» ("score") ماژول‌های تحلیل‌شده را بر اساس تعریف ارائه‌شده در گزینهٔ evaluation گزارش می‌دهد و آماری را در رابطه با ماژول‌های بررسی‌شده فراهم می‌کند.

    از آن‌جا که نگه‌داری گزارش‌گر json متوقف خواهد شد، کاربران را تشویق می‌کنیم تا از گزارش‌گر جدید استفاده نمایند.

    بسته شد #4741 (#4741 https://github.com/pylint-dev/pylint/issues/4741)

  • در نمودارهای وابستگی بسته‌های Pyreverse، زمانی که یک ماژول، ماژول دیگری را صرفاً برای بررسی نوع (type-checking) وارد (import) کند، نمایش داده می‌شود.

    بسته شد #8112 (#8112 https://github.com/pylint-dev/pylint/issues/8112)

  • گزینهٔ جدید (--show-stdlib، -L) به pyreverse اضافه شد. این گزینه رفتاری مشابه --show-builtin دارد، بدین صورت که ماژول‌های کتابخانهٔ استاندارد اکنون به‌طور پیش‌فرض گنجانده نمی‌شوند، و با فعال‌سازی این گزینه گنجانده خواهند شد.

    بسته شد #8181 (#8181 https://github.com/pylint-dev/pylint/issues/8181)

  • گزینه‌ای به Pyreverse برای مستثنی کردن گره‌های منفرد و مستقل از نمودارها با --no-standalone اضافه شد.

    بسته شد #8476 (#8476 https://github.com/pylint-dev/pylint/issues/8476)

  • افزودن ماژول DataclassChecker و بررسی‌کنندهٔ invalid-field-call جهت بررسی استفاده‌های نامعتبر از dataclasses.field().

    ارجاع به #5159 (#5159 https://github.com/pylint-dev/pylint/issues/5159)

  • افزودن return-in-finally برای صدور پیام در صورتی که یک عبارت return درون بند finally یافت شود.

    بستن #8260 (#8260 https://github.com/pylint-dev/pylint/issues/8260)

  • افزودن پیام جدید kwarg-superseded-by-positional-arg برای هشدار زمانی که تابعی با یک آرگومان کلیدواژه‌ای فراخوانی می‌شود که نام یکسانی با یک پارامتر فقط-موضعی (positional-only) دارد و تابع شامل یک دیکشنری پارامتر متغیر کلیدواژه‌ای است. اضافه شدن آرگومان کلیدواژه‌ای به دیکشنری پارامترهای متغیر کلیدواژه‌ای ممکن است رفتاری غیرمنتظره باشد.

    بستن #8558 (#8558 https://github.com/pylint-dev/pylint/issues/8558)

•
افزودن پیام جدید prefer-typing-namedtuple به CodeStyleChecker برای پیشنهاد بازنویسی فراخوانی‌های collections.namedtuple به‌صورت کلاس‌هایی که از typing.NamedTuple ارث‌بری می‌کنند در Python 3.6+.

برای فعال‌سازی و صدور این پیام، به load-plugins=pylint.extensions.code_style و enable=prefer-typing-namedtuple نیاز است.

بستن #8660 (#8660 https://github.com/pylint-dev/pylint/issues/8660)

  • گسترش مفهوم "ابهام تابع" (function ambiguity) در safe_infer() از تفاوت در تعداد آرگومان‌های تابع، به تفاوت در مجموعهٔ نام‌های آرگومان.

    رفع موارد مثبت کاذب در tensorflow.

    بستن #3613 (#3613 https://github.com/pylint-dev/pylint/issues/3613)

  • رفع مثبت کاذب unused-argument هنگامی که __new__ از همهٔ آرگومان‌های __init__ استفاده نمی‌کند.

    بستن #3670 (#3670 https://github.com/pylint-dev/pylint/issues/3670)

  • رفع یک مثبت کاذب برای invalid-name هنگامی که یک متغیر کلاس دارای یادداشت نوع (type-annotated) در کلاس enum.Enum هیچ مقدار تخصیص‌یافته‌ای ندارد.

    ارجاع به #7402 (#7402 https://github.com/pylint-dev/pylint/issues/7402)

  • رفع مثبت کاذب unused-import برای استفاده از six.with_metaclass.

    بستن #7506 (#7506 https://github.com/pylint-dev/pylint/issues/7506)

  • رفع موارد منفی کاذب و مثبت کاذب برای too-many-try-statements، too-complex و too-many-branches از طریق شمارش صحیح دستورهای زیرمجموعهٔ یک try.

    ارجاع به #7767 (#7767 https://github.com/pylint-dev/pylint/issues/7767)

  • هنگام بررسی بازگشایی نامتوازن دیکشنری در حلقه‌های for، اکنون Pylint بررسی می‌کند که آیا طول هر مقدار برای بازگشایی با تعداد مقصدهای بازگشایی مطابقت دارد یا خیر. پیش‌تر، Pylint تعداد مقادیر را برای تکرار حلقه می‌سنجید که موجب ایجاد یک هشدار نادرست unbalanced-dict-unpacking / W0644 <#unbalanced-dict-unpacking> می‌شد.

    بستن #8156 (#8156 https://github.com/pylint-dev/pylint/issues/8156)

  • رفع مثبت کاذب برای used-before-assignment هنگامی که استفاده و مقداردهی با شرط یکسانی در دستورهای مختلف محافظت شده‌اند.

    بستن #8167 (#8167 https://github.com/pylint-dev/pylint/issues/8167)

  • افزودن asyncSetUp به فهرست پیش‌فرض defining-attr-methods برای ساکت کردن هشدار attribute-defined-outside-init هنگام استفاده از unittest.IsolatedAsyncioTestCase.

    ارجاع به #8403 (#8403 https://github.com/pylint-dev/pylint/issues/8403)

  • هشدار logging-not-lazy دیگر برای آرگومان‌های رشته‌ای که به صراحت به یکدیگر متصل شده‌اند، صادر نمی‌شود.

    بستن #8410 (#8410 https://github.com/pylint-dev/pylint/issues/8410)

  • رفع مثبت کاذب برای isinstance-second-argument-not-valid-type / W1116 <#isinstance-second-argument-not-valid-type> هنگامی که نوع‌های اجتماع شامل None باشند.

    بستن #8424 (#8424 https://github.com/pylint-dev/pylint/issues/8424)

  • هشدار invalid-name اکنون اجازهٔ استفاده از اعداد صحیح را در نام‌های typealias می‌دهد: - اکنون معتبر: Good2Name، GoodName2. - همچنان نامعتبر: _1BadName.

    بستن #8485 (#8485 https://github.com/pylint-dev/pylint/issues/8485)

  • دیگر Union به عنوان یادداشت نوع، در بررسی‌های نام‌گذاری به عنوان نام مستعار نوع در نظر گرفته نمی‌شود.

    بستن #8487 (#8487 https://github.com/pylint-dev/pylint/issues/8487)

  • هشدار unnecessary-lambda دیگر برای لامبداهایی که از پارامترهای خود در بدنه‌شان استفاده می‌کنند (به جز در آرگومان‌های نهایی) اخطار نمی‌دهد؛ مانند: lambda foo: (bar if foo else baz)(foo).

    بستن #8496 (#8496 https://github.com/pylint-dev/pylint/issues/8496)

  • اصلاح unused-import به‌گونه‌ای که گزینهٔ dummy-variables-rgx را رعایت کند.

    بستن #8500 (#8500 https://github.com/pylint-dev/pylint/issues/8500)

  • متغیرهای دارای نوع Union بدون تخصیص مقدار، دیگر به عنوان TypeAlias در نظر گرفته نمی‌شوند.

    بستن #8540 (#8540 https://github.com/pylint-dev/pylint/issues/8540)

  • مجاز دانستن رشته‌های متصل‌شدهٔ ضمنی درون پرانتز هنگامی که check-str-concat-over-line-jumps فعال است.

    بستن #8552. (#8552 https://github.com/pylint-dev/pylint/issues/8552)

  • رفع مثبت کاذب برای positional-only-arguments-expected هنگامی که یک تابع، هم شامل یک پارامتر فقط-موضعی دارای مقدار پیش‌فرض و هم شامل **kwargs است.

    بستن #8555 (#8555 https://github.com/pylint-dev/pylint/issues/8555)

  • رفع مثبت کاذب برای keyword-arg-before-vararg هنگامی که یک پارامتر فقط-موضعی دارای مقدار پیش‌فرض قبل از *args قرار می‌گیرد.

    بستن #8570 (#8570 https://github.com/pylint-dev/pylint/issues/8570)

  • رفع مثبت کاذب برای arguments-differ هنگام بازنویسی متد __init_subclass__.

    بستن #8919 (#8919 https://github.com/pylint-dev/pylint/issues/8919)

  • رفع مثبت کاذب برای no-value-for-parameter هنگامی که یک staticmethod در بدنهٔ کلاس فراخوانی می‌شود.

    بستن #9036 (#9036 https://github.com/pylint-dev/pylint/issues/9036)

  • صدور خطای used-before-assignment هنگام فراخوانی توابع در سطح ماژول پیش از تعریف آن‌ها.

    بسته شد #1144 (#1144 https://github.com/pylint-dev/pylint/issues/1144)

  • اعمال infer_kwarg_from_call() روی بررسی‌های بیشتر

    این تغییر بیشتر موارد منفی کاذب را برای بررسی‌های مختلف برطرف می‌کند، به‌جز یک مورد مثبت کاذب برای use-maxsplit-arg.

    بسته شد #7761 (#7761 https://github.com/pylint-dev/pylint/issues/7761)

  • متغیرهای TypeAlias تعریف‌شده در توابع اکنون از نظر خطاهای invalid-name بررسی می‌شوند.

    بسته شد #8536 (#8536 https://github.com/pylint-dev/pylint/issues/8536)

  • رفع منفی کاذب برای no-value-for-parameter هنگامی که تابعی با امضای شامل هر دو پارامتر فقط-موقعیتی name و همچنین *kwargs، با یک آرگومان کلیدواژه‌ای برای name فراخوانی می‌شود.

    بسته شد #8559 (#8559 https://github.com/pylint-dev/pylint/issues/8559)

  • رفع یک منفی کاذب برای too-many-arguments با در نظر گرفتن پارامترهای فقط-موقعیتی و فقط-کلیدواژه‌ای.

    بسته شد #8667 (#8667 https://github.com/pylint-dev/pylint/issues/8667)

  • صدور خطای assignment-from-no-return برای فراخوانی متدهای توکار مانند dict.update(). فراخوانی‌های list.sort() اکنون جهت سازگاری، به جای assignment-from-none خطای assignment-from-no-return را ایجاد می‌کنند.

    بسته شد #8714 بسته شد #8810 (#8714 https://github.com/pylint-dev/pylint/issues/8714)

  • پیام consider-using-augmented-assign اکنون برای دیکشنری‌ها و لیست‌ها نیز اعمال می‌شود.

    بسته شد #8959. (#8959 https://github.com/pylint-dev/pylint/issues/8959)

  • پشتیبانی از پیام duplicate-code هنگام اجرای موازی با --jobs.

    بسته شد #374 (#374 https://github.com/pylint-dev/pylint/issues/374)

  • پشتیبانی از پیام cyclic-import هنگام اجرای موازی با --jobs.

    بسته شد #4171 (#4171 https://github.com/pylint-dev/pylint/issues/4171)

  • اکنون می‌توان از --jobs همراه با --load-plugins استفاده کرد.

    این قابلیت در astroid 2.5.0 دچار پس‌رفت شده بود.

    بسته شد #4874 (#4874 https://github.com/pylint-dev/pylint/issues/4874)

  • افزونهٔ docparams کامنت‌های نوع (type comments) را به عنوان مستندات نوع در نظر می‌گیرد.

    بسته شد #6287 (#6287 https://github.com/pylint-dev/pylint/issues/6287)

  • هنگام تجزیهٔ فهرست‌های جداشده با کاما از عبارت‌های باقاعده در پیکربندی، کاماهای درون آکولادها نادیده گرفته می‌شوند، زیرا آن‌ها نشان‌دهندهٔ سورها (quantifiers) هستند، نه جداکنندهٔ میان عبارات.

    بسته شد #7229 (#7229 https://github.com/pylint-dev/pylint/issues/7229)

  • گزینهٔ ignored-modules اکنون به درستی برای no-name-in-module لحاظ خواهد شد.

    بسته شد #7578 (#7578 https://github.com/pylint-dev/pylint/issues/7578)

  • مقدار sys.argv اکنون همیشه به درستی به عنوان مقداری غیرقابل استنتاج در نظر گرفته می‌شود (به جای استفاده از مقادیر واقعی ارائه‌شده به pylint).

    بسته شد #7710 (#7710 https://github.com/pylint-dev/pylint/issues/7710)

  • جلوگیری از هشدارهای تکراری برای نام‌های استثنای نامشخص (unqualified) در تنظیمات overgeneral-exceptions هنگام اجرا با --jobs.

    بسته شد #7774 (#7774 https://github.com/pylint-dev/pylint/issues/7774)

  • فیلدهای کلاس در نمودارهای Pyreverse بیش از یک بار نمایش داده نمی‌شوند.

    بسته شد #8189 (#8189 https://github.com/pylint-dev/pylint/issues/8189)

  • رفع منفی کاذب used-before-assignment هنگامی که واردکردن‌های (imports) مربوط به TYPE_CHECKING در چندین حوزه (scope) استفاده می‌شوند.

    بسته شد #8198 (#8198 https://github.com/pylint-dev/pylint/issues/8198)

  • گزینهٔ --clear-cache-post-run اکنون حافظه‌های موقت LRU را نیز برای ابزارهای کمکی pylint که دارای ارجاعاتی به گره‌های AST هستند، پاک‌سازی می‌کند.

    بسته شد #8361 (#8361 https://github.com/pylint-dev/pylint/issues/8361)

  • رفع فروپاشی (crash) هنگام استفاده از TYPE_CHECKING بدون واردکردن آن.

    بسته شد #8434 (#8434 https://github.com/pylint-dev/pylint/issues/8434)

  • رفع یک مثبت کاذب used-before-assignment هنگامی که واردکردن‌ها زیر شاخهٔ else if مربوط به TYPE_CHECKING انجام شده باشند.

    بسته شد #8437 (#8437 https://github.com/pylint-dev/pylint/issues/8437)

  • رفع یک پس‌رفت در preferred-modules که در آن به جای تطابق کامل لازم، از یک تطابق جزئی استفاده می‌شد.

    بسته شد #8453 (#8453 https://github.com/pylint-dev/pylint/issues/8453)

  • رفع یک فروپاشی در pyreverse هنگامی که از نویسه‌های "/" در نام فایل خروجی استفاده می‌شود؛ مانند pyreverse -o png -p name/ path/to/project.

    بسته شد #8504 (#8504 https://github.com/pylint-dev/pylint/issues/8504)

  • عدم نمایش تکراری فلش‌ها در نمودارهای Pyreverse.

    بسته شد #8522 (#8522 https://github.com/pylint-dev/pylint/issues/8522)

  • بهبود خروجی پیام consider-using-generator برای فراخوانی‌های min() همراه با کلیدواژهٔ default.

    بسته شد #8563 (#8563 https://github.com/pylint-dev/pylint/issues/8563)

  • رفع فروپاشی هنگام تولید فایل پیکربندی: tomlkit.exceptions.TOMLKitError: Can't add a table to a dotted key ناشی از tomlkit نسخهٔ v0.11.8.

    بسته شد #8632 (#8632 https://github.com/pylint-dev/pylint/issues/8632)

  • رفع خطای شکست خط در خروجی dot نرم‌افزار Pyreverse.

    بسته شد #8671 (#8671 https://github.com/pylint-dev/pylint/issues/8671)

  • رفع یک مثبت کاذب برای method-hidden هنگام استفاده از دکوراتور cached_property.

    بسته شد #8753 (#8753 https://github.com/pylint-dev/pylint/issues/8753)

  • متدهای داندر (dunder) تعریف‌شده در lambda، در صورتی که نتوان آن‌ها را با فراخوانی غیرداندر جایگزین کرد، دیگر پیام unnecessary-dunder-call را صادر نمی‌کنند.

    بسته شد #8769 (#8769 https://github.com/pylint-dev/pylint/issues/8769)

  • عدم نمایش حاشیه‌نویسی‌های نوع تکراری در نمودارهای Pyreverse.

    بسته شد #8888 (#8888 https://github.com/pylint-dev/pylint/issues/8888)

  • رفع مشکل هشینگ ناهماهنگ در BaseChecker که باعث می‌شد برخی گزارش‌ها صادر نشوند.

    بسته شد #9001 (#9001 https://github.com/pylint-dev/pylint/issues/9001)

  • عدم افزودن Optional به حاشیه‌نویسی‌های | همراه با None در نمودارهای Pyreverse.

    بسته شد #9014 (#9014 https://github.com/pylint-dev/pylint/issues/9014)

  • نرم‌افزار Pyreverse دیگر چندین فلش ارتباط کلاس را نمایش نمی‌دهد، بلکه تنها قوی‌ترین آن‌ها را نشان می‌دهد.

    ارجاع به #9045 (#9045 https://github.com/pylint-dev/pylint/issues/9045)

  • جلوگیری از بین رفتن داده‌ها در آمار linter برای پیام‌های مربوط به خود linter (مانند unknown-option-value)، که مشکلات مربوط به امتیاز (score)، گزینهٔ fail-on و موارد مشابه را برطرف می‌کند.

    بسته شد #9059 (#9059 https://github.com/pylint-dev/pylint/issues/9059)

  • رفع فروپاشی در بررسی‌کنندهٔ بازآفرینی کد (refactoring checker) هنگامی که عملوند یکانی با یک متغیر در حلقهٔ for استفاده می‌شود.

    بسته شد #9074 (#9074 https://github.com/pylint-dev/pylint/issues/9074)

  • تابع get_message_definition از API پایه‌ای بازبین (checker) حذف شد. می‌توانید از طریق MessageStore به تعاریف پیام‌ها دسترسی داشته باشید.

    ارجاع به #8401 (#8401 https://github.com/pylint-dev/pylint/issues/8401)

  • تمام موارد مربوط به سازهٔ __implements__ حذف شدند. این ساختار بر اساس PEP245 بود که در سال ۲۰۰۱ پیشنهاد و در سال ۲۰۰۶ رد شد.

    تمام کلاس‌هایی که از Interface در pylint.interfaces ارث‌بری می‌کردند حذف شدند. کلاس Checker تنها باید از BaseChecker یا هر یک از دیگر انواع checker در pylint.checkers ارث‌بری کند. Reporter نیز تنها باید از BaseReporter ارث‌بری نماید.

    ارجاع به #8404 (#8404 https://github.com/pylint-dev/pylint/issues/8404)

  • اکنون ارسال modname و msg_store در FileState الزامی است. تابع collect_block_lines نیز حذف شده است. مقدار Pylinter.current_name دیگر نمی‌تواند null باشد.

    ارجاع به #8407 (#8407 https://github.com/pylint-dev/pylint/issues/8407)

  • متد Reporter.set_output به نفع reporter.out = stream حذف شد.

    ارجاع به #8408 (#8408 https://github.com/pylint-dev/pylint/issues/8408)

  • تعدادی از توابع و کلاس‌های کمکی (utility) قدیمی حذف شده‌اند:

    MapReduceMixin: برای اینکه یک بازبین (checker) داده‌های نقشه را ادغام (reduce) کند، کافی است get_map_data و reduce_map_data را پیاده‌سازی کنید.

    is_inside_lambda: از utils.get_node_first_ancestor_of_type(x, nodes.Lambda) استفاده کنید.

    check_messages: از utils.only_required_for_messages استفاده کنید.

    is_class_subscriptable_pep585_with_postponed_evaluation_enabled: از is_postponed_evaluation_enabled(node) و is_node_in_type_annotation_context(node) استفاده کنید.

    get_python_path: این فرض که همواره یک فایل __init__.py وجود دارد از نسخهٔ python 3.3 به بعد درست نبوده و به‌ویژه با PEP 420 مشکل ایجاد می‌کند. از discover_package_path استفاده کرده و ریشه(های) سورس را به آن ارسال کنید.

    fix_import_path: از augmented_sys_path استفاده کنید و مدخل‌های اضافی sys.path را که از discover_package_path دریافت شده‌اند به عنوان آرگومان به آن بفرستید.

    get_global_option: از checker.linter.config برای دریافت تمام گزینه‌های سراسری استفاده کنید.

    اشیاء خصوصی مرتبط نیز حذف شده‌اند.

    ارجاع به #8409 (#8409 https://github.com/pylint-dev/pylint/issues/8409)

  • اکنون colorize_ansi تنها یک شیء MessageStyle را می‌پذیرد.

    ارجاع به #8412 (#8412 https://github.com/pylint-dev/pylint/issues/8412)

  • پس از یک دوره منسوخ‌سازی، اکنون Pylinter.check تنها با توالی‌هایی از رشته‌ها کار می‌کند، نه رشته‌های تکی.

    ارجاع به #8463 (#8463 https://github.com/pylint-dev/pylint/issues/8463)

  • پس از یک دوره منسوخ‌سازی، ColorizedTextReporter تنها ColorMappingDict را می‌پذیرد.

    ارجاع به #8464 (#8464 https://github.com/pylint-dev/pylint/issues/8464)

  • پس از یک دوره منسوخ‌سازی، مقادیر end_line و end_col_offset در MessageTest باید در آزمون‌های عملکردی دقیق باشند (برای python 3.8 یا بالاتر در cpython، و برای python 3.9 یا بالاتر در pypy).

    ارجاع به #8466 (#8466 https://github.com/pylint-dev/pylint/issues/8466)

  • پس از یک دوره منسوخ‌سازی، آرگومان do_exit از کلاس Run (و کلاس _Run در testutils) حذف شد.

    ارجاع به #8472 (#8472 https://github.com/pylint-dev/pylint/issues/8472)

  • پس از یک دوره منسوخ‌سازی، اکنون آرگومان py_version در تابع MessageDefinition.may_be_emitted الزامی است. محتمل‌ترین راهکار در صورتی که نیاز به استفادهٔ ادامه‌دار از این تابع دارید، استفاده از 'linter.config.py_version'، یا استفاده از 'MessageDefinition.is_message_enabled' به‌جای آن است.

    ارجاع به #8473 (#8473 https://github.com/pylint-dev/pylint/issues/8473)

  • پس از یک دوره منسوخ‌سازی، کلاس OutputLine اکنون همواره نیازمند تعداد صحیح آرگومان‌ها است. برای دستیابی آسان به این هدف، خروجی عملکردی را می‌توان به‌صورت خودکار بازتولید کرد.

    ارجاع به #8474 (#8474 https://github.com/pylint-dev/pylint/issues/8474)

  • پس از یک دوره منسوخ‌سازی، توابع is_typing_guard، is_node_in_typing_guarded_import_block و is_node_in_guarded_import_block از pylint.utils حذف شدند: به‌جای آن‌ها از ترکیب is_sys_guard و in_type_checking_block استفاده کنید.

    ارجاع به #8475 (#8475 https://github.com/pylint-dev/pylint/issues/8475)

  • پس از یک دوره منسوخ‌سازی، آرگومان location در کلاس Message اکنون باید یک MessageLocationTuple باشد.

    ارجاع به #8477 (#8477 https://github.com/pylint-dev/pylint/issues/8477)

  • پس از یک دوره منسوخ‌سازی، تابع check_single_file از Pylinter با Pylinter.check_single_file_item جایگزین شده است.

    ارجاع به #8478 (#8478 https://github.com/pylint-dev/pylint/issues/8478)

  • pylint پس از بهبودهایی در astroid که استفادهٔ بهتری از حافظهٔ موقت استنتاج (inference cache) می‌کند، (دست‌کم) حدود ۵٪ سریع‌تر اجرا می‌شود.

    ارجاع: pylint-dev/astroid#529 (#529 https://github.com/pylint-dev/pylint/issues/529)

  • بهینه‌سازی is_trailing_comma().
  • ذخیره‌سازی موقت (Cache) برای class_is_abstract().

ارجاع: #1954 (#1954 https://github.com/pylint-dev/pylint/issues/1954)

•
خروج فوری در صورتی که همهٔ پیام‌ها غیرفعال شده باشند.

بسته شد: #8715 (#8715 https://github.com/pylint-dev/pylint/issues/8715)

از زمان آغاز pylint تا نگارش 2.14.0 (شامل آن)، سیاههٔ تغییراتی وجود داشت که دربردارندهٔ تمام تغییرات غیربدیهی Pylint بود؛ از جمله تغییراتی که برای کاربر ملموس نبودند، یعنی تغییراتی که تنها در صورتی ممکن بود برای شما جالب باشند که توسعه‌دهنده‌ای باشید که روی pylint یا افزایه‌های pylint کار می‌کند یا یک تاریخ‌نگار متن‌باز باشید.

از pylint 1.6.0 تا 2.14.0، علاوه بر سیاههٔ کامل تغییرات، خلاصه‌ای از تغییرات (عمدتاً ملموس برای کاربر) نیز وجود داشت.

انتشار
2.17
تاریخ
2023-03-08

نگارش 2.17 یک انتشار کوچک است و نخستین نگارشی به شمار می‌رود که با افزودن گره‌های TryStar، به‌طور رسمی از python 3.11 پشتیبانی می‌کند.

همچنان دو بررسی پیش‌فرض جدید وجود دارد: bad-chained-comparison و implicit-flag-alias، که یکی از آن‌ها پیش‌تر باگی شناسایی‌نشده را در sentry برطرف کرده است.

به لطف تلاش جامعهٔ کاربری، مستندات ما تقریباً کامل شده است و اکنون همهٔ پیام‌ها باید دارای مستندات مناسبی باشند. یک تشکر بزرگ از تمام کسانی که مشارکت کردند!

انتشار بعدی 3.0.0 خواهد بود که تغییرات ساختارشکن (breaking changes) به همراه دارد و موارد منسوخی را که از مدت‌ها پیش اعلام شده بودند اجرایی می‌کند. پیش از انتشار رسمی، نسخه‌های بتای متعددی عرضه خواهد شد؛ همگان می‌توانند این نسخه‌های بتا را آزمایش کنند تا مشکلات را پیش از انتشار نهایی شناسایی کنیم.

تاریخ انتشار: 2023-09-30

•
رفع یک پس‌رفت در pylint 2.17.6 / astroid 2.15.7 که موجب صدور پیام‌های گوناگون برای کدهای شامل TypeVar می‌شد.

بسته شد: #9069 (#9069 https://github.com/pylint-dev/pylint/issues/9069)

•
رفع خرابی در بررسی‌کنندهٔ بازآفرینی کد (refactoring checker) هنگامی که عملوند یگانی همراه با متغیر در حلقهٔ for استفاده شود.

بسته شد: #9074 (#9074 https://github.com/pylint-dev/pylint/issues/9074)

تاریخ انتشار: 2023-09-24

  • هنگام تجزیهٔ فهرست‌های جداشده با کاما از عبارت‌های باقاعده در پیکربندی، کاماهای درون آکولاد نادیده گرفته می‌شوند، زیرا آن‌ها نشان‌دهندهٔ کمیت‌سنج‌ها هستند نه جداکنندهٔ میان عبارت‌ها.

    بسته شد: #7229 (#7229 https://github.com/pylint-dev/pylint/issues/7229)

  • متغیر sys.argv اکنون همیشه به درستی غیرقابل استنتاج تلقی می‌شود (به جای استفاده از مقادیر واقعی داده‌شده به pylint).

    بسته شد: #7710 (#7710 https://github.com/pylint-dev/pylint/issues/7710)

  • عدم نمایش فیلدهای کلاس بیش از یک بار در نمودارهای Pyreverse.

    بسته شد: #8189 (#8189 https://github.com/pylint-dev/pylint/issues/8189)

  • عدم نمایش پیکان‌ها بیش از یک بار در نمودارهای Pyreverse.

    بسته شد: #8522 (#8522 https://github.com/pylint-dev/pylint/issues/8522)

  • عدم نمایش یادداشت‌های نوع (type annotations) تکراری در نمودارهای Pyreverse.

    بسته شد: #8888 (#8888 https://github.com/pylint-dev/pylint/issues/8888)

  • عدم افزودن Optional به حاشیه‌نویسی‌های | با None در نمودارهای Pyreverse.

    بسته شد: #9014 (#9014 https://github.com/pylint-dev/pylint/issues/9014)

    تاریخ انتشار: 2023-07-26

  • رفع یک مثبت کاذب برای unused-variable زمانی که یک import در بلوک if TYPE_CHECKING: وجود داشته و allow-global-unused-variables در پیکربندی روی no تنظیم شده باشد.

    بستن #8696 (#8696 https://github.com/pylint-dev/pylint/issues/8696)

  • رفع موارد مثبت کاذب تولیدشده هنگام ارسال آرگومان‌ها به صورت **kwargs به فراخوانی‌های IO مانند ()open.

    بستن #8719 (#8719 https://github.com/pylint-dev/pylint/issues/8719)

  • رفع یک مورد مثبت کاذب که در آن pylint فراخوانی‌های متد دارای حاشیه‌نویسی NoReturn را در حین بررسی inconsistent-return-statements نادیده می‌گرفت.

    بستن #8747 (#8747 https://github.com/pylint-dev/pylint/issues/8747)

  • معاف کردن والدینی که تنها دارای حاشیه‌نویسی نوع هستند از پیام invalid-enum-extension.

    بستن #8830 (#8830 https://github.com/pylint-dev/pylint/issues/8830)

•
رفع خرابی هنگامی که یک nonlocal در سطح ماژول تعریف شده باشد.

بستن #8735 (#8735 https://github.com/pylint-dev/pylint/issues/8735)

تاریخ انتشار: 2023-05-06

•
رفع یک مورد مثبت کاذب برای bad-dunder-name زمانی که متد __index__ تعریف‌شده توسط کاربر وجود دارد.

بستن #8613 (#8613 https://github.com/pylint-dev/pylint/issues/8613)

  • pyreverse: فراردهی نویسه خط عمودی (|) در برچسب‌های حاشیه‌نویسی تولیدشده توسط چاپگر DOT اضافه شد تا اطمینان حاصل شود به عنوان جداکننده فیلد در گره‌های مبتنی بر رکورد در نظر گرفته نمی‌شود.

    بستن #8603 (#8603 https://github.com/pylint-dev/pylint/issues/8603)

  • رفع خرابی هنگام تولید فایل پیکربندی: tomlkit.exceptions.TOMLKitError: Can't add a table to a dotted key ناشی از tomlkit نسخه v0.11.8.

    بستن #8632 (#8632 https://github.com/pylint-dev/pylint/issues/8632)

    تاریخ انتشار: 2023-04-24

•
بهبود خروجی پیام consider-using-generator برای فراخوانی‌های min() با کلمه کلیدی default.

بسته شد #8563 (#8563 https://github.com/pylint-dev/pylint/issues/8563)

تاریخ انتشار: 2023-04-03

  • invalid-name اکنون اعداد صحیح را در نام‌های typealias مجاز می‌داند: - اکنون معتبر: Good2Name، GoodName2. - همچنان نامعتبر: _1BadName.

    بسته شد #8485 (#8485 https://github.com/pylint-dev/pylint/issues/8485)

  • دیگر Union به عنوان type annotation برای بررسی‌های نام‌گذاری به منزلهٔ type alias در نظر گرفته نمی‌شود.

    بسته شد #8487 (#8487 https://github.com/pylint-dev/pylint/issues/8487)

  • unnecessary-lambda دیگر در مورد توابع لامبدایی که از پارامترهای خود در بدنه (به غیر از آرگومان‌های نهایی) استفاده می‌کنند هشدار نمی‌دهد؛ مانند: lambda foo: (bar if foo else baz)(foo).

    بسته شد #8496 (#8496 https://github.com/pylint-dev/pylint/issues/8496)

•
رفع خرابی در pyreverse هنگامی که از نویسه‌های "/" در نام فایل خروجی استفاده می‌شود؛ مانند pyreverse -o png -p name/ path/to/project.

بسته شد #8504 (#8504 https://github.com/pylint-dev/pylint/issues/8504)

تاریخ انتشار: 2023-03-22

•
افزودن asyncSetUp به فهرست پیش‌فرض defining-attr-methods برای فرونشاندن هشدار attribute-defined-outside-init هنگام استفاده از unittest.IsolatedAsyncioTestCase.

ارجاع #8403 (#8403 https://github.com/pylint-dev/pylint/issues/8403)

  • گزینهٔ --clear-cache-post-run اکنون حافظه‌های موقت LRU را برای ابزارهای pylint که ارجاعاتی به گره‌های AST نگه می‌دارند نیز پاکسازی می‌کند.

    بستن #8361 (#8361 https://github.com/pylint-dev/pylint/issues/8361)

  • رفع یک فروپاشی هنگامی که از TYPE_CHECKING بدون درون‌ریزی آن استفاده می‌شود.

    بستن #8434 (#8434 https://github.com/pylint-dev/pylint/issues/8434)

  • رفع یک پس‌رفت در preferred-modules که در آن به جای تطابق کامل لازم، از تطابق جزئی استفاده می‌شد.

    بستن #8453 (#8453 https://github.com/pylint-dev/pylint/issues/8453)

•
ابزارهای زیر به نفع تابع پایدارتر in_type_checking_block منسوخ شده‌اند و در pylint 3.0 حذف خواهند شد:
  • is_node_in_guarded_import_block
  • is_node_in_typing_guarded_import_block
  • is_typing_guard

تابع is_sys_guard که بخشی از is_node_in_guarded_import_block بود، همچنان در دسترس است.

ارجاع #8433 (#8433 https://github.com/pylint-dev/pylint/issues/8433)

تاریخ انتشار: 2023-03-08

  • افزودن بررسی bad-chained-comparison که هنگامی که یک مقایسهٔ زنجیره‌ای وجود دارد که در آن یک عبارت از نظر معنایی با دیگری ناسازگار است، یک هشدار صادر می‌کند.

    بستن #6559 (#6559 https://github.com/pylint-dev/pylint/issues/6559)

  • افزودن بررسی implicit-flag-alias که هنگامی که یک کلاس مشتق‌شده از enum.IntFlag مقادیر صحیح متمایزی تخصیص می‌دهد که در موقعیت‌های بیتی مشترک سهیم هستند، یک هشدار صادر می‌کند.

    ارجاع به #8102 (#8102 https://github.com/pylint-dev/pylint/issues/8102)

  • رفع چندین مورد مثبت کاذب برای توابعی که مستقیماً از حالت‌های تطبیق الگوی ساختاری (structural pattern matching) مقدار بازمی‌گردانند.

    بستن #5288 (#5288 https://github.com/pylint-dev/pylint/issues/5288)

  • رفع مثبت کاذب برای used-before-assignment هنگامی که typing.TYPE_CHECKING همراه با بلوک‌های if/elif/else استفاده می‌شود.

    بستن #7574 (#7574 https://github.com/pylint-dev/pylint/issues/7574)

  • رفع مثبت کاذب برای isinstance-second-argument-not-valid-type / W1116 <#isinstance-second-argument-not-valid-type> با انواع اجتماع (union types).

    بستن #8205 (#8205 https://github.com/pylint-dev/pylint/issues/8205)

  • رفع مثبت کاذب برای used-before-assignment در مورد عبارات نام‌گذاری‌شده‌ای که پس از عنصر اول در یک list،‏ tuple یا set ظاهر می‌شوند.

    بستن #8252 (#8252 https://github.com/pylint-dev/pylint/issues/8252)

  • رفع مثبت کاذب برای wrong-spelling-in-comment در مورد نام‌های کلاس در یک کامنت نوعِ python 2.

    بستن #8370 (#8370 https://github.com/pylint-dev/pylint/issues/8370)

  • رفع یک منفی کاذب برای missing-parentheses-for-call-in-test / W0126 <#missing-parentheses-for-call-in-test>' هنگامی که استنتاج برای بخش داخلی فراخوانی با شکست مواجه می‌شد، چرا که برای گزارش صحیح خطا به آن اطلاعات نیازی نبود.

    ارجاع به #8185 (#8185 https://github.com/pylint-dev/pylint/issues/8185)

  • رفع منفی کاذب برای inconsistent-returns در حلقه‌های while.

    بستن #8280 (#8280 https://github.com/pylint-dev/pylint/issues/8280)

  • به‌روزرسانی توضیحات مربوط به global-variable-not-assigned و افزودن سطح اطمینان (confidence).

    بستن #5073 (#5073 https://github.com/pylint-dev/pylint/issues/5073)

  • مدل حاکمیت و مسیر تبدیل شدن به یک نگه‌دارنده (maintainer) در راستای تلاش ما برای تضمین امنیت زنجیره تأمین نرم‌افزاری که pylint در آن گنجانده شده، مستندسازی شده است.

    ارجاع به #8329 (#8329 https://github.com/pylint-dev/pylint/issues/8329)

انتشار
2.16
تاریخ
2023-02-01

در نسخه 2.16.0، درک تجمیع (aggregation) و ترکیب (composition) را در pyreverse و همچنین روشی برای پاک‌سازی حافظه موقت (cache) میان اجراها در حالت سرور (در اصل برای یکپارچه‌سازی با VS Code) اضافه کردیم. جدا از رفع اشکال‌ها، تعداد زیادی بررسی‌ جدید و افزونه‌های تازه‌ای که مدت‌ها درخواست می‌شدند نیز پیاده‌سازی شده‌اند.

اگر می‌خواهید از تمامی بررسی‌های جدید بهره‌مند شوید، افزونه‌های زیر را بارگذاری کنید:

pylint.extensions.dict_init_mutate,
pylint.extensions.dunder,
pylint.extensions.typing,
pylint.extensions.magic_value,

ما همچنان از هرگونه مشارکت جامعه برای کمک به بازبینی، ادغام و افزودن مثال‌های خوب/بد به مستندات در <https://github.com/pylint-dev/pylint/issues/5953>`_ استقبال می‌کنیم. این کار بدون داشتن هیچ دانشی از pylint یا astroid قابل انجام است، بنابراین اگر می‌خواهید بدون تجربه قبلی با کد ما در توسعه pylint یا پروژه‌های متن‌باز مشارکت کنید، این یک نقطه ورود عالی است!

در نهایت، @clavedeluna و @nickdrozd به جمع مسئولان تریاژ (triagers) پیوستند؛ به تیم خوش آمدید!

تاریخ انتشار: 2023-03-06

•
رفع مثبت کاذب برای isinstance-second-argument-not-valid-type / W1116 <#isinstance-second-argument-not-valid-type> در انواع union.

بستن #8205 (#8205 https://github.com/pylint-dev/pylint/issues/8205)

تاریخ انتشار: 2023-03-03

•
رفع مثبت کاذب برای wrong-spelling-in-comment با نام‌های کلاس در یک کامنت نوع (type comment) مربوط به python 2.

بستن #8370 (#8370 https://github.com/pylint-dev/pylint/issues/8370)

•
جلوگیری از صدور invalid-name برای خطی که دستور global در آن اعلان شده است.

بستن #8307 (#8307 https://github.com/pylint-dev/pylint/issues/8307)

تاریخ انتشار: 2023-02-13

•
افزودن گزینهٔ --version به pyreverse.

ارجاع: #7851 (#7851 https://github.com/pylint-dev/pylint/issues/7851)

  • رفع مثبت کاذب برای used-before-assignment هنگامی که typing.TYPE_CHECKING به همراه بلوک‌های if/elif/else استفاده می‌شود.

    بستن #7574 (#7574 https://github.com/pylint-dev/pylint/issues/7574)

  • رفع مثبت کاذب برای used-before-assignment برای عبارت‌های نام‌گذاری‌شده که پس از نخستین عنصر در یک list، tuple یا set قرار می‌گیرند.

    بستن #8252 (#8252 https://github.com/pylint-dev/pylint/issues/8252)

  • رفع مثبت کاذب used-before-assignment هنگامی که عملگر walrus به همراه یک عملگر سه‌تایی در مقداردهی اولیه کلید/مقدار دیکشنری استفاده می‌شود.

    بستن #8125 (#8125 https://github.com/pylint-dev/pylint/issues/8125)

  • رفع مثبت کاذب no-name-in-module که هنگام تعریف یک متغیر توسط یک بسته با نامی یکسان با یکی از زیرماژول‌های آن صادر می‌شد.

    بستن #8148 (#8148 https://github.com/pylint-dev/pylint/issues/8148)

  • اصلاح پیام پیشنهادی nested-min-max جهت اشاره به اینکه امکان باز کردن (splat) اشیاء تکرارپذیر (iterables) وجود دارد.

    بستن #8168 (#8168 https://github.com/pylint-dev/pylint/issues/8168)

  • رفع یک فروپاشی که هنگام منفی شدن یک صفت کلاس در آرگومان start از enumerate رخ می‌داد.

    بستن #8207 (#8207 https://github.com/pylint-dev/pylint/issues/8207)

تاریخ انتشار: 2023-02-02

•
رفع یک فروپاشی برای مفسر python نسخهٔ کمتر از 3.9 به‌دنبال یک به‌روزرسانی ناموفق typing.

بستن #8161 (#8161 https://github.com/pylint-dev/pylint/issues/8161)

تاریخ انتشار: 2023-02-01

•
گزینهٔ accept-no-raise-doc مربوط به missing-raises-doc اکنون همواره به‌درستی اعمال خواهد شد.

هنگامی که هیچ استثنایی مستند نشده و accept-no-raise-doc برابر با true باشد، Pylint دیگر خطای missing-raises-doc / W9006 <#missing-raises-doc> (W9006) را ایجاد نخواهد کرد (مورد #7208). اگر انتظار داشتید در این حالت خطاهای missing-raises-doc / W9006 <#missing-raises-doc> صادر شوند، اکنون باید accept-no-raise-doc=no را در پیکربندی خود اضافه کنید تا همان رفتار حفظ شود.

بستن #7208 (#7208 https://github.com/pylint-dev/pylint/issues/7208)

  • قالب خروجی no-header اضافه شد. در صورت فعال شدن با --output-format=no-header، نام ماژول در خروجی گنجانده نخواهد شد.

    بستن #5362 (#5362 https://github.com/pylint-dev/pylint/issues/5362)

  • گزینهٔ پیکربندی clear-cache-post-run جهت پشتیبانی از استفاده‌های شبه‌سرور اضافه شد. اگر انتظار دارید فایل‌های تحلیل‌شده بین اجراها تغییر کنند، از این پرچم استفاده کنید.

    ارجاع: #5401 (#5401 https://github.com/pylint-dev/pylint/issues/5401)

  • افزودن گزینهٔ --allow-reexport-from-package برای تنظیم بررسی useless-import-alias تا در صورتی که یک نام از یک بسته دوباره صادر (re-export) شود، هشداری صادر نکند.

    بستن #6006 (#6006 https://github.com/pylint-dev/pylint/issues/6006)

  • به‌روزرسانی pyreverse برای تمایز قائل شدن میان تجمیع‌ها (aggregations) و ترکیب‌ها (compositions). ابزار pyreverse بررسی می‌کند که آیا یک شیء از طریق پارامترهای متد (از طریق راهنماهای نوع یا type hints) یک Instance است یا Call، تا تصمیم بگیرد که آیا یک ترکیب است یا تجمیع.

    ارجاع: #6543 (#6543 https://github.com/pylint-dev/pylint/issues/6543)

  • افزودن بررسی pointless-exception-statement که هنگام ایجاد یک Exception بدون انتساب، raise یا بازگردانده (return) شدن آن، هشدار صادر می‌کند.

    Refs #3110 (#3110 https://github.com/pylint-dev/pylint/issues/3110)

  • افزودن پیام shadowed-import برای importهای دارای نام مستعار (aliased imports).

    Closes #4836 (#4836 https://github.com/pylint-dev/pylint/issues/4836)

  • افزودن بررسی جدیدی به نام unbalanced-dict-unpacking برای بررسی باز کردن نامتوازن دیکشنری (dict unpacking) در انتساب‌ها و حلقه‌های for.

    Closes #5797 (#5797 https://github.com/pylint-dev/pylint/issues/5797)

  • افزودن بررسی‌کننده جدید positional-only-arguments-expected برای بررسی مواردی که آرگومان‌های فقط-موقعیتی (positional-only) به صورت آرگومان‌های کلیدواژه‌ای ارسال شده‌اند.

    Closes #6489 (#6489 https://github.com/pylint-dev/pylint/issues/6489)

  • افزودن singledispatch-method که اطلاع می‌دهد @singledispatch باید توابع را تزیین (decorate) کند، نه متدهای کلاس یا نمونه (instance). افزودن singledispatchmethod-function که اطلاع می‌دهد @singledispatchmethod باید متدهای کلاس یا نمونه را تزیین کند، نه توابع را.

    Closes #6917 (#6917 https://github.com/pylint-dev/pylint/issues/6917)

  • تغییر نام broad-except به broad-exception-caught و افزودن بررسی‌کننده جدید broad-exception-raised که در صورت raise شدن استثناهای عمومی BaseException یا Exception هشدار می‌دهد.

    Closes #7494 (#7494 https://github.com/pylint-dev/pylint/issues/7494)

  • افزودن nested-min-max که مواردی مانند min(1, min(2, 3)) را جهت ساده‌سازی به min(1, 2, 3) مشخص می‌کند.

    Closes #7546 (#7546 https://github.com/pylint-dev/pylint/issues/7546)

  • گسترش use-dict-literal تا هنگام فراخوانی dict() با ارسال آرگومان‌های کلیدواژه‌ای نیز هشدار دهد.

    Closes #7690 (#7690 https://github.com/pylint-dev/pylint/issues/7690)

  • افزودن بررسی named-expr-without-context برای صدور هشدار در صورتی که یک عبارت نام‌گذاری‌شده (named expression) خارج از زمینه‌هایی مانند if، for، while یا یک comprehension استفاده شود.

    Refs #7760 (#7760 https://github.com/pylint-dev/pylint/issues/7760)

  • افزودن بررسی invalid-slice-step برای هشدار در مورد مقدار گام برش برابر با 0 برای دنباله‌های توکار (builtin) متداول.

    Refs #7762 (#7762 https://github.com/pylint-dev/pylint/issues/7762)

  • افزودن بررسی consider-refactoring-into-while-condition جهت پیشنهاد بازآفرینی (refactoring) هنگامی که یک حلقه while با شرط ثابت تعریف شده و نخستین دستور آن یک عبارت if بلافاصله برای بررسی شرط break باشد.

    Closes #8015 (#8015 https://github.com/pylint-dev/pylint/issues/8015)

  • افزودن بررسی‌کننده افزونه جدید dict-init-mutate که تغییر دادن (mutating) یک دیکشنری را بلافاصله پس از ایجاد آن مشخص می‌کند.

    Closes #2876 (#2876 https://github.com/pylint-dev/pylint/issues/2876)

  • افزودن بررسی افزونه bad-dunder-name که متدهای داندر (dunder) نامعتبر یا دارای غلط املایی را مشخص می‌کند. می‌توانید از گزینه good-dunder-names برای مجاز کردن نام‌های داندر مشخص استفاده کنید.

    Closes #3038 (#3038 https://github.com/pylint-dev/pylint/issues/3038)

  • افزودن بررسی consider-using-augmented-assign برای افزونه CodeStyle که مواردی مانند x = x + 1 را جهت ساده‌سازی به x += 1 مشخص می‌کند. این بررسی به‌طور پیش‌فرض غیرفعال است. برای استفاده از آن، افزونه سبک کد را با load-plugins=pylint.extensions.code_style بارگذاری کرده و consider-using-augmented-assign را به گزینه enable اضافه کنید.

    Closes #3391 (#3391 https://github.com/pylint-dev/pylint/issues/3391)

  • افزودن بررسی‌کننده پلاگین magic-number برای مقایسه با مقادیر ثابت به‌جای ثابت‌های نام‌گذاری‌شده یا enumها. می‌توانید از آن با --load-plugins=pylint.extensions.magic_value استفاده کنید.

    Closes #7281 (#7281 https://github.com/pylint-dev/pylint/issues/7281)

  • افزودن پیام redundant-typehint-argument برای پلاگین typing جهت اعلان typehintهای انتساب تکراری. برای فعال‌سازی این پیام، پلاگین را با دستور زیر فعال کنید: --load-plugins=pylint.extensions.typing.

    Closes #7636 (#7636 https://github.com/pylint-dev/pylint/issues/7636)

  • کد پس از فراخوانی quit، exit، sys.exit یا os._exit به‌عنوان unreachable (غیرقابل‌دسترس) علامت‌گذاری خواهد شد.

    ارجاع به #519 (#519 https://github.com/pylint-dev/pylint/issues/519)

  • صدور هشدار used-before-assignment هنگامی که آرگومان‌های تابع درون یک تابع درونی مجدداً تعریف شده و پیش از انتساب، در آنجا مورد دسترسی قرار گیرند.

    بستن #2374 (#2374 https://github.com/pylint-dev/pylint/issues/2374)

  • رفع یک مورد منفی کاذب برای unused-import هنگامی که یک ماژول از یک import در یک نوع‌نوشت (type annotation) استفاده می‌کرد که در ماژول دیگری نیز استفاده شده بود.

    بستن #4150 (#4150 https://github.com/pylint-dev/pylint/issues/4150)

  • علامت‌گذاری superfluous-parens در صورت استفاده از پرانتز هنگام الحاق رشته‌ها (string concatenation).

    بستن #4792 (#4792 https://github.com/pylint-dev/pylint/issues/4792)

  • صدور هشدار used-before-assignment هنگام اتکا به نام‌هایی که تنها تحت شروطی تعریف شده‌اند که همواره نادرست (false) ارزیابی می‌شوند.

    بستن #4913 (#4913 https://github.com/pylint-dev/pylint/issues/4913)

  • هشدار consider-using-join اکنون می‌تواند برای جداکننده‌های رشته‌ای غیرخالی نیز صادر شود.

    بستن #6639 (#6639 https://github.com/pylint-dev/pylint/issues/6639)

  • صدور پیام used-before-assignment برای واردسازی‌های بیشترِ محافظت‌شده توسط TYPE_CHECKING

    پیش از این، این پیام تنها برای واردسازی‌هایی صادر می‌شد که مستقیماً تحت TYPE_CHECKING محافظت شده بودند، و نه مواردی که با عمق دو شاخهٔ if محافظت شده بودند یا هنگامی که TYPE_CHECKING از typing تحت یک نام مستعار (alias) وارد شده بود.

    بستن #7539 (#7539 https://github.com/pylint-dev/pylint/issues/7539)

  • رفع یک منفی کاذب برای unused-import هنگامی که یک ثابت درون typing.Annotated به‌عنوان ارجاع به یک import در نظر گرفته می‌شد.

    بستن #7547 (#7547 https://github.com/pylint-dev/pylint/issues/7547)

  • پیام consider-using-any-or-all اکنون در مواردی صادر می‌شود که یک مقدار بولی مقداردهی اولیه شده، در طول حلقه مجدداً مقداردهی شده و بلافاصله بازگردانده (return) شود.

    بستن #7699 (#7699 https://github.com/pylint-dev/pylint/issues/7699)

  • گسترش invalid-slice-index برای صدور یک هشدار در صورت استفاده از اندیس‌های برش نامعتبر با دنباله‌های رشته‌ای و بایتی، و اشیاء range.

    ارجاع به #7762 (#7762 https://github.com/pylint-dev/pylint/issues/7762)

  • رفع منفی کاذب unnecessary-list-index-lookup هنگامی که enumerate با iterable به‌عنوان یک آرگومان کلیدواژه‌ای (kwarg) فراخوانی شود.

    بستن #7770 (#7770 https://github.com/pylint-dev/pylint/issues/7770)

  • پیام no-else-return یا no-else-raise در صورتی صادر خواهد شد که بلوک except همواره با return یا raise پایان یابد.

    بستن #7788 (#7788 https://github.com/pylint-dev/pylint/issues/7788)

  • رفع منفی کاذب dangerous-default-value هنگام استفاده از *.

    بستن #7818 (#7818 https://github.com/pylint-dev/pylint/issues/7818)

  • هشدار consider-using-with اکنون برای pathlib.Path.open نیز فعال می‌شود.

    بستن #7964 (#7964 https://github.com/pylint-dev/pylint/issues/7964)

  • رفع اشکال در تشخیص unused-variable هنگام پیمایش روی متغیر.

    بستن #3044 (#3044 https://github.com/pylint-dev/pylint/issues/3044)

  • رفع اشکال در پویش نام‌های درون آرگومان‌های typing.Literal. برای جزئیات به https://peps.python.org/pep-0586/#literals-enums-and-forward-references مراجعه کنید.

    ارجاع به #3299 (#3299 https://github.com/pylint-dev/pylint/issues/3299)

  • به‌روزرسانی بررسی disallowed-name برای علامت‌گذاری متغیرهای سطح ماژول.

    بستن #3701 (#3701 https://github.com/pylint-dev/pylint/issues/3701)

  • در صورت متوقف‌شدن یک پردازش موازی، Pylint دیگر دچار بن‌بست (deadlock) نشده و در عوض بلافاصله با شکست مواجه خواهد شد.

    بستن #3899 (#3899 https://github.com/pylint-dev/pylint/issues/3899)

  • رفع مشکل بررسی فایل‌های نادیده‌گرفته‌شده (ignored files) هنگامی که از طریق stdin ارسال شوند.

    بستن #4354 (#4354 https://github.com/pylint-dev/pylint/issues/4354)

  • رفع منفی کاذب no-member هنگامی که انتساب افزوده (augmented assign) به‌صورت دستی و بدون += انجام شود.

    بستن #4562 (#4562 https://github.com/pylint-dev/pylint/issues/4562)

  • هرگونه assertion روی یک تاپل مقداردار (غیرخالی) اکنون هشدار assert-on-tuple را دریافت خواهد کرد.

    بستن #4655 (#4655 https://github.com/pylint-dev/pylint/issues/4655)

  • پیام‌های missing-return-doc، missing-raises-doc و missing-yields-doc اکنون گزینهٔ no-docstring-rgx را رعایت می‌کنند.

    بستن #4743 (#4743 https://github.com/pylint-dev/pylint/issues/4743)

  • به‌روزرسانی پیام راهنمای reimported برای شفافیت بیشتر.

    بستن #4836 (#4836 https://github.com/pylint-dev/pylint/issues/4836)

  • در صورت استفاده از عملیات‌های بیتی (bitwise)، پیام consider-iterating-dictionary دیگر صادر نخواهد شد.

    بستن #5478 (#5478 https://github.com/pylint-dev/pylint/issues/5478)

  • استفاده از آکولادهای سفارشی در msg-template اکنون به‌درستی کار خواهد کرد.

    بستن #5636 (#5636 https://github.com/pylint-dev/pylint/issues/5636)

  • ابزار Pylint اکنون موارد تکراری داده‌شده به آن را پیش از ارزیابی فیلتر می‌کند. خروجی باید یکسان باشد، چه یک فایل چندین بار داده/یافت شده باشد یا خیر.

    بستن #6242، #4053 (#6242 https://github.com/pylint-dev/pylint/issues/6242)

  • حذف فراخوانی متد داندر __index__ از بررسی unnecessary-dunder-call.

    بستن #6795 (#6795 https://github.com/pylint-dev/pylint/issues/6795)

  • اصلاح پردازش -- به‌عنوان جداکنندهٔ میان آرگومان‌های مکانی و پرچم‌ها. این مورد در واقع در نسخهٔ 2.14.5 برطرف نشده بود.

    بستن #7003، ارجاع به #7096 (#7003 https://github.com/pylint-dev/pylint/issues/7003)

  • جلوگیری از فروپاشی (crash) در هنگام رخ دادن OSError در فرایند یافتن فایل پیکربندی.

    بستن #7169 (#7169 https://github.com/pylint-dev/pylint/issues/7169)

  • پیام‌های ارسال‌شده به گزارشگر اکنون رونوشت می‌شوند تا یک گزارشگر نتواند پیام ارسال‌شده به سایر گزارشگرها را تغییر دهد.

    بستن #7214 (#7214 https://github.com/pylint-dev/pylint/issues/7214)

  • اصلاح مشکلی که در آن افزونه‌های سفارشیِ مشخص‌شده از خط فرمان می‌توانستند بدون خطا و در سکوت با شکست مواجه شوند.

    به‌طور خاص، اگر یک افزونه متکی به گزینهٔ init-hook برای تغییر دادن sys.path پیش از واردسازی آن باشد، این مورد اکنون پیام bad-plugin-value را صادر می‌کند. پیش از این تغییر، ثبت افزونه برای استفاده بی‌صدا با شکست مواجه می‌شد، اما هرگونه پیکربندی بارگذاری می‌گردید که می‌توانست اثرات ناخواسته‌ای داشته باشد.

    رفع بخشی از #7264. (#7264 https://github.com/pylint-dev/pylint/issues/7264)

  • به‌روزرسانی بررسی‌کنندهٔ modified_iterating برای رفع فروپاشی با حلقه‌های for روی لیست خالی.

    بستن #7380 (#7380 https://github.com/pylint-dev/pylint/issues/7380)

  • به‌روزرسانی متن پیام‌های arguments-differ و arguments-renamed جهت شفاف‌سازی شیء بازنویسی‌کننده (overriding).

    بستن #7390 (#7390 https://github.com/pylint-dev/pylint/issues/7390)

  • محدودهٔ اعمال disable-next اکنون به‌درستی تنها به خط بعدی محدود می‌شود.

    بستن #7401 (#7401 https://github.com/pylint-dev/pylint/issues/7401) رفع فروپاشی در بررسی‌کنندهٔ unhashable-member هنگام استفاده از یک lambda به عنوان کلید dict.

    بستن #7453 (#7453 https://github.com/pylint-dev/pylint/issues/7453)

  • افزودن mailcap به فهرست ماژول‌های منسوخ‌شده.

    بستن #7457 (#7457 https://github.com/pylint-dev/pylint/issues/7457)

  • رفع فروپاشی در بررسی‌کنندهٔ modified-iterating-dict شامل صفت‌های نمونه (instance attributes).

    بستن #7461 (#7461 https://github.com/pylint-dev/pylint/issues/7461)

  • بررسی‌کنندهٔ invalid-class-object دیگر هنگام انتساب به __class__ در کنار متغیری دیگر، دچار فروپاشی نمی‌شود.

    بستن #7467 (#7467 https://github.com/pylint-dev/pylint/issues/7467)

  • گزینهٔ --help-msg اکنون دوباره فهرستی از شناسه‌های پیام جداشده با کاما را می‌پذیرد.

    بستن #7471 (#7471 https://github.com/pylint-dev/pylint/issues/7471)

  • امکان مشخص‌کردن استثناهای غیرتوکار در گزینهٔ overgeneral-exception با استفاده از نام کامل استثنا (qualified name).

    بستن #7495 (#7495 https://github.com/pylint-dev/pylint/issues/7495)

  • گزارش no-self-argument به جای no-method-argument برای متدهایی با آرگومان‌های متغیر (variadic arguments).

    بستن #7507 (#7507 https://github.com/pylint-dev/pylint/issues/7507)

  • رفع مشکلی که در آن syntax-error نمی‌توانست برای فایل‌های دارای کدگذاری نامعتبر ایجاد شود.

    بستن #7522 (#7522 https://github.com/pylint-dev/pylint/issues/7522)

  • رفع مثبت کاذب برای redefined-outer-name هنگام نام مستعار دادن به typing مثلاً به صورت t و محافظت از importها زیر t.TYPE_CHECKING.

    بستن #7524 (#7524 https://github.com/pylint-dev/pylint/issues/7524)

  • رفع فروپاشی در بررسی‌کنندهٔ modified_iterating هنگام پیمایش روی مجموعه‌ای (set) که به عنوان صفت کلاس تعریف شده است.

    بستن #7528 (#7528 https://github.com/pylint-dev/pylint/issues/7528)

  • استفاده از py-version برای تعیین اینکه آیا پیامی باید برای پیام‌های تعریف‌شده با max-version یا min-version صادر شود یا خیر.

    بستن #7569 (#7569 https://github.com/pylint-dev/pylint/issues/7569)

  • بهبود بررسی bad-thread-instantiation جهت هشدار در صورتی که target به عنوان یک آرگومان کلیدواژه‌ای یا به عنوان آرگومان دوم ارسال نشده باشد.

    بستن #7570 (#7570 https://github.com/pylint-dev/pylint/issues/7570)

  • رفع حالت خاصی از متد سفارشی با نام next که موجب بروز خطای astroid می‌شد.

    بستن #7610 (#7610 https://github.com/pylint-dev/pylint/issues/7610)

  • رفع فروپاشی در چندپردازشی (multi-processing) که مانع از استفاده از بیش از ۱ ریسه (thread) در MacOS می‌شد.

    اشیاء ماژول و خطاهای بازگردانده‌شده که توسط بارگذار افزونهٔ linter ذخیره شده بودند، نمی‌توانند به طور قابل اطمینان pickle شوند. این بدان معناست که dill هنگام تلاش برای سریال‌سازی شیء linter جهت استفاده در چندپردازشی، خطایی ایجاد می‌کرد.

    بستن #7635. (#7635 https://github.com/pylint-dev/pylint/issues/7635)

  • رفع فروپاشی‌ای که هنگام تجزیهٔ فایل‌هایی با کدگذاری غیرمنتظره که با 'utf' شروع می‌شدند مانند utf13 رخ می‌داد.

    بستن #7661 (#7661 https://github.com/pylint-dev/pylint/issues/7661)

  • رفع فروپاشی هنگامی که یک کلاس فرزند با یک متد __init__ از یک کلاس والد دارای صفت کلاس __init__ ارث‌بری می‌کند.

    بستن #7742 (#7742 https://github.com/pylint-dev/pylint/issues/7742)

  • اصلاح مقدار پیکربندی پیش‌فرض valid-metaclass-classmethod-first-arg از "cls" به "mcs" که موجب بروز هر دو مورد مثبت کاذب و منفی کاذب می‌شد.

    بستن #7782 (#7782 https://github.com/pylint-dev/pylint/issues/7782)

  • رفع فروپاشی در بررسی unnecessary_list_index_lookup هنگام استفاده از enumerate همراه با start و یک صفت کلاس.

    بستن #7821 (#7821 https://github.com/pylint-dev/pylint/issues/7821)

  • رفع فروپاشی در stop-iteration-return هنگامی که تابع توکار next بدون آرگومان فراخوانی شود.

    بستن #7828 (#7828 https://github.com/pylint-dev/pylint/issues/7828)

  • هنگامی که pylint به دلیل ارائهٔ آرگومان‌های نادرست خارج می‌شود، کد خروج اکنون مقدار مورد انتظار 32 خواهد بود.

    ارجاع به #7931 (#7931 https://github.com/pylint-dev/pylint/issues/7931)

  • رفع استثنای ModuleNotFound هنگام اجرای pylint روی یک پروژهٔ Django با افزونهٔ فعال pylint_django.

    بستن #7938 (#7938 https://github.com/pylint-dev/pylint/issues/7938)

  • رفع فروپاشی هنگام استنتاج یک مقدار و استفاده از qname آن روی یک برش (slice) که به نادرستی فراخوانی شده بود.

    بستن #8067 (#8067 https://github.com/pylint-dev/pylint/issues/8067)

  • استفاده از عبارت باقاعدهٔ (regex) بهتر برای بررسی صفت‌های خصوصی.

    ارجاع به #8081 (#8081 https://github.com/pylint-dev/pylint/issues/8081)

  • رفع مشکل نحو جدید Union در ماژول typing در زمینهٔ زمان اجرا برای Python 3.10+.

    بستن #8119 (#8119 https://github.com/pylint-dev/pylint/issues/8119)

•
افزودن و اصلاح آزمون‌های رگرسیون برای بارگذاری افزونه‌ها.

این کار آزمون‌هایی را که بارگذاری افزونه‌های سفارشیِ متأثر از هرگونه تغییر ایجادشده در sys.path هنگام اجرای یک init-hook را پوشش می‌دهند، تقویت می‌کند. با توجه به قرارداد موجود مبنی بر مجاز بودن بارگذاری افزونه‌ها از طریق تغییر مسیر به این شیوه، اکنون این آخرین بخش از کار مورد نیاز برای بستن مسئله GitHub #7264 است.

بسته شدن #7264 (#7264 https://github.com/pylint-dev/pylint/issues/7264)

انتشار (Release)
2.15
تاریخ (Date)
2022-08-26

در pylint 2.15.0، ما یک بررسی جدید به نام missing-timeout اضافه کردیم تا درباره مقادیر پیش‌فرض زمان انتظار (timeout) که می‌توانند باعث معلق ماندن و توقف نامحدود برنامه شوند، هشدار دهد.

ما نحوه مدیریت بسته‌های فضای نام (namespace packages) را در pylint بهبود دادیم. اکنون بسته‌های بیشتری باید بدون نیاز به توسل به گزینه --recursive=y بررسی و لینت شوند.

ما همچنان از هرگونه مشارکت جامعه کاربری برای بازبینی، یکپارچه‌سازی و افزودن نمونه‌های خوب/بد به مستندات <https://github.com/pylint-dev/pylint/issues/5953>`_ استقبال می‌کنیم. این کار بدون داشتن هرگونه دانش درباره pylint یا astroid قابل انجام است، بنابراین اگر می‌خواهید بدون تجربه قبلی با کد ما در pylint یا دنیای متن‌باز مشارکت کنید، این یک نقطه ورود عالی است!

از نظر ساختار داخلی، با تشکر از DudeNr33، شیوه تولید یادداشت‌های انتشار را تغییر دادیم. دیگر نیازی به رفع تعارض‌ها در گزارش تغییرات (changelog) نخواهد بود و همه مشارکت‌کنندگان از این بابت خرسند خواهند بود.

‏Marc Byrne به جمع نگه‌دارندگان پیوست، به تیم خوش آمدید!

تاریخ انتشار: 2023-01-09

•
استفاده از آکولادهای سفارشی در msg-template اکنون به درستی کار خواهد کرد.

بسته شدن #5636 (#5636 https://github.com/pylint-dev/pylint/issues/5636)

تاریخ انتشار: 2022-12-17

•
رفع مثبت کاذب برای used-before-assignment در تطبیق الگو (pattern matching) همراه با گارد (guard).

بسته شدن #5327 (#5327 https://github.com/pylint-dev/pylint/issues/5327)

  • چنانچه یک کار موازی متوقف (kill) شود، Pylint دیگر دچار بن‌بست (deadlock) نخواهد شد و در عوض بلافاصله با خطا پایان می‌یابد.

    بسته شدن #3899 (#3899 https://github.com/pylint-dev/pylint/issues/3899)

  • هنگامی که pylint به دلیل ارائه آرگومان‌های نامعتبر خارج می‌شود، وضعیت خروج اکنون مقدار مورد انتظار 32 خواهد بود.

    مرجع #7931 (#7931 https://github.com/pylint-dev/pylint/issues/7931)

  • رفع استثنای ModuleNotFound هنگام اجرای pylint روی یک پروژه Django با افزونه فعال pylint_django.

    بسته شدن #7938 (#7938 https://github.com/pylint-dev/pylint/issues/7938)

    تاریخ انتشار: 2022-12-05

تاریخ انتشار: 2022-11-27

  • رفع مثبت کاذب deprecated-method هنگامی که نام مستعار یک متد شبیه به نام متد منسوخ‌شده است.

    بستن #5886 (#5886 https://github.com/pylint-dev/pylint/issues/5886)

  • رفع یک مثبت کاذب برای used-before-assignment در مورد واردسازی‌های محافظت‌شده توسط typing.TYPE_CHECKING که بعداً در حاشیه‌نویسی متغیرها استفاده شده‌اند.

    بستن #7609 (#7609 https://github.com/pylint-dev/pylint/issues/7609)

  • اکنون Pylint موارد تکراری ارائه‌شده به آن را پیش از انجام ارزیابی فیلتر می‌کند. خروجی باید یکسان باشد، چه یک فایل چندین بار داده/شناسایی شده باشد چه نباشد.

    بستن #6242, #4053 (#6242 https://github.com/pylint-dev/pylint/issues/6242)

  • رفع خرابی و توقف ناگهانی در stop-iteration-return هنگامی که تابع توکار next بدون آرگومان فراخوانی شود.

    بستن #7828 (#7828 https://github.com/pylint-dev/pylint/issues/7828)

تاریخ انتشار: 2022-11-19

  • پیام‌های ارسال‌شده به گزارشگر اکنون رونوشت می‌شوند تا یک گزارشگر نتواند پیامی را که برای سایر گزارشگران ارسال شده تغییر دهد.

    بسته شد #7214 (#7214 https://github.com/pylint-dev/pylint/issues/7214)

  • رفع حالت خاصی که در آن یک متد سفارشی با نام next خطای astroid ایجاد می‌کرد.

    بسته شد #7610 (#7610 https://github.com/pylint-dev/pylint/issues/7610)

  • رفع کرش رخ‌داده هنگام تجزیه فایل‌هایی با کدگذاری‌های غیرمنتظره که با 'utf' شروع می‌شوند، مانند utf13.

    بسته شد #7661 (#7661 https://github.com/pylint-dev/pylint/issues/7661)

  • رفع کرش هنگامی که یک کلاس فرزند با متد __init__ از یک کلاس والد دارای ویژگی کلاس __init__ ارث‌بری می‌کند.

    بسته شد #7742 (#7742 https://github.com/pylint-dev/pylint/issues/7742)

تاریخ انتشار: 2022-10-21

•
رفع یک مورد مثبت کاذب برای simplify-boolean-expression هنگامی که چندین مقدار برای یک مقدار ثابت استنتاج می‌شود.

بسته شد #7626 (#7626 https://github.com/pylint-dev/pylint/issues/7626)

  • حذف فراخوانی متد داندر __index__ از بررسی unnecessary-dunder-call.

    بسته شد #6795 (#6795 https://github.com/pylint-dev/pylint/issues/6795)

  • رفع کرش در چندپردازشی (multi-processing) که مانع از استفاده از بیش از ۱ رشته (thread) در MacOS می‌شد.

    اشیاء ماژول و خطاهای بازگردانده‌شده‌ای که توسط بارگذار افزونهٔ linter حافظه‌پنهان شده بودند، به طور قابل اعتمادی قابل pickle شدن نبودند. این بدان معناست که dill هنگام تلاش برای سریال‌سازی شیء linter جهت استفاده در چندپردازشی، خطا صادر می‌کرد.

    بسته شد #7635. (#7635 https://github.com/pylint-dev/pylint/issues/7635)

تاریخ انتشار: 2022-10-10

•
اصلاح پیام برای unnecessary-dunder-call در مورد __aiter__ و __anext__. همچنین انتشار هشدار فقط زمانی انجام می‌شود که py-version >= 3.10 باشد.

بسته شد #7529 (#7529 https://github.com/pylint-dev/pylint/issues/7529)

•
افزودن نام متد به پیام‌های خطای no-method-argument و no-self-argument.

بسته شد: #7507 (#7507 https://github.com/pylint-dev/pylint/issues/7507)

تاریخ انتشار: 2022-09-19

  • رفع کرش در بررسی‌کننده unhashable-member هنگام استفاده از lambda به‌عنوان کلید dict.

    بسته شد: #7453 (#7453 https://github.com/pylint-dev/pylint/issues/7453)

  • رفع کرش در بررسی‌کننده modified-iterating-dict در ارتباط با صفت‌های نمونه (instance attributes).

    بسته شد: #7461 (#7461 https://github.com/pylint-dev/pylint/issues/7461)

  • بررسی‌کننده invalid-class-object دیگر هنگامی که __class__ در کنار متغیری دیگر انتساب داده می‌شود، دچار کرش نمی‌شود.

    بسته شد: #7467 (#7467 https://github.com/pylint-dev/pylint/issues/7467)

  • رفع مثبت کاذب برای global-variable-not-assigned هنگامی که یک متغیر سراسری از طریق یک گره ImportFrom دوباره انتساب می‌یابد.

    بسته شد: #4809 (#4809 https://github.com/pylint-dev/pylint/issues/4809)

  • رفع مثبت کاذب برای undefined-loop-variable در حلقه‌های for-else که از تابعی با یادداشت نوع بازگشتی (return type annotation) NoReturn یا Never استفاده می‌کنند.

    بسته شد: #7311 (#7311 https://github.com/pylint-dev/pylint/issues/7311)

  • گزینه --help-msg اکنون مجدداً فهرستی از شناسه‌های پیامِ جداشده با کاما را می‌پذیرد.

    بسته شد: #7471 (#7471 https://github.com/pylint-dev/pylint/issues/7471)

تاریخ انتشار: 2022-09-07

  • رفع مشکلی که در آن افزونه‌های سفارشی مشخص‌شده از طریق خط فرمان ممکن بود بی‌صدا با شکست روبه‌رو شوند.

    به‌طور مشخص، اگر یک افزونه برای وارد شدن (import) متکی به تغییر sys.path توسط گزینه init-hook باشد، اکنون یک پیام bad-plugin-value صادر خواهد شد. پیش از این تغییر، ثبت افزونه برای استفاده بی‌صدا با شکست مواجه می‌شد، اما هرگونه پیکربندی بارگیری می‌شد که می‌توانست اثرات ناخواسته‌ای داشته باشد.

    رفع بخشی از #7264. (#7264 https://github.com/pylint-dev/pylint/issues/7264)

  • رفع هشدار used-before-assignment برای توابع/کلاس‌های تعریف‌شده در گارد بررسی نوع (type checking guard).

    بسته شد: #7368 (#7368 https://github.com/pylint-dev/pylint/issues/7368)

  • به‌روزرسانی بررسی‌کننده modified_iterating برای رفع کرش در حلقه‌های for روی فهرست‌های خالی.

    بسته شد: #7380 (#7380 https://github.com/pylint-dev/pylint/issues/7380)

  • افزونه docparams اکنون اطلاعات نوع در docstringهای به سبک Numpy را به‌عنوان "مستندسازی" برای پیام missing-param-doc در نظر می‌گیرد.

    ارجاع به #7398 (#7398 https://github.com/pylint-dev/pylint/issues/7398)

  • رفع مثبت کاذب برای unused-variable و unused-import زمانی که یک نام تنها در یادداشت نوع رشته‌ای تحت‌اللفظی (string literal type annotation) به کار رفته است.

    بسته شد: #3299 (#3299 https://github.com/pylint-dev/pylint/issues/3299)

  • رفع مثبت کاذب برای too-many-function-args هنگامی که فراخوانی یک تابع به صفت کلاسی در درون کلاسی که تابع در آن تعریف شده، انتساب داده می‌شود.

    بسته شد: #6592 (#6592 https://github.com/pylint-dev/pylint/issues/6592)

  • رفع مشکل تحلیل (lint) فایل‌های نادیده‌گرفته‌شده هنگامی که از طریق stdin ارسال می‌شوند.

    بسته شد: #4354 (#4354 https://github.com/pylint-dev/pylint/issues/4354)

  • پیام‌های missing-return-doc، missing-raises-doc و missing-yields-doc اکنون از گزینه no-docstring-rgx پیروی می‌کنند.

    بسته شد: #4743 (#4743 https://github.com/pylint-dev/pylint/issues/4743)

  • عدم کرش در صورت مواجهه با OSError در فرایند کشف فایل پیکربندی.

    بسته شد: #7169 (#7169 https://github.com/pylint-dev/pylint/issues/7169)

  • دستور disable-next اکنون به‌درستی تنها به سطر بعدی محدود شده است.

    بسته شد: #7401 (#7401 https://github.com/pylint-dev/pylint/issues/7401)

  • به‌روزرسانی بررسی‌کننده modified_iterating برای رفع کرش در حلقه‌های for روی فهرست‌های خالی.

    بسته شد: #7380 (#7380 https://github.com/pylint-dev/pylint/issues/7380)

    تاریخ انتشار: 2022-09-06

    این یک "انتشار فقط در GitHub" است؛ این نسخه به اشتباه با عنوان 2.16.0-dev در pypi منتشر شد. با 2.15.2 جایگزین شد.

•
بررسی‌کننده جدید missing-timeout برای هشدار درباره مقادیر پیش‌فرض وقفه (timeout) که ممکن است باعث معلق ماندن نامحدود برنامه شوند، اضافه شد.

ارجاع: #6780 (#6780 https://github.com/pylint-dev/pylint/issues/6780)

  • رفع مشکلی که در آن هنگام غیرقابل تجزیه بودن خروجی فعلی، به‌روزرسانی خروجی آزمون‌های کاربردی (functional tests) ناممکن بود. اکنون به‌جای اعلام خطا، یک پیام هشدار صادر شده و آزمون کاربردی با یک مقدار پیش‌فرض رد می‌شود.

    ارجاع #6891 (#6891 https://github.com/pylint-dev/pylint/issues/6891)

  • اکنون pylint.testutils.primer یک API خصوصی است.

    ارجاع #6905 (#6905 https://github.com/pylint-dev/pylint/issues/6905)

  • ما شیوهٔ مدیریت داخلی changelog را با استفاده از towncrier تغییر دادیم. اگر شما از مشارکت‌کنندگان هستید، دیگر نیازی به رفع تداخل‌های ادغام (merge conflicts) در changelog نخواهید داشت.

    بسته شد #6974 (#6974 https://github.com/pylint-dev/pylint/issues/6974)

  • ابزار Pylint اکنون از Scorecards برای پیاده‌سازی توصیه‌های امنیتی OpenSSF https://openssf.org استفاده می‌کند. این کار به منظور امن‌سازی زنجیرهٔ تأمین با ترکیبی از ابزارهای خودکار و بهترین شیوه‌ها (best practices) صورت گرفته است که بیشتر آن‌ها قبلاً نیز پیاده‌سازی شده بودند.

    ارجاع #7267 (#7267 https://github.com/pylint-dev/pylint/issues/7267)

    از آغاز pylint تا نگارش 2.14.0 (شامل خود آن)، ما گزارش تغییراتی داشتیم که شامل تمام تغییرات غیربدیهی Pylint بود؛ از جمله تغییراتی که مربوط به کاربر نهایی نبودند، یعنی تغییراتی که تنها در صورتی ممکن بود برای شما جذاب باشند که توسعه‌دهنده‌ای باشید که روی pylint یا افزونه‌های pylint کار می‌کند یا یک تاریخ‌نگار پروژه‌های متن‌باز.

    از pylint 1.6.0 تا 2.14.0، علاوه بر گزارش تغییرات کامل، خلاصه‌ای از تغییرات (عمدتاً مربوط به کاربران) نیز وجود داشت.

با نگارش 2.14، ابزار pylint تنها از Python نسخهٔ 3.7.2 و بالاتر پشتیبانی می‌کند.

ما چندین بررسی جدید معرفی کردیم که از میان آن‌ها می‌توان به duplicate-value برای مجموعه‌ها، comparison-of-constants و بررسی‌های مربوط به lambda اشاره کرد. ما no-init را حذف کرده و no-self-use را اختیاری کردیم زیرا بیش از حد سلیقه‌ای بودند. همچنین گزینه‌ای برای تولید یک پیکربندی toml اضافه کردیم: --generate-toml-config.

ما با سپاس از Daniël van Noord، از optparse به argparse مهاجرت کرده و مدیریت پیکربندی را بازآفرینی کردیم. در سمت کاربر، این امر باید خروجی دستور --help را تغییر دهد و برخی ناهماهنگی‌ها و باگ‌ها ناپدید شوند. رفتار میان گزینه‌های تنظیم‌شده در یک فایل پیکربندی در مقایسه با خط فرمان سازگارتر خواهد بود. برای ما نیز، این کار نگهداری این بخش از کد را در آینده آسان‌تر می‌سازد.

در نتیجهٔ این بازآفرینی، موارد منسوخ‌شدهٔ داخلی زیادی وجود دارد. اگر نگه‌دارندهٔ کتابخانه‌ای هستید که به pylint وابسته است، لطفاً با فعال‌سازی هشدارهای منسوخ‌شدگی بررسی کنید که برای pylint 3.0 آماده‌اید یا خیر.

ما به یکپارچه‌سازی pylint-error ادامه دادیم و اکنون به ۳۳٪ رسیده‌ایم! ما همچنان از هرگونه مشارکت جامعه برای کمک به بازبینی، ادغام و افزودن نمونه‌های خوب/بد <https://github.com/pylint-dev/pylint/issues/5953>`_ استقبال می‌کنیم. این کار باید بدون نیاز به هیچ دانشی از pylint یا astroid قابل انجام باشد، بنابراین اگر می‌خواهید بدون تجربهٔ قبلی با کد ما، در pylint یا پروژه‌های متن‌باز مشارکت کنید، این یک نقطهٔ ورود عالی است!

  • بررسی‌کنندهٔ جدید comparison-of-constants اضافه شد.

    بسته شدن #6076

  • بررسی‌کنندهٔ جدید typevar-name-mismatch اضافه شد: TypeVar باید به متغیری با همان نام آرگومان name خود تخصیص یابد.

    بسته شدن #5224

  • invalid-enum-extension: زمانی استفاده می‌شود که یک کلاس تلاش کند یک کلاس به ارث‌برده‌شده از Enum را گسترش دهد.

    بسته شدن #5501

  • بررسی‌کنندهٔ جدید typevar-double-variance اضافه شد: آرگومان‌های کلیدی "covariant" و "contravariant" نمی‌توانند در یک TypeVar هم‌زمان روی "True" تنظیم شوند.

    بسته شدن #5895

  • بررسی جدید unnecessary-dunder-call برای فراخوانی‌های غیرضروری متدهای dunder اضافه شد.

    بسته شدن #5936

  • unnecessary-lambda-assignment: عبارت lambda به یک متغیر تخصیص یافته است. به‌جای آن با استفاده از کلمه کلیدی "def" یک تابع تعریف کنید. unnecessary-direct-lambda-call: عبارت lambda به‌طور مستقیم فراخوانی شده است. به‌جای آن عبارت را به‌صورت درون‌خطی اجرا کنید.

    بسته شدن #5976

  • potential-index-error: زمانی صادر می‌شود که اندیس یک لیست یا تاپل از طول آن بیشتر شود. این بررسی‌کننده در حال حاضر بسیار محافظه‌کارانه عمل می‌کند تا از موارد مثبت کاذب جلوگیری شود. ما از پیشنهادها برای بهبود استقبال می‌کنیم.

    بسته شدن #578

  • بررسی‌کنندهٔ جدید unnecessary-list-index-lookup برای اندیس‌گذاری در یک لیست هنگام پیمایش روی enumerate() اضافه شد.

    بسته شدن #4525

  • پیام جدیدی با نام duplicate-value اضافه شد که مقادیر تکراری درون مجموعه‌ها را شناسایی می‌کند.

    بسته شدن #5880

  • بررسی‌کنندهٔ super-without-brackets اضافه شد، زمانی صادر می‌شود که یک فراخوانی super فاقد براکت‌های خود باشد.

    بسته شدن #4008

  • هشدار no-init (W0232) حذف شده است. نداشتن __init__ در یک کلاس اشکالی ندارد.

    بستن #2409

  • پیام assign-to-new-keyword حذف شد زیرا دیگر هیچ کلیدواژهٔ جدیدی در نسخه‌های پشتیبانی‌شدهٔ Python وجود ندارد.

    بستن #4683

  • بررسی no-self-use به یک افزونهٔ اختیاری منتقل شد. اکنون باید این بررسی را صریحاً با استفاده از load-plugins=pylint.extensions.no_self_use فعال کنید.

    بستن #5502

•
RedefinedLoopNameChecker
•
افزودن افزونهٔ اختیاری redefined-loop-name برای صدور پیام هنگام بازتعریف یک متغیر در بدنهٔ حلقه.

بستن #5072

•
DocStringStyleChecker
•
فعال‌سازی مجدد بررسی‌کنندهٔ bad-docstring-quotes برای Python <= 3.7.

بستن #6087

•
NoSelfUseChecker
•
افزودن بررسی no-self-use که پیش‌تر به‌طور پیش‌فرض فعال بود.

بستن #5502

  • نادیده گرفتن خط زیرین (_) به عنوان یک متغیر محلی برای too-many-locals آغاز شد.

    بستن #6488

  • اکنون Pylint می‌تواند با یک نیازمندی اضافی (extra-require) به نام spelling نصب شود (pip install pylint[spelling]). این کار pyenchant را به وابستگی‌های pylint اضافه می‌کند. شما همچنان باید نیازمندی‌های pyenchant (کتابخانهٔ enchant و هرگونه لغت‌نامه) را خودتان نصب کنید. همچنین باید گزینهٔ spelling-dict را تنظیم نمایید.

    ارجاع به #6462

  • بهبود نگارش متن پیام deprecated-module

    بستن #6169

  • برای اجرای Pylint اکنون به Python 3.7.2 یا جدیدتر نیاز است.

    بستن #4301

  • تلاش بیشتری صورت گرفت تا خطاهای ناشی از کتابخانهٔ astroid مجدداً به صورت AstroidError ایجاد شوند (reraise)، با این اثر که pylint به جای صرفاً fatal، پیام astroid-error را صادر می‌کند. صرف‌نظر از این، لطفاً هرگونه مشکلی از این دست را که با آن مواجه می‌شوید گزارش دهید!
  • ما تشخیص کامنت‌های درون‌خطی غیرفعال‌سازی (disable) و فعال‌سازی (enable) را بهبود داده‌ایم. اکنون غیرفعال‌سازی درون‌خطی bad-option-value ممکن است (تا زمانی که قبل از ایجاد مقدار نامعتبر گزینه غیرفعال شود، یعنی disable=bad-option-value,bad-message نه disable=bad-message,bad-option-value ) و همچنین برخی پیام‌های دیگر که پیش‌تر پشتیبانی نمی‌شدند.

    بستن #3312

  • نام بررسی‌کنندهٔ اصلی اکنون به جای master برابر با main است. از آنجا که نام بخش‌ها اختیاری است، نیازی به به‌روزرسانی پیکربندی نیست.

    بستن #5467

  • به‌روزرسانی پیام invalid-slots-object برای نمایش شیء نامعتبر به جای مقدار استنتاج‌شدهٔ آن.

    بستن #6101

  • رفع یک فروپاشی (crash) در بررسی‌کنندهٔ not-an-iterable مربوط به چند عبارت ستاره‌دار درون یک فراخوانی.

    بستن #6372

  • رفع یک فروپاشی در بررسی‌کنندهٔ unused-private-member مربوط به صفت‌های خصوصی زنجیره‌ای.

    بستن #6709

  • غیرفعال‌سازی غلط‌یابی املایی نام قوانین mypy در دستورالعمل‌های نادیده‌گیری (ignore).

    بستن #5929

  • پیام implicit-str-concat اکنون در فراخوانی‌هایی مانند open("myfile.txt" "a+b") نیز صادر خواهد شد.

    بستن #6441

  • رفع عدم رعایت غیرفعال‌سازی‌های درون‌خطی برای fixme که در آخرین سطر یک ماژول رخ می‌داد هنگامی که pylint با --enable=fixme اجرا می‌شد.
  • حذف گزینهٔ معیوب generate-man.

    بستن #5283 بستن #1887

  • رفع مشکل در فعال‌سازی deprecated-module پس از یک disable=all با قرار دادن ImportsChecker به عنوان تنها مسئول صدور deprecated-module به جای تقسیم مسئولیت با StdlibChecker. (این امر می‌توانست منجر به پیام‌های تکراری شود.)
  • افزودن گزینهٔ generate-toml-config.

    ارجاع به #5462

  • پیام bad-option-value زمانی صادر خواهد شد که یک مقدار پیکربندی یا فراخوانی خط فرمان شامل یک پیام ناشناخته باشد.

    بستن #4324

  • افزودن پیام unrecognized-option؛ در صورت مواجهه با هرگونه گزینهٔ ناشناخته صادر می‌شود.

    بستن #5259

  • رفع منفی کاذب (false negative) برای bad-string-format-type در صورتی که مقدار قالب‌بندی شونده به عنوان متغیری حاوی یک مقدار ثابت ارسال شود.
  • مفهوم اولویت بررسی‌کننده (checker priority) حذف شده است.
  • نام بررسی‌کنندهٔ cache-max-size-none به method-cache-max-size-none تغییر یافت.

    بستن #5670

  • بررسی‌کنندهٔ method-cache-max-size-none اکنون functools.cache را نیز بررسی خواهد کرد.

    بستن #5670

  • کلاس‌های BaseChecker اکنون نیازمند ارسال آرگومان linter هستند.
  • دکوراتور set_config_directly حذف شده است.
  • عدم گزارش useless-super-delegation برای متد __hash__ در کلاس‌هایی که همچنین متد __eq__ را بازنویسی (override) می‌کنند.

    بستن #3934

  • رفع صدور نادرست useless-suppression در بررسی‌کنندهٔ wrong-import-position.

    بستن #5219

  • رفع مثبت کاذب (false positive) برای no-member در Enums با اعضای تعریف‌شده توسط خود کلاس.

    بستن #5138.IP • 2 رفع منفی کاذب (false negative) برای no-member هنگام تلاش برای انتساب یک صفت نمونه به خودش بدون هرگونه انتساب قبلی.

    بسته شدن #1555

  • تغییر نوع پیام از redefined-outer-name به redefined-loop-name (افزونهٔ اختیاری) برای تعریف‌های مجدد متغیرهای حلقهٔ بیرونی توسط حلقه‌های درونی.

    بسته شدن #5608

  • اکنون بررسی‌کنندهٔ تشابه به‌طور پیش‌فرض واردکردن‌ها (imports) و امضای توابع را هنگام محاسبهٔ تکرار نادیده می‌گیرد. اگر می‌خواهید رفتار پیشین را حفظ کنید، ignore-imports و ignore-signatures را روی False تنظیم کنید.
  • اکنون Pylint مسیر کاربر (یعنی تبدیل ~ به home/yusef/) و متغیرهای محیطی (یعنی تبدیل home/$USER/$project به home/yusef/pylint برای USER=yusef و project=pylint) را برای گزینه‌های output-directory، import-graph، ext-import-graph و int-import-graph از pyreverse و همچنین گزینهٔ spelling-private-dict-file از غلط‌یاب املایی بسط می‌دهد.

    ارجاع به #6493

  • عدم صدور unsubscriptable-object برای حاشیه‌نویسی‌های رشته‌ای. Pylint بررسی نمی‌کند که آیا کلاس فقط در type stubها به‌صورت generic تعریف شده است یا خیر.

    بسته شدن #4369 و #6523

  • رفع خطای خرابی pyreverse با پیام RuntimeError: dictionary changed size during iteration

    ارجاع به #6612

  • رفع نحو حاشیه‌نویسی‌های نوع بازگشتی در نمودارهای MermaidJS تولیدشده با pyreverse.

    بسته شدن #6467

  • رفع حاشیه‌نویسی‌های نوع برای صفت‌های کلاس و نمونه با استفاده از نحو جایگزین union در نمودارهای pyreverse.
  • رفع اشکالی که در آن پیام خطای متنی ساده در stdout نوشته شده و باعث نامعتبر شدن قالب‌های خروجی می‌شد.

    بسته شدن #6597

  • بررسی‌کنندهٔ بازآفرینی کد اکنون برای max()، min() و sum() نیز پیام‌های 'consider-using-a-generator' را صادر می‌کند.

    ارجاع به #6595

  • به‌روزرسانی محدوده‌ها برای پیام‌های خطای using-constant-test و missing-parentheses-for-call-in-test.
  • عدم صدور no-member در درون حاشیه‌نویسی‌های نوع همراه با from __future__ import annotations.

    بسته شدن #6594

  • رفع مثبت کاذب (false positive) برای unexpected-special-method-signature در متدهای __init_subclass__ دارای یک یا چند آرگومان.

    بسته شدن #6644

  • گزینهٔ ignore-mixin-members منسوخ شده است. اکنون باید از گزینهٔ جدید ignored-checks-for-mixins استفاده کنید.

    بسته شدن #5205

  • قابلیت interfaces.implements منسوخ شده است و در نسخهٔ 3.0 حذف خواهد شد. لطفاً به جای __implements__ از الگوهای استاندارد وراثت استفاده کنید.

    ارجاع به #2287

  • تمام کلاس‌های Interface در pylint.interfaces منسوخ شده‌اند. می‌توانید از کلاس‌های عادی متناظر مشتق‌گیری کنید تا همان رفتار را به دست آورید. قابلیت __implements__ بر اساس یک PEP ردشده از سال ۲۰۰۱ بود: https://peps.python.org/pep-0245

    بسته شدن #2287

  • کلاس MapReduceMixin منسوخ شده است. اکنون BaseChecker متدهای get_map_data و reduce_map_data را پیاده‌سازی می‌کند. اگر یک بررسی‌کننده واقعاً نیاز به کاهش دادن (reduce) داده‌ها دارد، باید get_map_data را به‌گونه‌ای تعریف کند که مقداری غیر از None برگرداند و مدیریت فهرستی از انواع بازگردانده‌شده توسط get_map_data را به reduce_map_data خود بسپارد. نمونه‌ای از این مورد را می‌توان با بررسی pylint/checkers/similar.py مشاهده کرد.
  • صفت config در BaseChecker منسوخ شده است. می‌توانید به جای شیء مختص به بررسی‌کننده، از checker.linter.config برای دسترسی به شیء پیکربندی سراسری استفاده کنید.

    ارجاع به #5392

  • صفت level در BaseChecker منسوخ شده است: اکنون همه‌چیز همواره در --help نمایش داده می‌شود.

    ارجاع به #5392

  • متد set_option در BaseChecker منسوخ شده است. می‌توانید به جای شیء مختص به بررسی‌کننده، از checker.linter.set_option برای تنظیم یک گزینه بر روی شیء پیکربندی سراسری استفاده کنید.

    ارجاع به #5392

  • صفت options_providers در ArgumentsManager منسوخ شده است.

    ارجاع به #5392

  • رفع ذخیره‌سازی فایل‌های دادهٔ دائمی (persistent) در محیط‌هایی که پوشهٔ حافظهٔ نهان (cache) کاربر و فایل بررسی‌شده در درایوهای متفاوتی قرار دارند.

    بسته شدن #6394

  • بررسی‌کنندهٔ method-cache-max-size-none اکنون functools.cache را نیز بررسی خواهد کرد.
  • صفت config در PyLinter اکنون به جای optparse.Values از نوع argparse.Namespace است.

    ارجاع به #5392

  • کلاس UnsupportedAction منسوخ شده است.

    ارجاع به #5392

  • کلاس OptionsManagerMixIn منسوخ شده است.

    ارجاع به #5392

  • کلاس OptionParser منسوخ شده است.

    ارجاع به #5392

  • کلاس Option منسوخ شده است.

    ارجاع به #5392

  • کلاس OptionsProviderMixIn منسوخ شده است.

    ارجاع به #5392

  • کلاس ConfigurationMixIn منسوخ شده است.
  • صفت option_groups در PyLinter منسوخ شده است.

    ارجاع به #5392

  • متد get_global_config منسوخ شده است. اکنون می‌توانید از checker.linter.config به تمام گزینه‌های سراسری دسترسی داشته باشید.

    ارجاع به #5392

  • کلاس ArgumentsManager جایگزین OptionsManagerMixIn شده است. ArgumentsManager یک API خصوصی در نظر گرفته می‌شود و بیشتر متدهایی که در OptionsManagerMixIn عمومی بودند اکنون منسوخ شده‌اند و در نسخه‌های آینده حذف خواهند شد.

    ارجاع به #5392

  • کلاس ArgumentsProvider جایگزین OptionsProviderMixIn شده است. ArgumentsProvider یک API خصوصی در نظر گرفته می‌شود و بیشتر متدهایی که در OptionsProviderMixIn عمومی بودند اکنون منسوخ شده‌اند و در نسخه‌های آینده حذف خواهند شد.

    ارجاع به #5392

  • کلاس pylint.pyreverse.ASTWalker حذف شده است، چرا که تنها به‌صورت درونی توسط یک کلاس فرزند منفرد مورد استفاده قرار می‌گرفت.

    ارجاع به #6712

  • در pyreverse: حل و نمایش رابط‌های پیاده‌سازی‌شده که با صفت __implements__ تعریف می‌شوند منسوخ شده است و در نسخهٔ 3.0 حذف خواهد شد.

    ارجاع به #6713

  • تابع is_class_subscriptable_pep585_with_postponed_evaluation_enabled منسوخ شده است. به جای آن از is_postponed_evaluation_enabled(node) and is_node_in_type_annotation_context(node) استفاده کنید.

    ارجاع به #6536

تاریخ انتشار: 2022-07-17

  • رفع خرابی در بررسی undefined-loop-variable هنگامی که از enumerate() در یک عبارت سه‌تایی استفاده می‌شود.

    بستن #7131

  • رفع مشکل کار با -- به عنوان جداکننده میان آرگومان‌های مکانی و پرچم‌ها.

    بستن #7003

  • رفع مشکل غیرفعال‌سازی fixme و تعامل آن با useless-suppression.
  • مجاز شدن فهرست‌هایی از مقادیر پیش‌فرض در مستندسازی پارامترها برای سبک Numpy.

    بستن #4035

تاریخ انتشار: 2022-06-29

  • بررسی differing-param-doc توسط آرگومان‌های فقط-مکانی فعال می‌شد.

    بستن #6950

  • رفع مشکلی که در آن پویش بازگشتی دایرکتوری . با --ignore-path=^path/to/dir دایرکتوری path/to/dir را نادیده نمی‌گرفت.

    بستن #6964

  • رفع پس‌رفتی که اجازه نقل‌قول شدن init-hooks در فایل‌های گزینه‌ها را نمی‌داد.

    بستن #7006

  • رفع مثبت کاذب در modified-iterating-dict هنگام به‌روزرسانی یک کلید موجود.

    بستن #6179

  • رفع مشکلی که در آن ماشین‌های چند-هسته‌ای ویندوز (بیش از حدود ۶۰ پردازنده منطقی) هنگام استفاده از تعداد پیش‌فرض کارها دچار توقف (hang) می‌شدند.

    بستن #6965

  • رفع مشکلی در شناسایی فایل‌های setup.cfg. تنها فایل‌های .cfg که دقیقاً setup.cfg نام دارند نیاز به نام بخش‌هایی دارند که با pylint. آغاز می‌شوند.

    بستن #3630

  • عدم گزارش import-private-name برای واردسازی‌های نسبی.

    بستن #7078

تاریخ انتشار: 2022-06-18

  • رفع دو مورد مثبت کاذب در bad-super-call برای فراخوانی‌هایی که به یک والد غیرمستقیم ارجاع می‌دهند.

    بستن #4922، بستن #2903

  • رفع مثبت کاذب در useless-super-delegation برای زیرکلاس‌هایی که تعداد پارامترها را در برابر والدی که از آرگومان متغیر (variadic) استفاده می‌کند مشخص می‌کنند.

    بستن #2270

  • امکان نادیده‌گیری undefined-loop-variable و undefined-variable بدون برانگیختن useless-suppression.
  • رفع مثبت کاذب در undefined-variable برای __class__ در متدهای درونی.

    بستن #4032

تاریخ انتشار: 2022-06-15

  • رفع مثبت کاذب در unused-variable هنگامی که یک تابع شیئی از نوع argparse.Namespace را برمی‌گرداند.

    بستن #6895

  • جلوگیری از صدور پیام یکسان undefined-loop-variable دو بار در همان خط.
  • عدم بروز خرابی اگر lint.run._query_cpu() درون یک Kubernetes Pod اجرا شود که تنها کسری از یک هسته CPU به آن اختصاص یافته است؛ در این حالت با یک فرایند اجرا خواهد شد.

    بستن #6902

  • رفع مثبت کاذب در consider-using-f-string اگر سمت چپ % یک رشته نباشد.

    بستن #6689

  • رفع مثبت کاذب در unnecessary-list-index-lookup و unnecessary-dict-index-lookup هنگامی که اندیس (subscript) در بدنه یک حلقه تو در تو به‌روزرسانی می‌شود.

    بستن #6818

  • رفع مشکلی در گزینه‌های چندخطی init-hook که پایان خط‌ها را ثبت نمی‌کردند.

    بستن #6888

  • رفع مثبت کاذب در used-before-assignment هنگامی که یک بلوک try مقداری را بازمی‌گرداند اما کنترل‌کننده except نامی را از طریق حاشیه‌نویسی نوع (type annotation) تعریف می‌کند.
  • گزینه --errors-only دیگر پیام‌هایی را که قبلاً غیرفعال شده بودند فعال نمی‌کند. این گزینه بدون این‌که به‌طور شفاف مستند شده باشد مانند "ارسال تمام و تنها پیام‌های خطا" عمل می‌کرد.

    بستن #6811

    تاریخ انتشار: 2022-06-06

  • جلوگیری از گزارش unnecessary-dict-index-lookup یا unnecessary-list-index-lookup هنگامی که جستجوی اندیس، بخشی از یک انتساب ساختارشکنی (destructuring assignment) باشد.

    بسته شد: #6788

  • رفع مشکل تجزیهٔ گزینه‌های نامرتبط در tox.ini.

    بسته شد: #6800

  • رفع کرش هنگام ارزیابی متدهای __new__() که یک عبارت فراخوانی بازمی‌گردانند.

    بسته شد: #6805

  • جلوگیری از کرش در صورتی که دایرکتوری خانگی کاربر پیدا نشود.

    بسته شد: #6802

  • رفع موارد مثبت کاذب برای unused-import هنگام ایجاد نام مستعار برای typing (برای نمونه به صورت t) و محافظت از وارد کردن‌ها ذیل t.TYPE_CHECKING.

    بسته شد: #3846

  • رفع یک پس‌رفت مثبت کاذب مربوط به نگارش 2.13 برای used-before-assignment در حالتی که تکیه بر نام تعریف‌شده فقط در یک بلوک except ایمن است، زیرا بلوک else مقدار بازگردانده است.

    بسته شد: #6790

  • رفع مشکل استفاده از اختصارات برای برخی از گزینه‌های ویژه در خط فرمان.

    بسته شد: #6810

  • رفع کرش در افزونهٔ اختیاری pylint.extensions.private_import.

    بسته شد: #6624

  • پیام bad-option-value (E0012) اکنون به عنوان هشدار unknown-option-value (W0012) صادر می‌شود. پیام‌های حذف‌شده‌ای که دیگر در pylint وجود ندارند، اکنون به جای bad-option-value باعث صدور useless-option-value (R0022) می‌شوند. این امر تفکیک بین اشتباهات تایپی واقعی و پیکربندی‌های قابل پاک‌سازی را ممکن می‌سازد. دستورات غیرفعال‌سازی پیشین برای bad-option-value همچنان برای هر دو پیام جدید کار خواهند کرد.

    ارجاع: #6794

تاریخ انتشار: 2022-06-01

  • بررسی‌کنندهٔ بازآفرینی کد (refactoring checker) اکنون پیام‌های consider-using-generator / R1728 <#consider-using-generator>' را برای max()، min() و sum() نیز صادر می‌کند.

    ارجاع: #6595

  • تشخیص کامنت‌های درون‌خطی غیرفعال‌سازی و فعال‌سازی بهبود یافته است. اکنون غیرفعال کردن درون‌خطی bad-option-value (به شرط آنکه پیش از ایجاد مقدار نادرستِ گزینه غیرفعال شود، یعنی disable=bad-option-value,bad-message نه disable=bad-message,bad-option-value) و همچنین برخی پیام‌های دیگر که پیش‌تر پشتیبانی نمی‌شدند ممکن شده است.

    بسته شد: #3312

  • رفع کرش در بررسی‌کنندهٔ unused-private-member شامل صفت‌های خصوصی زنجیره‌ای.

    بسته شد: #6709

  • بررسی‌کنندهٔ جدید comparison-of-constants اضافه شد.

    بسته شد: #6076

  • کلاس pylint.pyreverse.ASTWalker حذف شد، زیرا تنها به صورت درونی توسط یک کلاس فرزند استفاده می‌شد.

    ارجاع: #6712

  • در pyreverse: تحلیل و نمایش رابط‌های پیاده‌سازی‌شده که توسط صفت __implements__ تعریف شده‌اند منسوخ شده است و در نسخهٔ 3.0 حذف خواهد شد.

    ارجاع: #6713

  • اصلاح ساختار نحو حاشیه‌نویسی نوع بازگشتی در نمودارهای MermaidJS تولیدشده با pyreverse.

    بسته شد: #6467

  • اصلاح حاشیه‌نویسی نوع برای صفت‌های کلاس و نمونه با استفاده از نحو جایگزین union در نمودارهای pyreverse.
  • رفع مثبت کاذب unexpected-special-method-signature برای متدهای __init_subclass__ دارای یک یا چند آرگومان.

    بسته شد: #6644

  • نادیده گرفتن خط زیرین (underscore) به عنوان یک متغیر محلی در بررسی‌کنندهٔ too-many-locals آغاز شد.

    بسته شد: #6488

  • بهبود متن پیام deprecated-module

    بسته شد: #6169

  • اکنون Pylint برای اجرا به Python نسخهٔ 3.7.2 یا جدیدتر نیاز دارد.

    بسته شد: #4301

  • کلاس‌های BaseChecker اکنون نیازمند ارسال آرگومان linter هستند.
  • رفع مشکل در نظر نگرفتن غیرفعال‌سازی‌های درون‌خطی برای fixme در آخرین خط یک ماژول هنگامی که pylint با گزینهٔ --enable=fixme اجرا شده باشد.
  • به‌روزرسانی پیام invalid-slots-object برای نمایش شیء نامعتبر به جای مقدار استنتاج‌شدهٔ آن.

    بسته شد: #6101

  • نام بررسی‌کنندهٔ اصلی اکنون به جای master برابر main است. نیازی به به‌روزرسانی پیکربندی نیست زیرا نام بخش‌ها اختیاری است.

    بسته شد: #5467

  • عدم گزارش useless-super-delegation برای متد __hash__ در کلاس‌هایی که متد __eq__ را نیز بازنویسی (override) می‌کنند.

    بسته شد: #3934

  • بررسی‌کنندهٔ جدید typevar-name-mismatch اضافه شد: TypeVar باید به متغیری با نام یکسان با آرگومان name آن منتسب شود.

    بسته شد: #5224

  • اکنون pylint را می‌توان با یک پیش‌نیاز اضافی (extra-require) به نام spelling نصب کرد (pip install pylint[spelling]). این کار pyenchant را به وابستگی‌های pylint اضافه می‌کند. با این حال همچنان باید پیش‌نیازهای pyenchant (کتابخانهٔ enchant و واژه‌نامه‌ها) را خودتان نصب کنید. همچنین لازم است گزینهٔ spelling-dict را تنظیم نمایید.

    ارجاع: #6462

  • حذف پیام assign-to-new-keyword به دلیل اینکه دیگر کلیدواژهٔ جدیدی در نسخه‌های پشتیبانی‌شدهٔ Python وجود ندارد.

    بسته شد: #4683

  • رفع کرش در بررسی‌کنندهٔ not-an-iterable شامل چندین عبارت ستاره‌دار در داخل یک فراخوانی.

    بسته شد: #6372

  • رفع کرش در افزونهٔ docparams شامل پرتاب کردن (raise) نتیجهٔ یک تابع.
  • رفع مشکل فعال نشدن deprecated-module پس از disable=all با محول کردن مسئولیت انحصاری صدور deprecated-module به ImportsChecker به جای تقسیم مسئولیت با StdlibChecker. (این وضعیت پیش‌تر می‌توانست باعث پیام‌های تکراری شود.)
  • هشدار no-init (W0232) حذف شده است. نداشتن متد __init__ در یک کلاس بلامانع است.

    بسته شد: #2409

  • صفت config در BaseChecker منسوخ شده است. می‌توانید از checker.linter.config برای دسترسی به شیء پیکربندی سراسری به جای یک شیء مختص به بررسی‌کننده استفاده کنید.

    ارجاع: #5392

  • صفت level در BaseChecker منسوخ شده است: اکنون همه‌چیز همواره در --help نمایش داده می‌شود.

    ارجاع: #5392

  • صفت options_providers در ArgumentsManager منسوخ شده است.

    ارجاع: #5392

  • صفت option_groups در PyLinter منسوخ شده است.

    ارجاع: #5392

  • تمام کلاس‌های Interface در pylint.interfaces منسوخ شده‌اند. برای دستیابی به رفتاری یکسان می‌توانید از کلاس‌های عادی متناظر زیرکلاس بسازید. قابلیت __implements__ بر پایهٔ یک PEP ردشده از سال 2001 بود: https://peps.python.org/pep-0245

    بسته شد: #2287

  • متد set_option در BaseChecker منسوخ شده است. می‌توانید از checker.linter.set_option برای تنظیم یک گزینه روی شیء پیکربندی سراسری به جای شیء مختص به بررسی‌کننده استفاده کنید.

    ارجاع: #5392

  • پیام implicit-str-concat اکنون در فراخوانی‌هایی مانند open("myfile.txt" "a+b") نیز صادر خواهد شد..sp بستن #6441
  • ویژگی config در PyLinter اکنون به جای optparse.Values از نوع argparse.Namespace است.

    ارجاع به #5392

  • کلاس MapReduceMixin منسوخ شده است. اکنون BaseChecker متدهای get_map_data و reduce_map_data را پیاده‌سازی می‌کند. اگر یک بررسی‌کننده نیاز واقعی به کاهش (reduce) داده‌ها داشته باشد، باید get_map_data را طوری تعریف کند که مقداری غیر از None برگرداند و مدیریت فهرستی از انواع داده‌های بازگردانده شده توسط get_map_data را به متد reduce_map_data خود بسپارد. نمونه‌ای از این مورد را می‌توان در pylint/checkers/similar.py مشاهده کرد.
  • کلاس UnsupportedAction منسوخ شده است.

    ارجاع به #5392

  • کلاس OptionsManagerMixIn منسوخ شده است.

    ارجاع به #5392

  • کلاس OptionParser منسوخ شده است.

    ارجاع به #5392

  • کلاس Option منسوخ شده است.

    ارجاع به #5392

  • کلاس OptionsProviderMixIn منسوخ شده است.

    ارجاع به #5392

  • کلاس ConfigurationMixIn منسوخ شده است.

    ارجاع به #5392

  • متد get_global_config منسوخ شده است. اکنون می‌توانید از طریق checker.linter.config به تمام گزینه‌های سراسری دسترسی داشته باشید.

    ارجاع به #5392

  • کلاس OptionsManagerMixIn با ArgumentsManager جایگزین شده است. کلاس ArgumentsManager یک API خصوصی در نظر گرفته می‌شود و بیشتر متدهایی که در OptionsManagerMixIn عمومی بودند اکنون منسوخ شده‌اند و در نگارش‌های آینده حذف خواهند شد.

    ارجاع به #5392

  • کلاس OptionsProviderMixIn با ArgumentsProvider جایگزین شده است. کلاس ArgumentsProvider یک API خصوصی در نظر گرفته می‌شود و بیشتر متدهایی که در OptionsProviderMixIn عمومی بودند اکنون منسوخ شده‌اند و در نگارش‌های آینده حذف خواهند شد.

    ارجاع به #5392

  • قابلیت interfaces.implements منسوخ شده است و در نسخهٔ 3.0 حذف خواهد شد. لطفاً به جای __implements__ از الگوهای وراثت استاندارد استفاده کنید.

    ارجاع به #2287

  • پیام invalid-enum-extension: زمانی استفاده می‌شود که یک کلاس تلاش کند یک کلاس Enum به ارث برده شده را گسترش دهد.

    بستن #5501

  • پیام unrecognized-option اضافه شد. در صورت مواجهه با هرگونه گزینهٔ ناشناخته ایجاد می‌شود.

    بستن #5259

  • بررسی‌کنندهٔ جدید typevar-double-variance اضافه شد: آرگومان‌های کلیدواژه‌ای "covariant" و "contravariant" نمی‌توانند هم‌زمان در یک TypeVar بر روی "True" تنظیم شوند.

    بستن #5895

  • فعال‌سازی مجدد بررسی‌کنندهٔ bad-docstring-quotes برای نسخهٔ Python <= 3.7.

    بستن #6087

  • گزینهٔ معیوب generate-man حذف شد.

    بستن #5283 بستن #1887

  • رفع منفی کاذب برای bad-string-format-type در صورتی که مقدار فرمت‌بندی‌شونده به عنوان متغیری حاوی یک مقدار ثابت ارسال شده باشد.
  • افزودن بررسی جدید unnecessary-dunder-call برای فراخوانی‌های غیرضروری متدهای داندر (dunder).

    بستن #5936 بستن #6074

  • بررسی‌کنندهٔ cache-max-size-none به method-cache-max-size-none تغییر نام یافت.

    بستن #5670

  • بررسی‌کنندهٔ method-cache-max-size-none اکنون functools.cache را نیز بررسی خواهد کرد.

    بستن #5670

  • پیام unnecessary-lambda-assignment: عبارت لامبدا به یک متغیر نسبت داده شده است. به جای آن تابع را با استفاده از کلیدواژهٔ "def" تعریف کنید. پیام unnecessary-direct-lambda-call: عبارت لامبدا مستقیماً فراخوانی شده است. به جای آن عبارت را به صورت درون‌خطی اجرا کنید.

    بستن #5976

  • پیام potential-index-error: هنگامی که اندیس یک لیست یا تاپل از طول آن بیشتر شود، صادر می‌شود. این بررسی‌کننده در حال حاضر برای جلوگیری از مثبت‌های کاذب کاملاً محتاط عمل می‌کند. از پیشنهادها برای بهبود آن استقبال می‌کنیم.

    بستن #578

  • افزونهٔ اختیاری redefined-loop-name برای ارسال پیام در هنگام بازتعریف متغیر حلقه در بدنهٔ حلقه اضافه شد.

    بستن #5072

  • تغییر نوع پیام از redefined-outer-name به redefined-loop-name (افزونهٔ اختیاری) برای بازتعریف متغیرهای حلقهٔ بیرونی توسط حلقه‌های درونی.

    بستن #5608

  • گزینهٔ ignore-mixin-members منسوخ شده است. اکنون باید از گزینهٔ جدید ignored-checks-for-mixins استفاده کنید.

    بستن #5205

  • پیام bad-option-value هر زمان که مقدار پیکربندی یا فراخوانی خط فرمان شامل پیامی ناشناخته باشد، صادر خواهد شد.

    بستن #4324

  • جلوگیری از گزارش superfluous-parens در عبارت‌هایی که از عملگر is not استفاده می‌کنند.

    بستن #5930

  • بررسی‌کنندهٔ super-without-brackets اضافه شد؛ هنگامی صادر می‌شود که پرانتزهای یک فراخوانی super جا افتاده باشد.

    بستن #4008

  • گزینهٔ generate-toml-config اضافه شد.

    ارجاع به #5462

  • بررسی‌کنندهٔ جدید unnecessary-list-index-lookup برای اندیس‌گذاری روی یک لیست در زمان پیمایش با استفاده از enumerate() اضافه شد.

    بستن #4525

  • رفع صدور نادرست useless-suppression در بررسی‌کنندهٔ wrong-import-position.

    بستن #5219

  • رفع مثبت کاذب no-member برای Enumهایی با اعضای تعریف‌شده توسط خود کلاس.

    بستن #5138

  • رفع منفی کاذب برای no-member در هنگام تلاش برای انتساب یک صفت نمونه به خودش بدون هیچ انتساب قبلی.

    بستن #1555

  • مفهوم اولویت بررسی‌کننده‌ها (checker priority) حذف شد.
  • افزودن گزینهٔ جدید خط فرمان --minimal-messages-config برای pytest، که تمام پیام‌های نامربوط را در حین اجرای آزمون‌های کارکردی غیرفعال می‌کند.
  • پیام duplicate-argument-name اکنون برای هر مجموعه از آرگومان‌های تکراری تنها یک بار صادر می‌شود.
  • رفع اشکالی که در آن فعال‌سازی مجزای گزینهٔ await-outside-async ممکن نبود.
  • دکوراتور set_config_directly حذف شد.
  • پیام جدیدی با نام duplicate-value اضافه شد که مقادیر تکراری درون مجموعه‌ها (sets) را شناسایی می‌کند.

    بستن #5880

  • اکنون Pylint مسیر کاربر (یعنی ~ به home/yusef/) و متغیرهای محیطی (یعنی home/$USER/$project به home/yusef/pylint برای USER=yusef و project=pylint) را برای گزینه‌های output-directory، import-graph، ext-import-graph و int-import-graph در pyreverse و همچنین گزینهٔ spelling-private-dict-file در بررسی‌کنندهٔ املا بسط می‌دهد..sp Refs #6493
  • افزونهٔ NoSelfUseChecker ایجاد شد و بررسی no-self-use به آن منتقل گردید. اکنون باید این بررسی را به‌طور صریح با استفاده از load-plugins=pylint.extensions.no_self_use فعال کنید.

    Closes #5502

  • رفع مشکل ذخیره‌سازی فایل‌های داده‌های مانا (persistent) در محیط‌هایی که دایرکتوری کش کاربر و فایل تحلیل‌شده روی درایو متفاوتی قرار دارند.

    Closes #6394

  • عدم صدور unsubscriptable-object برای حاشیه‌نویسی‌های رشته‌ای (string annotations). پایتون‌پیلینت (Pylint) دیگر بررسی نمی‌کند که آیا کلاس فقط در خردک‌های نوع (type stubs) جنریک است یا خیر.

    Closes #4369 and #6523

  • رفع کرش pyreverse با خطای RuntimeError: dictionary changed size during iteration

    Refs #6612

  • رفع باگی که در آن پیام خطای متنی ساده به stdout ارسال می‌شد و قالب‌های خروجی را نامعتبر می‌کرد.

    Closes #6597

  • تابع is_class_subscriptable_pep585_with_postponed_evaluation_enabled منسوخ شده است. به جای آن از is_postponed_evaluation_enabled(node) and is_node_in_type_annotation_context(node) استفاده کنید.

    Refs #6536

  • به‌روزرسانی محدوده‌های پیام خطای using-constant-test و missing-parentheses-for-call-in-test.
  • عدم صدور no-member درون حاشیه‌نویسی‌های نوع با from __future__ import annotations.

    Closes #6594

از آغاز pylint تا نگارش 2.14.0 (شامل آن)، ما گزارش تغییراتی (changelog) داشتیم که حاوی تمام تغییرات غیرجزئی در Pylint بود، از جمله تغییراتی که برای کاربر ملموس نبودند؛ یعنی تغییراتی که ممکن است تنها برای توسعه‌دهنده‌ای که روی pylint یا پلاگین‌های آن کار می‌کند یا یک تاریخ‌نگار دنیای متن‌باز جالب باشد.

از pylint 1.6.0 تا 2.14.0، علاوه بر گزارش تغییرات کامل، خلاصه‌ای از تغییرات (عمدتاً کاربرمحور) نیز ارائه می‌شد.

در نگارش 2.13، ما بررسی جدیدی را برای مقابله با مسائل امنیتی یونیکد (unicode) معرفی کردیم. علاوه بر آن، کارهای زیادی درون بررسی‌کنندهٔ یونیکد توسط @CarliJoy انجام شد. همچنین در میان سایر موارد، یک بررسی جدید هنگام وارد کردن (import) نام خصوصی و بررسی دیگری برای سه‌نقطهٔ (ellipsis) غیرضروری اضافه کردیم.

ما مشکلات دیرینه‌ای در رابطه با کدهای تکراری که امکان غیرفعال‌سازی نداشتند و شماره خطوطی که در برخی مواقع دقیق نبودند را رفع کردیم، و قابلیت بررسی (lint) تمام فایل‌های یک دایرکتوری را بدون نیاز به مشخص کردن تک‌تک آن‌ها اضافه نمودیم؛ یکی از مورد انتظارترین موارد مخزن. با تشکر از @matusvalo !

به لطف @jacobtylerwalls بسیاری از مشکلات مربوط به undefined-variables و used-before-assignment برطرف شدند.

ما ادغام مستندات pylint-error، ایجادشده توسط @vald-phoenix، توسعه‌دهنده‌ای اهل هلینیانی (Hlyniane) در اوکراین را آغاز کردیم. امیدواریم با وجود شرایط فعلی اوضاع او خوب باشد. استقرار مستندات راه‌اندازی شده اما هنوز کارهای زیادی برای انجام دادن باقی مانده است؛ بنابراین از هرگونه مشارکت جامعه برای کمک به بازبینی، ادغام و افزودن مثال‌های خوب/بد در https://github.com/pylint-dev/pylint/issues/5953 استقبال می‌کنیم. این کار بدون نیاز به هیچ دانشی از pylint یا astroid قابل انجام است، بنابراین اگر می‌خواهید بدون صرف وقت برای یادگیری سازوکارهای درونی در pylint مشارکت کنید، این یک نقطه ورود عالی است.

این انتشار آخرین نسخه‌ای است که از مفسرهای پایین‌تر از 3.7.2 پشتیبانی می‌کند؛ پایان عمر پایتون 3.6 در دسامبر 2021 فرا رسید.

•
افزودن چندین بررسی‌کننده (checker) برای رسیدگی به مسائل امنیتی یونیکد (برای جزئیات به Trojan Sources https://trojansource.codes و PEP 672 https://peps.python.org/pep-0672 مراجعه کنید) که با خوانایی کد نیز مرتبط هستند. به‌طور مشخص، بررسی‌های زیر اضافه شدند:
  • بررسی‌کنندهٔ bad-file-encoding بررسی می‌کند که فایل بر اساس پیشنهاد PEP8 https://peps.python.org/pep-0008/#source-file-encoding با فرمت UTF-8 کدگذاری شده باشد. در حال حاضر UTF-16 و UTF-32 توسط پایتون https://bugs.python.org/issue1503789 پشتیبانی نمی‌شوند. در صورت تغییر این وضعیت، invalid-unicode-codec بررسی می‌کند که از آن‌ها استفاده نشود، تا سازگاری رو به عقب حفظ شود.
  • بررسی‌کنندهٔ bidirectional-unicode نویسه‌های یونیکد دوجهته (bidirectional) را بررسی می‌کند که می‌توانند باعث شوند اجرای کد با آنچه کاربر انتظار دارد متفاوت باشد.
  • بررسی‌کننده‌های invalid-character-backspace، invalid-character-carriage-return، invalid-character-sub، invalid-character-esc، invalid-character-zero-width-space و invalid-character-nul برای بررسی نویسه‌های گریز‌نخوردهٔ (unescaped) بالقوه آسیب‌رسان.

Closes #5281

  • بررسی‌کنندهٔ unnecessary-ellipsis: زمانی صادر می‌شود که ثابت سه‌نقطه (ellipsis) به‌طور غیرضروری استفاده شود.

    Closes #5460

  • افزودن بررسی‌کنندهٔ جدید typevar-name-missing-variance. زمانی صادر می‌شود که یک TypeVar هم‌وردا (covariant) یا پادوردا (contravariant) به‌ترتیب به _co یا _contra ختم نشود، یا زمانی که یک TypeVar هیچ‌کدام از این دو نباشد اما دارای پسوند باشد.
  • افزودن modified-iterating-list، modified-iterating-dict و modified-iterating-set؛ زمانی صادر می‌شوند که مواردی به‌ترتیب به یک لیست، دیکشنری یا مجموعه‌ای که در حال پیمایش است افزوده یا از آن حذف شوند.

    Closes #5348

  • افزودن بررسی‌کنندهٔ redefined-slots-in-subclass: زمانی صادر می‌شود که یک slot در یک زیرکلاس (subclass) بازتعریف شود.

    Closes #5617

بازنویسی بررسی‌کنندهٔ non-ascii-name.
اکنون اطمینان حاصل می‌کند که __all__ نام‌های پایتون ASCII هستند و همچنین نام‌های واردشده (non-ascii-module-import) و نام فایل‌ها (non-ascii-file-name) را به‌درستی بررسی کرده و هشدارهای جدید مربوطه را صادر می‌کند.

نویسه‌های غیر ASCII می‌توانند هوموگلیف (نویسه‌های هم‌شکل) باشند و تایپ کردن آن‌ها با صفحه‌کلید غیرتخصصی دشوار است. بخش Confusable Characters را در PEP 672 https://peps.python.org/pep-0672/#confusable-characters-in-identifiers ببینید.

•
افزودن بررسی‌کنندهٔ cache-max-size-none که استفاده از functools.lru_cache را روی متدهای کلاس با مقدار maxsize برابر با None بررسی می‌کند. این کار توصیه نمی‌شود زیرا با جلوگیری دائمی از جمع‌آوری زباله (garbage collection) برای نمونه، باعث ایجاد نشت حافظه می‌شود.

Closes #5670 Closes #6180

•
افزونه‌ی منسوخ‌شده‌ی check_docs حذف شد. می‌توانید برای بهره‌گیری از بررسی‌هایی که پیش‌تر در check_docs گنجانده شده بودند، از بررسی‌کننده‌ی docparams استفاده کنید.

Closes #5322

  • افزونه‌ی جدید import-private-name: وارد کردن (import) بسته‌ها و شیءهای خصوصی خارجی (دارای پیشوند _) را مشخص می‌کند. این افزونه با استفاده از load-plugins=pylint.extensions.private_import قابل بارگذاری است.

    Closes #5463

  • دستور Pyreverse - افزودن خروجی در قالب mermaid-js و html که یک نمودار mermaid js به همراه کدهای پایه‌ای (boilerplate) html است
  • TypingChecker
  • بررسی جدید broken-noreturn برای تشخیص استفاده‌های معیوب از typing.NoReturn در صورتی که py-version روی پایتون 3.7.1 یا پایین‌تر تنظیم شده باشد، اضافه شد. https://bugs.python.org/issue34921
  • بررسی جدید broken-collections-callable برای تشخیص استفاده‌های معیوب از collections.abc.Callable در صورتی که py-version روی پایتون 3.9.1 یا پایین‌تر تنظیم شده باشد، اضافه شد. https://bugs.python.org/issue42965
•
DocstringParameterChecker
•
دسته‌بندی نادرست docstring به سبک Numpy به‌جای سبک Google برای docstringهایی که دارای مستندات property setter بودند، برطرف شد. دسته‌بندی docstring اکنون به‌جای ترتیب آزمودن سبک‌های docstring، بر اساس بیشترین تعداد بخش‌های منطبق‌شده انجام می‌شود.
•
DocStringStyleChecker
•
غیرفعال‌سازی بررسی‌کننده‌ی bad-docstring-quotes برای پایتون <= 3.7؛ زیرا در این نسخه‌ها شماره خطوط برای توابع و کلاس‌های دکوریت‌شده (decorated) قابل اعتماد نبوده و با این بررسی‌کننده تداخل ایجاد می‌کند.

Closes #3077

  • گنجاندن testing_pylintrc در توزیع‌های مبدأ (source) و wheel.

    Closes #6028

  • رفع مثبت کاذب برای unused-import هنگام غیرفعال‌سازی هم‌زمانِ used-before-assignment و undefined-variable.

    Closes #6089

  • رفع مثبت کاذب برای unnecessary-ellipsis هنگام استفاده از سه نقطه (ellipsis) به‌عنوان یک آرگومان پیش‌فرض.

    Closes #5973

  • افزودن متدهای dunder جاافتاده به بررسی unexpected-special-method-signature.
  • عدم صدور no-member در حلقه‌های for که به self ارجاع می‌دهند، در صورتی که عملگر دودویی آغازگر حلقه‌ی for از یک self محصورشده در تاپل‌ها یا لیست‌ها استفاده کند.

    Refs pylint-dev/astroid#1360 Closes #4826

  • رفع مشکل تطبیق گزینه‌های --notes که به یک نویسه‌ی غیرکلمه‌ای ختم می‌شوند.

    Closes #5840

  • شماره‌گذاری خطوط برای پیام‌های مربوط به آرگومان‌های تابع اکنون دقیق‌تر شده است. این امر ممکن است نیازمند انتقال برخی از دستورهای غیرفعال‌سازی پیام به موقعیت‌های به‌روزرسانی‌شده باشد.
شناسه‌های پیام using-f-string-in-unsupported-version و using-final-decorator-in-unsupported-version
از W1601 و W1602 به W2601 و W2602 تغییر نام یافتند. غیرفعال‌سازی‌هایی که از این شناسه‌ها استفاده می‌کنند از کار خواهند افتاد. این کار به‌منظور بازگرداندن سازگاری با msgidهای از قبل موجود برای apply-builtin و basestring-builtin از بررسی‌کننده‌ی اکنون حذف‌شده‌ی python 3K+ انجام شده است. اکنون بررسی جدیدی وجود دارد که اطمینان حاصل می‌کند از msgidها یا نمادهای موجود از بررسی‌کننده‌های حذف‌شده استفاده نشود.

Closes #5729

  • افزودن گزینه‌ی --recursive برای امکان کشف بازگشتی تمام ماژول‌ها و بسته‌ها در زیردرخت (subtree). اجرای pylint با گزینه‌ی --recursive=y تمام فایل‌های .py و بسته‌های کشف‌شده در زیردرخت دایرکتوریِ ارائه‌شده به‌عنوان پارامتر به pylint را بررسی خواهد کرد.

    Closes #352

  • موقعیت پیام‌ها برای تعاریف کلاس و تابع به‌روزرسانی شد تا دیگر کل تعریف را در بر نگیرد. تنها def یا class به همراه نام کلاس/تابع پوشش داده می‌شوند.

    Closes #5466

  • بازگرداندن بررسی‌هایی از بررسی‌کننده‌ی python3 که هنوز برای python 3 مفید هستند (eq-without-hash). این بررسی اکنون در افزونه‌ی اختیاری pylint.extensions.eq_without_hash قرار دارد.

    Closes #5025

  • رفع منفی کاذب (false-negative) برای بررسی‌کننده‌ی assignment-from-none با متد ()list.sort.

    Closes #5722

  • رفع مثبت کاذب unused-private-member هنگام دسترسی به متدهای خصوصی از طریق property.

    Closes #4756

  • رفع خرابی (crash) ناشی از arguments-differ و arguments-renamed هنگامی که متدها خارج از بالاترین سطح یک کلاس تعریف شده بودند.

    Closes #5648

  • پیام‌های هشدار بهتر برای else یا elif بی‌استفاده هنگامی که یک تابع زودتر بازمی‌گردد (early return).

    Closes #5614

  • علامت‌های ستاره دیگر در مستندسازی پارامتر به سبک Sphinx و Google برای missing-param-doc الزامی نبوده و به‌درستی تجزیه می‌شوند.

    Closes #5815 Closes #5406

  • رفع خطای AstroidError در نسخه‌ی 2.13.0 که توسط بررسی‌کننده‌ی `duplicate-code` با فعال بودن ignore-imports یا ignore-signatures رخ می‌داد.

    Closes #6301

  • استفاده از بسته‌ی tomli به‌جای toml برای تجزیه‌ی فایل‌های .toml.

    Closes #5885

  • رفع مثبت کاذب consider-using-dict-comprehension هنگام ایجاد یک dict با استفاده از فهرستی از تاپل‌ها که در آن کلید و مقدار هر دو وابسته به یک شرط تغییر می‌کنند.

    Closes #5588

  • هنگام اجرا در حالت موازی، pylint اکنون داده‌های ارسالی به زیرفرایندها (subprocesses) را با بسته‌ی dill پیکل (pickle) می‌کند. از این رو بسته‌ی dill به‌عنوان یک وابستگی اضافه شده است.
  • رفع مثبت کاذب برای global-variable-undefined هنگامی که global با نام یک کلاس استفاده می‌شود

    Closes #3088

  • رفع خرابی (crash) در propertyها و متدهای کلاس به ارث‌رسیده هنگام مقایسه‌ی برابری آن‌ها با یک dict خالی.

    Closes #5646

  • به‌طور پیش‌فرض، pylint دیگر فایل‌هایی را که با .# شروع می‌شوند در نظر نمی‌گیرد. این فایل‌ها قفل‌های فایل Emacs در نظر گرفته می‌شوند https://www.gnu.org/software/emacs/manual/html_node/elisp/File-Locks.html. این رفتار را می‌توان با بازتعریف گزینه‌ی ignore-patterns به حالت قبل بازگرداند.

    Closes #367

  • رفع super-init-not-called هنگامی که والد یا self یک Protocol باشد

    Closes #4790

  • الگوی گزارش مشکل (issue template) برای خرابی‌ها اکنون برای خرابی‌هایی که پیش‌تر تحت پوشش این سازوکار نبودند نیز ایجاد می‌شود.

    Closes #5668.IP • 2 مشکلی در astroid که در آن symlinkها در نظر گرفته نمی‌شدند، برطرف شد.

    Closes #1470 Closes #3499 Closes #4302 Closes #4798 Closes #5081

  • رفع منفی کاذب برای undefined-variable و پیام‌های متغیر مرتبط، هنگامی که همان متغیر تعریف‌نشده به‌عنوان type annotation استفاده شده و چندین بار فراخوانی می‌شود، یا به‌عنوان آرگومان پیش‌فرض یک تابع به کار می‌رود.

    Closes #5399

  • ارسال used-before-assignment به جای undefined-variable هنگام تلاش برای دسترسی به type annotationهای استفاده‌نشده.

    Closes #5713

  • رفع مشکلی که در آن ungrouped-imports بدون ایجاد useless-suppression قابل غیرفعال‌سازی نبود.

    Refs #2366

  • رفع خرابی (crash) در گره‌های __init__ زمانی که صفت مورد نظر قبلاً به دلیل محدودیت اندازه حافظه موقت (cache) غیرقابل استنتاج بود. این محدودیت می‌تواند زمانی رخ دهد که الگوی وراثت یک کلاس (و در نتیجه صفت __init__) بسیار بزرگ باشد.

    Closes #5679

  • رفع پردازش بسیار طولانی خطوط بلند حاوی کاما.

    Closes #5483

  • رفع مثبت کاذب super-init-not-called برای کلاس‌هایی که init خود را از والد به ارث می‌برند.

    Closes #4941

  • رفع مثبت‌های کاذب برای used-before-assignment ناشی از استفاده از named expressions در شرط عملگر سه‌گانه و استفاده از آن عبارت به‌عنوان آرگومان فراخوانی.

    Closes #5177, #5212

  • رفع خرابی همراه با خطای بازگشت (recursion error) برای استنتاج صفت‌های کلاسی که به خود کلاس ارجاع می‌دادند.

    Closes #5408 Refs pylint-dev/astroid#1392

  • رفع مثبت کاذب برای unused-argument زمانی که یک متد بازنویسی‌شده در یک زیرکلاس هیچ عملیاتی با مقدار یک آرگومان keyword-only انجام نمی‌دهد.

    Closes #5771 Refs pylint-dev/astroid#1382

  • بهینه‌سازی تجزیه (parsing) خطوط طولانی زمانی که missing-final-newline فعال است.

    Closes #5724

  • رفع مثبت کاذب برای used-before-assignment ناشی از تعریف کلاس تودرتو درون تابعی که از یک کلاس تعریف‌شده در خارج از تابع ارث‌بری می‌کند.

    Closes #4590

  • رفع مثبت کاذب unnecessary_dict_index_lookup هنگام حذف یک مدخل از دیکشنری.

    Closes #4716

  • رفع مثبت کاذب برای used-before-assignment زمانی که نام یک گرداننده except با شرطی در یک comprehension فیلترشده یکسان است.

    Closes #5817

  • رفع خرابی در بررسی‌کننده unused-private-member هنگام تحلیل کدی که از type(self) در متدهای متصل (bound methods) استفاده می‌کند.

    Closes #5569

  • رفع خرابی در بررسی‌کننده unnecessary-dict-index-lookup اگر خروجی items() به یک تاپل تک‌عضوی (1-tuple) منتسب شود.

    Closes #5504

  • رفع خرابی در انتساب‌های slots و انتساب‌های دارای نوع‌نویسی (annotated assignments).

    Closes #5479

  • رفع خرابی در بررسی‌کننده unspecified-encoding هنگام ارسال None به آرگومان mode در فراخوانی open().

    Closes #5731

  • رفع خرابی مربوط به NewType نام‌گذاری‌شده با یک f-string.

    Closes #5770 Refs pylint-dev/astroid#1400

  • بهبود پیام bad-open-mode هنگام ارسال None به آرگومان mode در فراخوانی open().

    Closes #5733

  • رفع منفی کاذب برای consider-iterating-dictionary هنگام بررسی‌های عضویت در قالب تکرارپذیرها یا بررسی‌های not in.

    Closes #5323

  • امکان غیرفعال‌سازی duplicate-code با یک کامنت غیرفعال‌سازی هنگام اجرا از طریق pylint.

    Closes #214

  • رفع مثبت کاذب برای undefined-variable زمانی که صفت‌های کلاس namedtuple به‌عنوان return annotation استفاده می‌شوند.

    Closes #5568

  • افزودن سطح اطمینان CONTROL_FLOW برای هشدارهایی که به فرضیات مربوط به جریان کنترل متکی هستند.
  • اکنون used-before-assignment در نظر می‌گیرد که انتساب‌ها در یک بلوک try ممکن است هنگام اجرای بلوک‌های except یا finally رخ نداده باشند.

    Closes #85, #2615

  • رفع منفی کاذب برای used-before-assignment زمانی که یک عبارت شرطی یا context manager پیش از دستور try مداخله کرده و احتمال شکست آن را نشان می‌داد.

    Closes #4045

  • رفع منفی کاذب برای used-before-assignment در بلوک‌های finally چنانچه گرداننده except، انتسابی را که ممکن بود در بلوک try با شکست مواجه شود، تعریف نکرده باشد.
  • رفع یک مثبت کاذب برای assigning-non-slot زمانی که کلاس دارای slots، متد __setattr__ را تعریف کرده باشد.

    Closes #3793

  • رفع یک مثبت کاذب برای invalid-class-object زمانی که شیء منتسب‌شده به صفت __class__ غیرقابل استنتاج باشد.
  • افزودن نیازمندی اضافی testutil به بسته‌بندی، چرا که gitpython نباید همیشه جزو وابستگی‌ها باشد اما همچنان برای استفاده از کد کمکی primer در pylint.testutil مورد نیاز است. می‌توانید آن را با pip install pylint[testutil] نصب کنید.

    Closes #5486

  • رفع یک مثبت کاذب برای used-before-assignment زمانی که یک named expression به‌عنوان نخستین مقدار در یک ظرف (container) ظاهر شود.

    Closes #5112

  • رفع مثبت کاذب برای used-before-assignment در صورت وجود type annotation خودارجاع در عبارات شرطی درون متدهای کلاس.

    Closes #5499

  • اکنون used-before-assignment فرض می‌کند که انتساب‌ها در بلوک‌های except ممکن است رخ نداده باشند و بر این اساس هشدار می‌دهد.

    Closes #4761

  • هنگام ارزیابی عبارات پس از یک بلوک except، چنانچه بلوک try متناظر شامل دستور return باشد، used-before-assignment فرض می‌کند که انتساب‌ها در بلوک‌های except انجام گرفته‌اند.

    Closes #5500

  • رفع یک منفی کاذب برای used-before-assignment زمانی که برخی از گرداننده‌های except (و نه همه آن‌ها) نامی را تعریف کرده بودند که پس از بلوک except مورد اتکا بود، در حالی که بلوک try متناظر حاوی دستور return بود.

    Closes #5524

  • هنگام ارزیابی عبارات در بند else یک حلقه، چنانچه گرداننده‌های except تنها روش‌های به پایان رسیدن حلقه بدون خروج زودهنگام (break) باشند، used-before-assignment فرض می‌کند که انتساب‌ها در بلوک‌های except انجام گرفته‌اند..sp بسته شد #5683
  • اکنون used-before-assignment نام‌ها را در بلوک‌های try بررسی می‌کند.
  • رفع مثبت کاذب در used-before-assignment برای عبارت‌های انتساب در دستورهای lambda.

    بسته شد #5360، #3877

  • بهبود بررسی invalid-name برای نام‌های TypeVar. الگوی پذیرفته‌شده را می‌توان با --typevar-rgx سفارشی‌سازی کرد.

    بسته شد #3401

  • رفع یک مثبت کاذب (مربوط به نسخهٔ در حال توسعهٔ منتشرنشده) برای used-before-assignment مرتبط با تشابه نام‌ها میان comprehensionهای فیلترشده و انتساب‌ها در بلوک‌های except.

    بسته شد #5586

  • رفع خرابی در list comprehensionهایی که از type به عنوان نام متغیر درونی استفاده می‌کردند.

    بسته شد #5461

  • رفع خرابی در بررسی‌کنندهٔ use-maxsplit-arg هنگام ارائهٔ کلیدواژه‌ایِ آرگومان sep به str.split().

    بسته شد #5737

  • رفع مثبت کاذب برای unused-variable در مورد متغیر comprehension که با یک یادداشت نوع در دامنهٔ بیرونی مطابقت دارد.

    بسته شد #5326

  • رفع منفی کاذب برای undefined-variable در مورد متغیری که چندین بار در یک comprehension هم‌نام با یادداشت نوعِ استفاده‌نشده در دامنهٔ بیرونی به کار رفته است.

    بسته شد #5654

  • الزام پایتون 3.6.2 برای اجرای pylint.

    بسته شد #5065

  • رفع خرابی هنگام مواجهه با دکوراتورهای غیرقابل استنتاج در پایتون 3.6 و 3.7
  • صدور redefined-outer-name هنگامی که یک مدیریت‌کنندهٔ except تودرتو بر یک مورد بیرونی سایه‌اندازی می‌کند.

    بسته شد #4434 بسته شد #5370

  • اکنون می‌توان encoding را به عنوان یک آرگومان موضعی به فراخوانی‌های بازکنندهٔ فایل ارسال کرد، بدون آنکه unspecified-encoding صادر شود.

    بسته شد #5638

  • خطاهای مهلک (fatal) اکنون صرف‌نظر از اینکه ماژول بررسی‌شده حاوی دستوری باشد یا خیر، امتیاز 0.0 را برمی‌گردانند

    بسته شد #5451

  • متغیر fatal به متغیرهای مجاز در عبارت‌های ارزیابی امتیاز اضافه شد.
  • ارزیابی پیش‌فرض امتیاز اکنون از کف 0 استفاده می‌کند.

    بسته شد #2399

  • رفع مثبت کاذب comparison-with-callable برای فراخوان‌پذیرهایی (callables) که استثنا صادر می‌کنند، مانند ثابت‌های typing.

    بسته شد #5557

  • هنگام فراخوانی pylint، epylint، symilar یا pyreverse با وارد کردن (import) آن‌ها در یک فایل پایتون، می‌توان اکنون علاوه بر دستکاری sys.argv، کلمه کلیدی argv را نیز ارسال کرد.

    بسته شد #5320

  • کلاس PyLinter اکنون در صورت عدم ارائهٔ گزارشگر، با یک TextReporter به عنوان گزارشگر خود مقداردهی اولیه خواهد شد.
  • رفع مثبت کاذب not-callable برای ویژگی‌هایی که نام مستعار NamedTuple هستند

    رفع بخشی از #1730

  • بخش testutils برای unittestها اکنون end_lineno و end_column را می‌پذیرد. تست‌های فاقد این موارد باعث صدور DeprecationWarning خواهند شد.
  • هشدار arguments-differ دیگر از تعریف مجدد متدها با پارامترهای اضافی که دارای مقادیر پیش‌فرض هستند ایرادی نخواهد گرفت.

    بسته شد #1556، #5338

  • غیرفعال‌سازی‌های مربوط به deprecated-module و هشدارهای مشابه برای ویژگی‌های stdlib که در نسخه‌های جدیدتر پایتون منسوخ شده‌اند، هنگام تحلیل کد با مفسرهای قدیمی‌تر پایتون که این ویژگی‌ها هنوز در آن‌ها منسوخ نشده‌اند، دیگر useless-suppression صادر نمی‌کنند.
  • وارد کردن ماژول منسوخ‌شدهٔ stdlib یعنی xml.etree.cElementTree اکنون deprecated_module را صادر می‌کند.

    بسته شد #5862

  • وارد کردن ماژول منسوخ‌شدهٔ stdlib یعنی distutils در پایتون 3.10+ اکنون deprecated_module را صادر می‌کند.
  • رفع مثبت کاذب unexpected-keyword-arg برای دکوراتورها.

    بسته شد #258

  • بررسی‌کنندهٔ missing-raises-doc اکنون سلسله‌مراتب کلاسی استثناهای پرتاب‌شده را بررسی می‌کند
def my_function():
  """My function.
  Raises:
    Exception: if something fails
  """
  raise ValueError

بسته شد #4955

  • رفع مثبت کاذب برای unused-variable هنگامی که یک نام nonlocal به عنوان بخشی از یک انتساب چندنامی مقداردهی می‌شود.

    بسته شد #3781

  • رفع مثبت کاذب - مجاز دانستن بازگشایی (unpacking) متغیر self در زیرکلاسی از typing.NamedTuple.

    بسته شد #5312

  • رفع منفی کاذب unpacking-non-sequence زمانی که مقدار یک لیست خالی است.

    بسته شد #5707

  • رفع مثبت کاذب برای global-variable-not-assigned هنگامی که از دستور del استفاده می‌شود

    بسته شد #5333

  • اصلاح راهنمایی‌های نوع در نمودارهای کلاسی تولیدشده توسط pyreverse برای متدهای کلاس و متدهایی که None برمی‌گردانند.
  • ارائهٔ پیام خطای بهتر در صورت استفاده از قالب‌های پروندهٔ پشتیبانی‌نشده با pyreverse.

    بسته شد #5950

  • رفع مثبت کاذب برای unused-argument هنگامی که یک نام nonlocal در یک تابع تودرتو به کار می‌رود که بدون فراخوانی توسط والدش بازگردانده می‌شود.

    بسته شد #5187

  • جلوگیری از صدور raising-bad-type هنگامی که ابهام در استنتاج نوع متغیر پرتاب‌شده وجود دارد.

    بسته شد #2793

  • رفع مثبت کاذب برای superfluous-parens در الگوهایی مانند "return (a or b) in iterable".

    بسته شد #5803

  • رفع خرابی در بررسی‌کنندهٔ unsupported-membership-test هنگام انتساب چندین مقدار ثابت به ویژگی‌های کلاس از جمله __iter__ از طریق بازگشایی (unpacking).

    بسته شد #6366

  • رفع مثبت کاذب برای used-before-assignment در انتساب‌هایی که از طریق اعلان‌های nonlocal پس از یک یادداشت نوع قبلی رخ می‌دهند.

    بسته شد #5394

  • رفع مثبت کاذب برای unused-variable زمانی که به یک مورد توکار (builtin) مشخص‌شده در --additional-builtins یک یادداشت نوع اختصاص داده می‌شود.

    بسته شد #6388

  • رفع مثبت کاذب برای nonexistent-operator / E0107 <#nonexistent-operator>' هنگامی که '-'های تکراری از یکدیگر جدا شده‌اند (برای مثال با پرانتز).

    بسته شد #5769.IP • 2 رفع مثبت کاذب برای undefined-loop-variable هنگامی که بخش else از یک حلقهٔ for استثنا ایجاد می‌کند یا بازمی‌گردد.

    بستن #5971

  • صادر کردن not-callable تنها زمانی که تمام مقادیر استنتاج‌شدهٔ یک ویژگی فراخوانی‌پذیر نباشند.

    بستن #5931

  • رفع مثبت کاذب برای unused-variable برای کلاس‌های درون توابع و مواردی که یک متاکلاس از طریق یک فراخوانی ارائه شده است.

    بستن #4020

  • اجتناب از گزارش superfluous-parens در عبارت‌هایی که از عملگر is not استفاده می‌کنند.

    بستن #5930

  • رفع مثبت کاذب برای undefined-loop-variable برای متغیری که در یک lambda درون نخستین حلقه از چندین حلقه استفاده شده است.

    بستن #6419

  • رفع مثبت کاذب برای unsubscriptable-object در Python 3.8 و پیش از آن برای دستورهای محافظت‌شده با if TYPE_CHECKING.

    بستن #3979

  • رفع خرابی هنگام دسترسی به __code__ و انتساب آن به یک متغیر.

    بستن #6539

  • رفع خرابی هنگام ارزیابی (linting) فایلی که یک عدد صحیح را به عنوان mode= به open ارسال می‌کند.

    بستن #6414

  • رفع مثبت‌های کاذب برای no-name-in-module و import-error برای numpy.distutils و pydantic.

    بستن #6497

  • رفع خرابی IndexError در متد uninferable_final_decorators.

    مرتبط با #6531

  • رفع خرابی در unnecessary-dict-index-lookup هنگام اندیس‌گذاری یک صفت.

    بستن #6557

  • رفع مثبت کاذب برای undefined-loop-variable هنگام استفاده از enumerate().

    بستن #6593

تاریخ انتشار: 2022-05-13

  • رعایت گزینه‌های پیکربندی نادیده‌گیری با --recursive=y.

    بستن #6471

  • رفع مثبت‌های کاذب برای no-name-in-module و import-error برای numpy.distutils و pydantic.

    بستن #6497

  • رفع خرابی IndexError در متد uninferable_final_decorators.

    مرتبط با #6531

  • رفع خرابی در unnecessary-dict-index-lookup هنگام اندیس‌گذاری یک صفت.

    بستن #6557

  • رفع خرابی هنگام دسترسی به __code__ و انتساب آن به یک متغیر.

    بستن #6539

  • رفع مثبت کاذب برای undefined-loop-variable هنگام استفاده از enumerate().

    بستن #6593

    تاریخ انتشار: 2022-05-02

  • رفع مثبت کاذب برای undefined-loop-variable برای متغیری که درون یک lambda در اولین حلقه از چندین حلقه استفاده شده است.

    بسته شد #6419

  • رفع کرش هنگام لینت کردن فایلی که یک مقدار صحیح mode= را به open ارسال می‌کند.

    بسته شد #6414

  • جلوگیری از گزارش superfluous-parens در عبارت‌هایی که از عملگر is not استفاده می‌کنند.

    بسته شد #5930

  • رفع مثبت کاذب برای undefined-loop-variable هنگامی که بخش else از یک حلقهٔ for استثنا صادر می‌کند (raise) یا مقداری را بازمی‌گرداند (return).

    بسته شد #5971

  • رفع مثبت کاذب برای unused-variable برای کلاس‌های درون توابع و در مواردی که یک metaclass از طریق یک فراخوانی ارائه شده است.

    بسته شد #4020

  • رفع مثبت کاذب برای unsubscriptable-object در پایتون 3.8 و پایین‌تر برای دستورهای محافظت‌شده با if TYPE_CHECKING.

    بسته شد #3979

تاریخ انتشار: 2022-04-20

•
رفع کرش ناشی از استفاده از پیکربندی جدید نسخهٔ 2.14.0 در کدهای 2.13.x.

بسته شد #6408

تاریخ انتشار: 2022-04-20

  • رفع کرش در بررسی‌کنندهٔ unsupported-membership-test هنگام انتساب چندین مقدار ثابت به خصوصیات کلاس از جمله __iter__ از طریق تجزیه (unpacking).

    بسته شد #6366

  • در مستندسازی پارامترها به سبک Sphinx و Google، دیگر نیازی به ستاره‌ها برای missing-param-doc نیست و آن‌ها به درستی تجزیه می‌شوند.

    بسته شد #5815 بسته شد #5406

  • رفع مثبت کاذب برای unused-variable هنگامی که به یک شناسهٔ توکارِ مشخص‌شده در --additional-builtins، یک نشانه‌گذاری نوع (type annotation) اختصاص داده شده باشد.

    بسته شد #6388

  • رفع خطای AstroidError در 2.13.0 که توسط بررسی‌کنندهٔ duplicate-code در هنگام فعال بودن ignore-imports یا ignore-signatures رخ می‌داد.

    بسته شد #6301

تاریخ انتشار: 2022-04-06

  • رفع پسرفت مثبت کاذب در 2.13.0 برای used-before-assignment در مورد هم‌نامی میان انتساب متغیرها در بلوک‌های try/except و متغیرها در اندیس‌ها (subscripts) در comprehensionها.

    بسته شد #6069 بسته شد #6136

  • بررسی‌کنندهٔ lru-cache-decorating-method به cache-max-size-none تغییر نام یافت و تنها زمانی صادر خواهد شد که maxsize برابر با None باشد.

    بسته شد #6180

  • رفع مثبت کاذب برای unused-import هنگام غیرفعال کردن هم‌زمان used-before-assignment و undefined-variable.

    بسته شد #6089

  • محدود کردن دامنهٔ بررسی‌کنندهٔ unnecessary-ellipsis به: * توابع و کلاس‌هایی که شامل هر دو مورد docstring و ellipsis باشند. * بدنه‌ای که شامل یک گرهٔ nodes.Expr از نوع ellipsis و حداقل یک دستور دیگر باشد.
  • رفع مثبت کاذب برای used-before-assignment برای انتساب‌هایی که از طریق اعلان‌های nonlocal پس از یک نشانه‌گذاری نوع قبلی صورت می‌گیرند.

    بسته شد #5394

  • رفع کرش برای redefined-slots-in-subclass هنگامی که نوع slot یک مقدار ثابت (const) یا یک رشته نباشد.

    بسته شد #6100

  • ارسال not-callable تنها زمانی که هیچ‌یک از مقادیر استنتاج‌شده برای یک ویژگی (property) قابل فراخوانی نباشند.

    بسته شد #5931

  • رفع یک منفی کاذب برای subclassed-final-class هنگامی که مجموعه‌ای از پیام‌های دیگر غیرفعال شده بودند.

    تاریخ انتشار: 2022-03-31

  • رفع پس‌رفت مثبت کاذب در 2.13.0 برای used-before-assignment در مواردی که بین انتساب متغیرها در بلوک‌های try/except و متغیرها در فیلتر یک comprehension تشابه اسمی وجود داشت.

    بستن #6035

  • گنجاندن testing_pylintrc در توزیع‌های سورس و wheel.

    بستن #6028

  • رفع کرش در بررسی‌کنندهٔ super-init-not-called هنگام استفاده از ctypes.Union.

    بستن #6027

  • رفع کرش در بررسی‌کنندهٔ unnecessary-ellipsis هنگامی که از سه‌نقطه (ellipsis) درون یک ظرف (container) یا عبارت lambda استفاده می‌شود.

    بستن #6036 بستن #6037 بستن #6048

تاریخ انتشار: 2022-03-29

  • رفع مثبت کاذب برای unnecessary-ellipsis هنگام استفاده از سه‌نقطه (ellipsis) به عنوان آرگومان پیش‌فرض.

    بستن #5973

  • رفع کرش مربوط به بازگشایی نامتوازن تاپل (unbalanced tuple unpacking).

    بستن #5998

  • رفع مثبت کاذب برای nonexistent-operator / E0107 <#nonexistent-operator>' هنگامی که نویسه‌های تکراری '-' از هم جدا شده‌اند (مثلاً با پرانتز).

    بستن #5769

تاریخ انتشار: 2022-03-27

  • رفع کرش هنگام ایجاد زیرکلاس از یک namedtuple.

    بستن #5982

  • رفع مثبت کاذب برای superfluous-parens در الگوهایی مانند "return (a or b) in iterable".

    بستن #5803

  • رفع پس‌رفت منفی کاذب در نسخه 2.13.0 که در آن protected-access برای توابع صادر نمی‌شد.

    بستن #5989

  • پیام‌های خطای بهتر در صورت کرش، هنگامی که pylint قادر به نوشتن الگوی گزارش مشکل نیست.

    ارجاع به #5987

تاریخ انتشار: 2022-03-26

  • رفع یک پس‌رفت در نسخه 2.13.0 که در آن برای استفاده از یک متغیر nonlocal در یک بلوک try، هشدار used-before-assignment صادر می‌شد.

    بستن #5965

  • جلوگیری از صدور raising-bad-type هنگامی که در استنتاج نوع متغیری که raise می‌شود ابهام وجود دارد.

    بستن #2793

  • کمی انعطاف‌پذیرتر کردن الگوی پیش‌فرض نام TypeVar برای مجاز دانستن نام‌هایی با چندین نویسهٔ بزرگ؛ مانند HVACModeT یا IPAddressT.

    بستن #5981

  • رفع مثبت کاذب برای unused-argument هنگامی که یک نام nonlocal در تابعی تودرتو استفاده شده که بدون فراخوانی توسط والد خود، بازگردانده می‌شود.

    بستن #5187

  • رفع کرش برنامه برای modified_iterating-list/set/dict هنگامی که لیست/دیکشنری/مجموعهٔ در حال پیمایش، یک فراخوانی تابع باشد.

    بستن #5969

  • عدم صدور خطاهای broken-noreturn و broken-collections-callable درون بلوک‌های if TYPE_CHECKING.

    تاریخ انتشار: ۲۰۲۲-۰۳-۲۴

  • افزودن متدهای داندر (dunder) فراموش‌شده به بررسی unexpected-special-method-signature.
  • عدم صدور مجدد no-member در حلقه‌های for که به self ارجاع دارند، در صورتی که عملیات دودویی آغازکنندهٔ حلقه از یک self کپسوله‌شده در تاپل‌ها یا لیست‌ها استفاده کند.

    Refs pylint-dev/astroid#1360 Closes #4826

  • نمایش پیام خطای بهتر در صورت استفاده از قالب‌های پروندهٔ پشتیبانی‌نشده به همراه pyreverse.

    Closes #5950

  • اصلاح اعلان نوع (type hinting) در نمودارهای pyreverse برای classmethodها و staticmethodها.
  • اصلاح اعلان نوع در نمودارهای pyreverse برای متدهایی که None برمی‌گردانند.
  • اصلاح تطبیق گزینه‌های --notes که به یک نویسهٔ غیرکلمه‌ای ختم می‌شوند.

    Closes #5840

  • به‌روزرسانی موقعیت پیام‌ها برای تعاریف کلاس و تابع تا دیگر کل تعریف را در بر نگیرد. اکنون تنها def یا class به‌علاوهٔ نام کلاس/تابع پوشش داده می‌شوند.

    Closes #5466

شناسه پیام‌های (msgids) using-f-string-in-unsupported-version و using-final-decorator-in-unsupported-version
از W1601 و W1602 به W2601 و W2602 تغییر نام یافتند. غیرفعال‌سازی با استفاده از این msgidها از کار خواهد افتاد. این کار به منظور برقراری مجدد سازگاری با msgidهای از پیش موجود برای apply-builtin و basestring-builtin از بررسی‌کنندهٔ حذف‌شدهٔ python 3K+ انجام شده است. اکنون بررسی جدیدی وجود دارد تا از msgidها یا نمادهای بررسی‌کننده‌های حذف‌شده استفاده نشود.

Closes #5729

  • شماره‌گذاری خطوط برای پیام‌های مربوط به آرگومان‌های توابع اکنون دقیق‌تر شده است. این تغییر ممکن است مستلزم انتقال برخی غیرفعال‌سازی‌های پیام به موقعیت‌های جدید باشد.
  • افزودن گزینهٔ --recursive برای امکان‌پذیر ساختن پویش بازگشتی همهٔ ماژول‌ها و بسته‌ها در زیردرخت. اجرای pylint با گزینهٔ --recursive=y همهٔ فایل‌های .py کشف‌شده و بسته‌های یافت‌شده در زیردرخت دایرکتوری ارائه‌شده به عنوان پارامتر به pylint را بررسی خواهد کرد.

    Closes #352

  • افزودن پیام‌های modified-iterating-list، modified-iterating-dict و modified-iterating-set، که به ترتیب هنگام اضافه یا حذف شدن عناصر از یک لیست، دیکشنری یا مجموعه‌ای که در حال پیمایش است صادر می‌شوند.

    Closes #5348

  • رفع منفی کاذب (false-negative) برای بررسی‌کنندهٔ assignment-from-none هنگام استفاده از متد list.sort().

    Closes #5722

  • افزونهٔ جدید import-private-name: نشان دادن درون‌ریزی بسته‌ها و شیءهای خصوصی خارجی (دارای پیشوند _). این افزونه با استفاده از load-plugins=pylint.extensions.private_import قابل بارگیری است.

    Closes #5463

  • رفع فروپاشی ناشی از arguments-differ و arguments-renamed هنگامی که متدها خارج از سطح بالای یک کلاس تعریف شده بودند.

    Closes #5648

  • حذف افزونهٔ منسوخ‌شدهٔ check_docs. می‌توانید برای دسترسی به بررسی‌هایی که پیش‌تر در check_docs گنجانده شده بودند، از بررسی‌کنندهٔ docparams استفاده کنید.

    Closes #5322

  • افزودن نیازمندی اختیاری testutil به بسته‌بندی؛ از آنجا که gitpython نباید همواره یک وابستگی باشد اما همچنان برای استفاده از کد کمکی primer در pylint.testutil لازم است. می‌توانید آن را با pip install pylint[testutil] نصب کنید.

    Closes #5486

  • بازگردانی بررسی‌های مربوط به بررسی‌کنندهٔ python3 که هنوز برای پایتون ۳ مفید هستند (eq-without-hash). این مورد اکنون در افزونهٔ اختیاری pylint.extensions.eq_without_hash قرار دارد.

    Closes #5025

  • رفع مشکلی که در آن ungrouped-imports بدون ایجاد useless-suppression قابل غیرفعال‌سازی نبود.

    Refs #2366

  • افزودن چندین بررسی‌کننده برای مقابله با مسائل امنیتی یونی‌کد (برای جزئیات به Trojan Sources https://trojansource.codes و PEP 672 https://peps.python.org/pep-0672 مراجعه کنید) که خوانایی کد را نیز تحت تأثیر قرار می‌دهند. به‌طور خاص، بررسی‌های زیر اضافه شدند:
  • بررسی‌کنندهٔ bad-file-encoding بررسی می‌کند که پرونده طبق پیشنهاد PEP8 https://peps.python.org/pep-0008/#source-file-encoding با کدگذاری UTF-8 ذخیره شده باشد. کدگذاری‌های UTF-16 و UTF-32 در حال حاضر توسط پایتون https://bugs.python.org/issue1503789 پشتیبانی نمی‌شوند. در صورت تغییر این وضعیت، invalid-unicode-codec اطمینان حاصل می‌کند که برای حفظ سازگاری رو به عقب، از آن‌ها استفاده نشود.
  • بررسی‌کنندهٔ bidirectional-unicode نویسه‌های دوسویهٔ یونی‌کد را بررسی می‌کند که می‌توانند باعث شوند نحوهٔ اجرای کد با آنچه کاربر انتظار دارد متفاوت باشد.
  • بررسی‌های invalid-character-backspace، invalid-character-carriage-return، invalid-character-sub، invalid-character-esc، invalid-character-zero-width-space و invalid-character-nul برای بررسی نویسه‌های بدون گریز (unescaped) بالقوه آسیب‌رسان.

Closes #5281

  • استفاده از بستهٔ tomli به جای toml برای تجزیهٔ فایل‌های .toml.

    Closes #5885

  • رفع مثبت کاذب - مجاز دانستن باز کردن (unpacking) متغیر self در زیرکلاس‌هایی از typing.NamedTuple.

    Closes #5312

  • رفع منفی کاذب unpacking-non-sequence هنگامی که مقدار یک لیست خالی است.

    Closes #5707

  • پیام‌های هشدار بهتر برای else یا elif بی‌اثر هنگامی که یک تابع زودتر از موعد مقدار بازمی‌گرداند.

    Closes #5614

  • رفع مثبت کاذب consider-using-dict-comprehension هنگام ایجاد دیکشنری با فهرستی از تاپل‌ها که در آن هم کلید و هم مقدار بر اساس یک شرط یکسان تغییر می‌کنند.

    Closes #5588

  • رفع مثبت کاذب برای global-variable-undefined هنگامی که global همراه با نام یک کلاس استفاده می‌شود.

    Closes #3088

  • رفع مثبت کاذب برای unused-variable هنگامی که یک نام nonlocal به عنوان بخشی از یک انتساب چندنامی (multi-name assignment) مقداردهی می‌شود.

    Closes #3781

  • رفع فروپاشی در بررسی‌کنندهٔ unspecified-encoding هنگام ارسال None به آرگومان mode در فراخوانی تابع open().

    Closes #5731

  • رفع فروپاشی مرتبط با NewType که با یک f-string نام‌گذاری شده بود.

    Closes #5770 Ref pylint-dev/astroid#1400

  • بهبود پیام bad-open-mode هنگام ارسال None به آرگومان mode در فراخوانی تابع open().

    Closes #5733

  • افزودن بررسی‌کنندهٔ lru-cache-decorating-method برای بررسی استفاده از functools.lru_cache روی متدهای کلاس. این کار توصیه نمی‌شود چرا که با ممانعت دائمی از جمع‌آوری زبالهٔ نمونه (garbage collection)، باعث نشت حافظه می‌گردد.

    Closes #5670

  • رفع فروپاشی همراه با خطای بازگشت (recursion error) هنگام استنتاج صفت‌های کلاسی که به خود کلاس ارجاع داشتند.

    Closes #5408 Ref pylint-dev/astroid#1392

  • رفع مثبت کاذب برای unused-argument هنگامی که یک متد بازنویسی‌شده در زیرکلاس، کاری با مقدار یک آرگومان صرفاً کلیدواژه‌ای انجام نمی‌دهد.

    Closes #5771 Ref pylint-dev/astroid#1382

  • الگوی گزارش مشکل (issue template) فروپاشی اکنون برای خرابی‌هایی که پیش‌تر تحت پوشش این سازوکار نبودند ایجاد می‌شود..sp بستن #5668
بازنویسی بررسی‌کننده برای non-ascii-name.
اکنون اطمینان حاصل می‌کند که تمام نام‌های پایتون ASCII هستند و همچنین نام‌های واردات (non-ascii-module-import) و همچنین نام فایل‌ها (non-ascii-file-name) را به درستی بررسی کرده و هشدارهای جدید مربوط به آن‌ها را صادر می‌کند.

نویسه‌های غیر ASCII می‌توانند هوموگلیف (نویسه‌های هم‌شکل) باشند و وارد کردن آن‌ها با صفحه‌کلید غیرتخصصی دشوار باشد. بخش نویسه‌های گیج‌کننده (Confusable Characters) را در PEP 672 ببینید: https://peps.python.org/pep-0672/#confusable-characters-in-identifiers

  • هنگام اجرا در حالت موازی، pylint اکنون داده‌های منتقل‌شده به زیرفرایندها را با بسته‌ی dill سریال‌سازی (pickle) می‌کند. بنابراین بسته dill به عنوان یک وابستگی افزوده شده است.
  • مشکلی در astroid که در آن پیوندهای نمادین (symlinks) در نظر گرفته نمی‌شدند، برطرف شد

    بستن #1470 بستن #3499 بستن #4302 بستن #4798 بستن #5081

  • رفع فروپاشی (crash) در بررسی‌کننده unused-private-member هنگام تحلیل کدهایی که از type(self) در متدهای متصل (bound methods) استفاده می‌کنند.

    بستن #5569

  • بهینه‌سازی تجزیه خطوط طولانی زمانی که missing-final-newline فعال است.

    بستن #5724

  • رفع مثبت‌های کاذب برای used-before-assignment ناشی از استفاده از عبارت‌های نام‌گذاری‌شده در شرط عملگر سه‌تایی و استفاده از آن عبارت به عنوان آرگومان فراخوانی.

    بستن #5177, #5212

  • رفع مثبت کاذب برای undefined-variable هنگامی که مشخصه‌های کلاس namedtuple به عنوان حاشیه‌نویسی بازگشت استفاده می‌شوند.

    بستن #5568

  • رفع منفی کاذب برای undefined-variable و پیام‌های متغیر مرتبط، زمانی که همان متغیر تعریف‌نشده به عنوان حاشیه‌نویسی نوع استفاده شده و چندین بار به آن دسترسی پیدا می‌شود، یا به عنوان آرگومان پیش‌فرض یک تابع به کار می‌رود.

    بستن #5399

  • Pyreverse - افزودن خروجی در قالب mermaidjs
  • صدور used-before-assignment به جای undefined-variable هنگام تلاش برای دسترسی به حاشیه‌نویسی‌های نوع استفاده‌نشده.

    بستن #5713

  • افزودن سطح اطمینان CONTROL_FLOW برای هشدارهایی که به فرضیاتی درباره جریان کنترل (control flow) متکی هستند.
  • used-before-assignment اکنون این احتمال را در نظر می‌گیرد که ممکن است هنگام اجرای بلوک‌های except یا finally، انتساب‌ها در بلوک try رخ نداده باشند.

    بستن #85, #2615

  • رفع منفی کاذب برای used-before-assignment هنگامی که یک عبارت شرطی یا مدیر زمینه (context manager) پیش از دستور try مداخله می‌کرد و نشان می‌داد ممکن است با شکست مواجه شود.

    بستن #4045

  • رفع منفی کاذب برای used-before-assignment در بلوک‌های finally چنانچه یک کنترل‌کننده except انتسابی را که ممکن بود در بلوک try شکست خورده باشد، تعریف نکرده بود.
  • رفع پردازش بسیار طولانی خطوط بلند حاوی ویرگول (',').

    بستن #5483

  • رفع فروپاشی در مشخصه‌ها (properties) و متدهای کلاسی به ارث‌رسیده هنگام مقایسه برابری آن‌ها با یک دیکشنری خالی.

    بستن #5646

  • رفع یک مثبت کاذب برای assigning-non-slot هنگامی که کلاس دارای اسلات __setattr__ را تعریف کرده بود.

    بستن #3793

  • رفع یک مثبت کاذب برای invalid-class-object هنگامی که شیء در حال انتساب به مشخصه __class__ غیرقابل استنتاج باشد.
  • رفع مثبت کاذب برای used-before-assignment در حاشیه‌نویسی نوع خودارجاعی در دستورهای شرطی درون متدهای کلاس.

    بستن #5499

  • افزودن بررسی‌کننده redefined-slots-in-subclass: زمانی صادر می‌شود که یک slot در یک زیرکلاس بازتعریف شود.

    بستن #5617

  • رفع مثبت کاذب برای global-variable-not-assigned هنگام استفاده از دستور del

    بستن #5333

  • به طور پیش‌فرض، pylint دیگر فایل‌هایی را که با .# شروع می‌شوند در نظر نمی‌گیرد. این فایل‌ها به عنوان قفل‌های فایل Emacs در نظر گرفته می‌شوند. ببینید: https://www.gnu.org/software/emacs/manual/html_node/elisp/File-Locks.html. این رفتار را می‌توان با بازتعریف گزینه ignore-patterns تغییر داد.

    بستن #367

  • رفع یک مثبت کاذب برای used-before-assignment هنگامی که یک عبارت نام‌گذاری‌شده به عنوان اولین مقدار در یک ظرف (container) ظاهر می‌شود.

    بستن #5112

  • used-before-assignment اکنون فرض می‌کند که انتساب‌ها در بلوک‌های except ممکن است رخ نداده باشند و بر این اساس هشدار می‌دهد.

    بستن #4761

  • هنگام ارزیابی دستورهای بعد از یک بلوک except، used-before-assignment فرض می‌کند که در صورت وجود دستور return در بلوک try مربوطه، انتساب‌های درون بلوک‌های except انجام شده‌اند.

    بستن #5500

  • رفع یک منفی کاذب برای used-before-assignment زمانی که برخی از کنترل‌کننده‌های except (و نه همه آن‌ها) نامی را تعریف کرده بودند که بعد از یک بلوک except به آن اتکا شده بود در حالی که بلوک try مربوطه حاوی یک دستور return بود.

    بستن #5524

  • هنگام ارزیابی دستورها در بند else یک حلقه، used-before-assignment فرض می‌کند که اگر کنترل‌کننده‌های except تنها راه‌های اتمام حلقه بدون خروج زودهنگام (break) باشند، انتساب‌های درون بلوک‌های except انجام شده‌اند.

    بستن #5683

  • used-before-assignment اکنون نام‌ها را در بلوک‌های try بررسی می‌کند.
  • رفع مثبت کاذب در used-before-assignment برای عبارت‌های انتساب در دستورهای lambda.

    بستن #5360, #3877

  • رفع یک مثبت کاذب (مربوط به نسخه توسعه‌یافته منتشرنشده) برای used-before-assignment شامل نام‌های همسان میان comprehensionهای فیلترشده و انتساب‌ها در بلوک‌های except.

    بستن #5586

  • رفع فروپاشی در انتساب‌های slots و انتساب‌های حاشیه‌نویسی‌شده.

    بستن #5479

  • رفع فروپاشی در list comprehensionهایی که از type به عنوان نام متغیر درونی استفاده می‌کردند.

    بستن #5461

  • رفع فروپاشی در بررسی‌کننده use-maxsplit-arg هنگام ارائه آرگومان sep به str.split() از طریق کلیدواژه.

    بستن #5737

  • رفع مثبت کاذب برای unused-variable برای متغیر comprehension که با حاشیه‌نویسی نوع در حوزه بیرونی مطابقت داشت.

    بستن #5326

  • رفع منفی کاذب برای undefined-variable برای متغیری که چندین بار در یک comprehension استفاده شده و با یک حاشیه‌نویسی نوع استفاده‌نشده در حوزه بیرونی مطابقت دارد.

    بستن #5654

  • برخی از فایل‌ها در pylint.testutils منسوخ شده‌اند. در آینده وارد کردن‌ها (imports) باید مستقیماً از فضای نام pylint.testutils.functional انجام شوند..IP • 2 رفع مثبت‌های کاذب برای no-value-for-parameter هنگام استفاده از آرگومان‌های مکانی با تعداد متغیر.

    بسته شدن #5416

  • تابع safe_infer دیگر در صورت دریافت دو تعریف تابع با تعداد آرگومان‌های متفاوت، استنتاجی انجام نمی‌دهد.

    بسته شدن #3675

  • رفع مثبت کاذب comparison-with-callable برای فراخوان‌پذیرهایی که استثنا پرتاب می‌کنند، مانند ثابت‌های typing.

    بسته شدن #5557

  • رفع خرابی در گره‌های __init__ زمانی که ویژگی به دلیل محدودیت اندازه حافظه موقت (cache limit size) از قبل غیرقابل‌استنتاج بود. این محدودیت می‌تواند هنگامی رخ دهد که الگوی وراثت یک کلاس (و در نتیجه ویژگی __init__ آن) بسیار بزرگ باشد.

    بسته شدن #5679

  • رفع مثبت کاذب برای used-before-assignment ناشی از تعریف کلاسی تو‌در‌تو درون یک تابع که از کلاسی تعریف‌شده در خارج تابع ارث‌بری می‌کند.

    بسته شدن #4590

  • رفع مثبت کاذب unnecessary_dict_index_lookup هنگام حذف یک مدخل از دیکشنری.

    بسته شدن #4716

  • رفع مثبت کاذب برای used-before-assignment هنگامی که یک گردانندهٔ except نام مشترکی با یک شرط در یک comprehension فیلترشده دارد.

    بسته شدن #5817

  • رفع خرابی در بررسی‌کنندهٔ unnecessary-dict-index-lookup در صورتی که خروجی items() به یک تاپل تک‌عنصری (1-tuple) انتساب داده شود.

    بسته شدن #5504

  • هنگام فراخوانی pylint، epylint، symilar یا pyreverse با وارد کردن (import) آن‌ها در یک فایل پایتون، اکنون علاوه بر وصله‌کردن sys.argv، می‌توانید کلمه‌کلیدی argv را نیز ارسال کنید.

    بسته شدن #5320

  • کلاس PyLinter اکنون در صورت عدم ارائهٔ گزارشگر، با یک TextReporter به عنوان گزارشگر خود راه‌اندازی می‌شود.
  • رفع super-init-not-called زمانی که والد یا self یک Protocol باشد.

    بسته شدن #4790

  • رفع مثبت کاذب not-callable برای ویژگی‌هایی که نام مستعار NamedTuple هستند.

    رفع بخشی از #1730

  • ارسال redefined-outer-name زمانی که یک گردانندهٔ except تودرتو، گردانندهٔ بیرونی را می‌پوشاند.

    بسته شدن #4434 بسته شدن #5370

  • رفع مثبت کاذب super-init-not-called برای کلاس‌هایی که متد init خود را از یک والد به ارث می‌برند.

    بسته شدن #4941

  • اکنون می‌توان encoding را به عنوان یک آرگومان مکانی به فراخوانی‌های بازکنندهٔ فایل ارسال کرد بدون اینکه unspecified-encoding فعال شود.

    بسته شدن #5638

  • خطاهای مهلک (fatal) اکنون صرف‌نظر از اینکه پودمان بازبینی‌شده حاوی دستوری باشد یا خیر، امتیاز 0.0 صادر می‌کنند.

    بسته شدن #5451

  • متغیر fatal به متغیرهای مجاز در عبارت‌های ارزیابی امتیاز افزوده شد.
  • ارزیابی پیش‌فرض امتیاز اکنون از کف 0 استفاده می‌کند.

    بسته شدن #2399

  • رفع منفی کاذب برای consider-iterating-dictionary در حین بررسی‌های عضویتِ محصور در اشیای تکرارپذیر (iterables) یا بررسی‌های not in.

    بسته شدن #5323

  • رفع خرابی ناشی از دکوراتورهای غیرقابل‌استنتاج در Python 3.6 و 3.7.
  • افزودن بررسی‌کنندهٔ unnecessary-ellipsis: زمانی صادر می‌شود که ثابت سه‌نقطه (ellipsis) به‌طور غیرضروری استفاده شود.

    بسته شدن #5460

  • غیرفعال‌سازی بررسی‌کنندهٔ bad-docstring-quotes برای Python <= 3.7، زیرا در این نسخه‌ها شماره خطوط توابع و کلاس‌های دکوره‌شده قابل‌اعتماد نیست که این امر در عملکرد بررسی‌کننده اختلال ایجاد می‌کند.

    بسته شدن #3077

  • رفع طبقه‌بندی نادرست docstringهای سبک Numpy به عنوان docstringهای سبک Google برای docstringهای حاوی مستندات setter ویژگی (property). طبقه‌بندی docstring اکنون بر اساس بیشترین تعداد بخش‌های مطابقت‌یافته انجام می‌شود، نه بر اساس ترتیبی که سبک‌های docstring بررسی می‌شدند.
  • رفع تشخیص arguments-differ هنگامی که متدهای ایستای ابرکلاس فاقد دکوراتور @staticmethod بودند.

    بسته شدن #5371

  • TypingChecker
  • افزودن بررسی جدید broken-noreturn برای تشخیص استفاده‌های معیوب از typing.NoReturn در صورتی که py-version روی Python 3.7.1 یا پایین‌تر تنظیم شده باشد. https://bugs.python.org/issue34921
  • افزودن بررسی جدید broken-collections-callable برای تشخیص استفاده‌های معیوب از collections.abc.Callable در صورتی که py-version روی Python 3.9.1 یا پایین‌تر تنظیم شده باشد. https://bugs.python.org/issue42965
  • بخش testutils برای آزمون‌های واحد (unittests) اکنون end_lineno و end_column را می‌پذیرد. آزمون‌های فاقد این موارد موجب صدور DeprecationWarning خواهند شد.
  • arguments-differ دیگر از بازتعریف متدهایی با پارامترهای اضافی دارای مقادیر پیش‌فرض ایراد نمی‌گیرد.

    بسته شدن #1556، #5338

  • رفع مثبت کاذب unexpected-keyword-arg برای دکوراتورها.

    بسته شدن #258

  • وارد کردن پودمان منسوخ کتابخانه استاندارد xml.etree.cElementTree اکنون deprecated_module را صادر می‌کند.

    بسته شدن #5862

  • دستورهای غیرفعال‌سازی برای deprecated-module و هشدارهای مشابه مربوط به ویژگی‌های کتابخانه استاندارد که در نسخه‌های جدیدتر پایتون منسوخ شده‌اند، هنگام تحلیل با مفسرهای قدیمی‌تر پایتون که آن ویژگی‌ها در آن‌ها هنوز منسوخ نشده‌اند، دیگر باعث برانگیخته شدن useless-suppression نمی‌شوند.
  • وارد کردن پودمان منسوخ کتابخانه استاندارد distutils اکنون در Python 3.10+ هشدار deprecated_module را صادر می‌کند.
  • بررسی‌کنندهٔ missing-raises-doc اکنون سلسله‌مراتب کلاسیِ استثناهای پرتاب‌شده را بررسی می‌کند
def my_function():
  """My function.
  Raises:
    Exception: if something fails
  """
  raise ValueError

بسته شدن #4955

  • غیرفعال‌سازی بررسی املای نام قوانین mypy در دستورالعمل‌های ignore.

    بسته شدن #5929

  • امکان غیرفعال‌سازی duplicate-code با استفاده از یک توضیح (comment) غیرفعال‌سازی هنگام اجرا از طریق pylint.

    بسته شدن #214

  • بهبود بررسی invalid-name برای نام‌های TypeVar. الگوی پذیرفته‌شده را می‌توان با --typevar-rgx سفارشی‌سازی کرد.

    بسته شدن #3401

  • افزودن بررسی‌کنندهٔ جدید typevar-name-missing-variance. زمانی صادر می‌شود که یک TypeVar هم‌وردا (covariant) یا پادوردا (contravariant) به‌ترتیب با _co یا _contra خاتمه نیابد یا زمانی که یک TypeVar هیچ‌یک از این دو نباشد اما دارای پسوند باشد.
  • امکان استفاده از انتشار 0.7.x بسته mccabe.

    بسته شدن #5878.IP • 2 رفع مثبت کاذب unused-private-member هنگام دسترسی به متدهای خصوصی از طریق property.

    بسته شدن #4756

از آغاز کار pylint تا نسخهٔ 2.14.0 (شامل این نسخه)، ما گزارش تغییراتی داشتیم که شامل تمام تغییرات غیرجزئی Pylint می‌شد؛ از جمله تغییراتی که کاربر با آن‌ها مواجه نمی‌شد، یعنی تغییراتی که ممکن بود تنها در صورتی برای شما جالب باشد که توسعه‌دهنده‌ای باشید که روی pylint یا افزونه‌های pylint کار می‌کند یا یک تاریخ‌نگار پروژه‌های متن‌باز.

از pylint نسخهٔ 1.6.0 تا 2.14.0، علاوه بر گزارش تغییرات کامل، خلاصه‌ای از تغییرات (عمدتاً مرتبط با کاربر) نیز وجود داشت.

در نسخهٔ 2.12، ما گزینهٔ جدید py-version را معرفی کردیم که امکان تحلیل کد را برای نسخه‌ای از python فراهم می‌کند که ممکن است با مفسر فعلی python شما متفاوت باشد. این ویژگی بر همهٔ بررسی‌کننده‌ها اثر نمی‌گذارد اما به عنوان مثال اجازه می‌دهد بوی بد کد پایتون 3.5 (استفاده از f-stringها) را هنگام استفاده از pylint با پایتون 3.6 بررسی کنید. حداقل نسخه برای اجرای pylint اکنون 3.6.2 است، در حالی که آخرین نسخهٔ کارآمد برای پایتون 3.6.0 و 3.6.1، نسخهٔ pylint 2.9.3 بود.

علاوه بر رفع تعداد زیادی از مثبت‌های کاذب و باگ‌ها، بررسی‌های پیش‌فرض جدیدی را نیز اضافه کردیم، مانند use-implicit-booleaness-not-comparison، overridden-final-method و useless-with-lock. همچنین بررسی بهتری برای پیکربندی‌های TOML افزوده شده است.

در نهایت، علاوه بر اطلاعاتی که از قبل در مورد خط شروع و ستون شروع داشتیم، اطلاعات جدیدی دربارهٔ خط پایان و ستون پایان پیام‌ها معرفی کردیم. این کار امکان داشتن نشانه‌های بصری دقیق‌تری را در IDEهایی مانند افزونهٔ pylint برای vs-code فراهم می‌کند. حالت پیش‌فرض به منظور حفظ سازگاری دست‌نخورده باقی خواهد ماند، اما با افزودن end_line و end_column به گزینهٔ --msg-template قابل دریافت است. برای نتیجهٔ بهتر از python 3.8 به بالا استفاده کنید.

بررسی‌کننده برای Yoda conditions اکنون یک افزونه است؛ اگر به این بررسی اتکا داشته‌اید، ممکن است بخواهید آن را فعال کنید. همچنین یک بررسی‌کنندهٔ افزونه جدید به نام consider-using-any-or-all وجود دارد که حلقه‌های for قابل جایگزینی با any یا all را تشخیص می‌دهد؛ این ویژگی تماماً توسط @areveny مشارکت شده است، به تیم خوش آمدید!

•
بررسی‌کنندهٔ missing-any-param-doc اضافه شد که وقتی تابعی نه برای پارامترها و نه برای نوع پارامترها مستندسازی نداشته باشد فعال می‌شود. پارامترهای فاقد مستندات اکنون به درستی شناسایی می‌شوند. اگر missing-param-doc و missing-type-doc غیرفعال شده بودند، ممکن است هشداری به طور غیرمنتظره ظاهر شود، زیرا پیام جدید missing-any-param-doc به جای آن‌ها صادر خواهد شد.

بسته شدن #3799

  • افزودن overridden-final-method: هنگامی صادر می‌شود که متدی که با typing.final نشانه‌گذاری شده، رونویسی (override) شود
  • افزودن subclassed-final-class: هنگامی صادر می‌شود که از کلاسی که با typing.final نشانه‌گذاری شده، زیرکلاس ایجاد شود

    بسته شدن #3197

  • ایجاد کلاس بررسی‌کننده جدید UnsupportedVersionChecker که شامل بررسی‌هایی برای قابلیت‌های پشتیبانی‌نشده توسط تمام نسخه‌های مشخص‌شده با py-version است.
•
افزودن بررسی‌کنندهٔ using-f-string-in-unsupported-version. زمانی صادر می‌شود که py-version روی نسخه‌ای تنظیم شده باشد که از f-stringها پشتیبانی نمی‌کند (< 3.6)
  • افزودن بررسی‌کنندهٔ جدید use-implicit-booleaness-not-comparison: زمانی صادر می‌شود که از مقایسه لیترال مجموعه‌ها برای بررسی خالی بودن استفاده شود.

    بسته شدن #4774

  • افزودن بررسی‌کنندهٔ using-final-decorator-in-unsupported-version. زمانی صادر می‌شود که py-version روی نسخه‌ای تنظیم شده باشد که از typing.final پشتیبانی نمی‌کند (< 3.8)
  • افزودن بررسی‌کنندهٔ جدید useless-with-lock برای یافتن استفاده‌های نادرست از عبارت with و قفل‌های ماژول threading. زمانی صادر می‌شود که with threading.Lock(): به جای with lock_instance: استفاده شود.

    بسته شدن #5208

  • بررسی‌کنندهٔ جدید bad-configuration-section اضافه شد که برای گزینه‌های نابجا در فضای نام سطح بالایی pylint در پیکربندی toml هشدار صادر می‌کند. دیکشنری‌های سطح بالا یا گزینه‌های تعریف‌شده در بخش اشتباه همچنان بدون هیچ هشداری نادیده گرفته خواهند شد، که این موضوع در یک مورد پیگیری دنبال می‌شود.

    پیگیری در #5259

  • کلاس MessageTest از testutil مربوط به unittest اکنون مستلزم آن است که صفت confidence با مقدار مورد انتظار مطابقت داشته باشد. در صورت مشخص نشدن، روی UNDEFINED تنظیم می‌شود.
  • تابع add_message از testutil مربوط به unittest اکنون پارامتر col_offset را پردازش کرده و امکان بررسی آن را در برابر خروجی واقعی در یک آزمون فراهم می‌کند.
  • افزونه اختیاری consider-using-any-or-all افزوده شد: زمانی صادر می‌شود که یک حلقه for فقط مقدار بولی تولید کند و بتوان آن را با استفاده از یک مولد (generator) با any یا all جایگزین کرد. همچنین در صورت مختصر بودن، عبارت any/all مناسب را پیشنهاد می‌دهد.

    بسته شدن #5008

  • انتقال misplaced-comparison-constant به افزونه اختصاصی خود comparison_placement. این بازبین دارای سوگیری (opinionated) بود و اکنون دیگر یک پیش‌فرض نیست. می‌توان آن را با افزودن pylint.extensions.comparison_placement به load-plugins در پیکربندی خود دوباره فعال کرد.

    بسته شدن #1064

  • اصلاح پیام install graphiz که برای قالب خروجی puml مورد نیاز نیست.
  • pylint دیگر هنگام بررسی عبارت‌های انتساب درون دستورهای if دچار فروپاشی (crash) نمی‌شود.

    بسته شدن #5178

  • افزودن گزینه پیکربندی exclude-too-few-public-methods جهت اجازه به مستثنی کردن کلاس‌ها از بازبین min-public-methods.

    بسته شدن #3370

  • اصلاح accept-no-yields-doc و accept-no-return-doc که در زمان درست بودنِ بخشی از یک docstring، اجازه مفقود بودن مستندات yield یا return را نمی‌دادند.

    بسته شدن #5223

  • اصلاح simplify-boolean-expression هنگامی که شرط می‌تواند به عنوان False استنتاج شود.

    بسته شدن #5200

  • رفع استثنا هنگامی که pyreverse یک property function از یک کلاس را تجزیه می‌کند.
  • بهبود و هموارسازی پیام unused-wildcard-import

    بسته شدن #3859

  • در بازبین طول، نام len-as-condition جهت سازگاری با use-implicit-booleaness-not-comparison به use-implicit-booleaness-not-len تغییر یافت.
  • اصلاح protected-access برای دسترسی به صفت‌ها و متدهای کلاس‌های درونی

    بسته شدن #3066

  • به‌روزرسانی بازبین literal-comparison` جهت نادیده گرفتن مقادیر لفظی تاپل (tuple literals)

    بسته شدن #3031

  • بخش تابعی testutils اکنون end_lineno و end_column را می‌پذیرد. فایل‌های خروجی موردانتظار که فاقد این موارد باشند، یک DeprecationWarning را فعال می‌کنند. فایل‌های خروجی موردانتظار را می‌توان به آسانی با دستور python tests/test_functional.py --update-functional-output به‌روزرسانی کرد.
  • بخش تابعی testutils اکنون تمایز بین سطح اطمینان HIGH و UNDEFINED را به درستی بررسی می‌کند. فایل‌های خروجی موردانتظار بدون سطوح تعریف‌شده confidence اکنون یک DeprecationWarning صادر می‌کنند. فایل‌های خروجی موردانتظار را می‌توان به سادگی با دستور python tests/test_functional.py --update-functional-output به‌روزرسانی کرد.
  • اجراکننده آزمون تابعی اکنون از گزینه min_pyver_end_position برای کنترل اینکه صفت‌های end_lineno و end_column روی کدام نسخه‌های پایتون بررسی شوند، پشتیبانی می‌کند. مقدار پیش‌فرض 3.8 است.
  • undefined-variable اکنون متغیرهایی را که فقط یک حاشیه‌نویسی نوع (type annotation) دریافت کرده و هرگز مقداری به آن‌ها انتساب داده نمی‌شود، به درستی نشانه‌گذاری می‌کند.

    بسته شدن #5140

  • undefined-variable اکنون شماره‌گذاری خطوط و ترتیب کلاس‌های به‌کاررفته در اعلان‌های metaclass را به درستی در نظر می‌گیرد.

    بسته شدن #4031

  • used-before-assignment اکنون ارجاع به کلاس‌ها به عنوان حاشیه‌نویسی نوع یا مقادیر پیش‌فرض در متدهای سطح اول را به درستی لحاظ می‌کند.

    بسته شدن #3771

  • undefined-variable و unused-variable اکنون برای عبارت‌های انتساب در مقادیر پیش‌فرض توابع به درستی فعال می‌شوند.

    مرجع: #3688

  • self-cls-assignment اکنون انتساب‌های تاپل (tuple assignment) را نیز در نظر می‌گیرد.
  • undefined-variable اکنون برای عبارت‌های انتساب در دستورهای if ... else به درستی فعال می‌شود. این مورد شامل شکل پایه‌ای از استنتاج جریان کنترل برای دستورهای if ... else با استفاده از مقادیر بولی ثابت است.

    بسته شدن #3688

  • رفع فروپاشی در unused-private-member هنگام بررسی اعضای خصوصی روی __class__

    بسته شدن #5261

  • رفع صدور دوگانه not-callable روی properties قابل استنتاج

    بسته شدن #4426

  • پشتیبانی از پیکربندی الگوی کلاس‌های mixin از طریق mixin-class-rgx
  • نرمال‌سازی ورودی گزینه ignore-paths جهت پشتیبانی هم‌زمان از مسیرهای Posix و Windows

    بسته شدن #5194

  • missing-param-doc اکنون ستاره‌ها را برای پارامترهای با طول متغیر و پارامترهای کلیدواژه‌ای به درستی تجزیه می‌کند.

    بسته شدن #3733

  • missing-param-doc اکنون مستندات پارامتر به سبک Numpy بدون نوع‌بندی صریح را به درستی پردازش می‌کند.

    بسته شدن #5222

  • پارامتر --jobs اکنون در صورتی که سیستم‌عامل میزبان دارای پیاده‌سازی کارآمد سمافور مشترک نباشد، به مقدار 1 بازمی‌گردد.

    بسته شدن #5216

  • فروپاشی‌ها هنگام مواجهه با یک لیست در پیکربندی toml دیگر رخ نمی‌دهند.

    بسته شدن #4580

  • رفع فروپاشی برای protected-access در پیمایش کلاس (بیرونی)
  • رفع مثبت کاذب در useless-super-delegation هنگامی که آرگومان کلیدواژه‌ای پیش‌فرض یک متغیر است.
  • غیرحساس کردن اعتبارسنج yn به بزرگی و کوچکی حروف، جهت اجازه دادن به True و False در فایل‌های پیکربندی.
  • آخرین نسخه سازگار با پایتون '3.6.0' و '3.6.1'، نسخه '2.9.3' از pylint است. ما در آن زمان هنگام افزودن تایپینگ ناسازگار متوجه این موضوع نشدیم و تمام نسخه‌های پس از آن برای این مفسر خراب هستند. اطلاعات فراداده 2.12.0 امکان بارگیری pylint را روی آن مفسرها خواهد داد اما نصب با شکست مواجه می‌شود و اعلام می‌کند که به جای آن '2.9.3' را نصب کنید. نسخه 2.12.1 از pylint به python >= 3.6.2 نیاز خواهد داشت.

    بسته شدن #5171 پیگیری در #5065

  • افزوده شدن گزینه خط فرمان --enable-all-extensions. این گزینه تمامی افزونه‌های موجود را که با اجرای --list-extensions قابل فهرست شدن هستند، بارگیری می‌کند.
  • اکنون توصیه می‌شود که توسعه pylint روی Python نسخه 3.8 یا بالاتر انجام شود. این کار امکان استفاده از جدیدترین تجزیه‌کننده ast را فراهم می‌سازد.
  • تمامی کارهای استاندارد در CI مربوط به pylint اکنون به طور پیش‌فرض روی Python 3.8 اجرا می‌شوند. ما همچنان از پایتون 3.6 و 3.7 پشتیبانی می‌کنیم و آزمون‌ها را برای آن مفسرها اجرا می‌نماییم.
  • رفع فروپاشی در فراخوانی‌های open() هنگامی که آرگومان mode یک رشته ساده نباشد.

    رفع بخشی از #5321

  • افزودن امکان اضافه کردن end_line و end_column به گزینه --msg-template. با گزارشگر استاندارد TextReporter، این کار شماره خط و ستون انتهای یک گره را به خروجی Pylint اضافه می‌کند. اگر این شماره‌ها ناشناخته باشند، با یک رشته خالی نمایش داده می‌شوند.
  • معرفی آزمون‌های primer و یک چارچوب آزمون‌های پیکربندی. کلاس‌های کمکی موجود در pylint/testutil/ هنوز ناپایدار هستند و ممکن است در آینده نزدیک دستخوش تغییر شوند.

    بسته شدن #4412 #5287

  • افزودن کلیدهای endLine و endColumn به خروجی JSONReporter.

    بسته شدن #5380

  • رفع منفی کاذب برای consider-iterating-dictionary در طول بررسی‌های عضویتِ کپسوله‌شده در تکرارپذیرها یا بررسی‌های not in

    بسته شدن #5323

تاریخ انتشار: 2021-11-25

  • رفع مثبت کاذب برای unused-import در مواردی که همه‌چیز درون typing guards به‌درستی تحلیل نمی‌شد.
  • رفع پس‌رفتِ مثبت کاذب برای used-before-assignment در متغیرهای نوع‌دار در بدنهٔ متدهای کلاسی که به همان کلاس ارجاع دارند

    بسته شدن #5342

  • مشخص شد که گزینهٔ ignore-paths مقدار "" را به جای نویسهٔ گریز عبارت باقاعده، جداکنندهٔ مسیر دایرکتوری در ویندوز در نظر می‌گیرد.
  • رفع فروپاشی گزینهٔ ignore-paths هنگام فراخوانی این گزینه از طریق خط فرمان.

    بسته شدن #5437

  • رفع مدیریت docstringهای پارامترها به سبک Sphinx دارای ستاره. این موارد باید با افزودن یک "" در ابتدا، گریز داده شوند.

    بسته شدن #5406

  • افزودن کلیدهای endLine و endColumn به خروجی JSONReporter.

    بسته شدن #5380

  • رفع مدیریت مشخصات پارامتر به سبک Google در مواردی که توضیحات در خط پس از نام پارامتر قرار دارند. این موارد هشدارهای مثبت کاذب برای missing-param-doc ایجاد می‌کردند.

    بسته شدن #5452

  • رفع منفی کاذب برای consider-iterating-dictionary هنگام بررسی‌های عضویت قرارگرفته درون تکرارپذیرها یا بررسی‌های not in

    بسته شدن #5323

  • بررسی‌کنندهٔ unused-import اکنون همهٔ اجداد (ancestors) را برای typing guards بررسی می‌کند

    بسته شدن #5316

تاریخ انتشار: 2021-11-25

•
الزام پایتون 3.6.2 برای اجرای pylint.

بسته شدن #5065

تاریخ انتشار: 2021-11-24

  • ارتقای astroid به نسخهٔ 2.9.0

    بسته شدن #4982

  • افزودن قابلیت اضافه کردن end_line و end_column به گزینهٔ --msg-template. در TextReporter استاندارد، این کار شمارهٔ خط و ستون پایان یک گره را به خروجی Pylint اضافه می‌کند. در صورت نامشخص بودن این اعداد، با یک رشتهٔ خالی نمایش داده می‌شوند.
  • معرفی آزمون‌های primer و یک چارچوب آزمون‌های پیکربندی. کلاس‌های کمکی موجود در pylint/testutil/ هنوز ناپایدارند و ممکن است در آینده‌ای نزدیک تغییر کنند.

    بسته شدن #4412 #5287

  • رفع پیام install graphiz که برای قالب خروجی puml مورد نیاز نیست.
  • کلاس MessageTest از ماژول testutil برای unittest اکنون مستلزم آن است که مشخصهٔ confidence با مقدار مورد انتظار مطابقت داشته باشد. اگر مقداری مشخص نشده باشد، روی UNDEFINED تنظیم می‌شود.
  • تابع add_message از ماژول testutil برای unittest اکنون پارامتر col_offset را مدیریت کرده و امکان بررسی آن را در برابر خروجی واقعی در یک آزمون فراهم می‌کند.
  • رفع فروپاشی در افزونه‌های check_elif در جایی که یک if شناسایی‌نشده در یک comprehension با یک دستور if درون f-string منجر به خطای خارج از محدوده می‌شد. بررسی‌کننده دیگر به شمارش دستورهای if تکیه نمی‌کند و در عوض از مکان‌های شناخته‌شدهٔ دستورهای if استفاده می‌کند. دیگر نباید در دستورهای if با تجزیهٔ نادرست دچار فروپاشی شود.
  • رفع simplify-boolean-expression در مواردی که شرط می‌تواند به عنوان False استنتاج شود.

    بسته شدن #5200

  • رفع استثنا هنگام تجزیهٔ property function یک کلاس توسط pyreverse.
  • بخش آزمون‌های تابعیِ testutils اکنون end_lineno و end_column را می‌پذیرد. فایل‌های خروجی مورد انتظار بدون این مشخصه‌ها، یک DeprecationWarning ایجاد خواهند کرد. فایل‌های خروجی مورد انتظار را می‌توان به‌راحتی با دستور python tests/test_functional.py --update-functional-output به‌روزرسانی کرد.
  • بخش آزمون‌های تابعیِ testutils اکنون تمایز بین سطوح اطمینان HIGH و UNDEFINED را به‌درستی بررسی می‌کند. فایل‌های خروجی مورد انتظار بدون سطوح تعریف‌شدهٔ confidence اکنون یک DeprecationWarning ایجاد خواهند کرد. فایل‌های خروجی مورد انتظار را می‌توان به‌راحتی با دستور python tests/test_functional.py --update-functional-output به‌روزرسانی کرد.
  • اجراکنندهٔ آزمون‌های تابعی اکنون از گزینهٔ min_pyver_end_position برای کنترل اینکه مشخصه‌های end_lineno و end_column در کدام نسخه‌های پایتون باید بررسی شوند، پشتیبانی می‌کند. مقدار پیش‌فرض 3.8 است.
  • رفع مشکل accept-no-yields-doc و accept-no-return-doc که هنگام درست بودنِ بخشی از یک docstring، نبودِ مستندات yield یا return را مجاز نمی‌دانستند

    بسته شدن #5223

  • افزودن یک افزونهٔ اختیاری consider-using-any-or-all: زمانی صادر می‌شود که یک حلقهٔ for فقط مقدار بولی (boolean) تولید کرده و بتوان آن را با استفاده از یک مولد (generator) با any یا all جایگزین کرد. همچنین یک دستور مناسب any یا all را پیشنهاد می‌دهد.

    بسته شدن #5008

  • تشخیص صحیح پارامترهای بدون مستندات و افزودن پیام جدیدی با نام missing-any-param-doc

    بسته شدن #3799

  • افزودن بررسی‌کننده‌های overridden-final-method و subclassed-final-class

    بسته شدن #3197

  • رفع protected-access برای دسترسی به مشخصه‌ها و متدهای کلاس‌های درونی

    بسته شدن #3066

  • افزودن پشتیبانی از ModuleNotFoundError (import-error و no-name-in-module). کلاس ModuleNotFoundError از ImportError ارث‌بری می‌کند و در پایتون 3.6 اضافه شده است
  • بررسی‌کنندهٔ undefined-variable اکنون متغیرهایی را که فقط حاشیه‌نویسی نوع دریافت کرده‌اند و هرگز مقداری به آن‌ها انتساب داده نشده است، به‌درستی پرچم‌گذاری می‌کند

    بسته شدن #5140

  • بررسی‌کنندهٔ undefined-variable اکنون شماره‌گذاری خطوط و ترتیب کلاس‌های به‌کاررفته در اعلان‌های metaclass را به‌درستی در نظر می‌گیرد

    بسته شدن #4031

  • بررسی‌کنندهٔ used-before-assignment اکنون ارجاع به کلاس‌ها به عنوان حاشیه‌نویسی نوع یا مقادیر پیش‌فرض در متدهای سطح اول را به‌درستی در نظر می‌گیرد

    بسته شدن #3771

  • بررسی‌کننده‌های undefined-variable و unused-variable اکنون برای عبارت‌های انتساب در مقادیر پیش‌فرض توابع به‌درستی فعال می‌شوند

    ارجاع به #3688

  • بررسی‌کنندهٔ undefined-variable اکنون برای عبارت‌های انتساب در دستورهای if ... else به‌درستی فعال می‌شود این شامل شکل پایه‌ای از استنتاج جریان کنترل (control flow inference) برای دستورهای if ... else با مقادیر بولی ثابت است

    بسته شدن #3688

  • افزودن گزینهٔ خط فرمان --enable-all-extensions. این گزینه تمام افزونه‌های دردسترس را که می‌توان با اجرای --list-extensions فهرست کرد، بارگذاری می‌کند
  • رفع اشکال واردسازی بسته‌های namespace با واردسازی‌های نسبی (relative imports)

    بسته شدن #2967 و #5131

  • بهبود و یکپارچه‌سازی پیام unused-wildcard-import

    بسته شدن #3859

  • در بررسی‌کنندهٔ طول، len-as-condition جهت سازگاری با use-implicit-booleaness-not-comparison به use-implicit-booleaness-not-len تغییر نام یافت.
  • ایجاد کلاس بررسی‌کنندهٔ جدید UnsupportedVersionChecker که شامل بررسی قابلیت‌هایی است که توسط تمام نسخه‌های مشخص‌شده در py-version پشتیبانی نمی‌شوند.
  • افزودن بررسی‌کنندهٔ using-f-string-in-unsupported-version. زمانی صادر می‌شود که py-version روی نسخه‌ای تنظیم شده باشد که از f-string پشتیبانی نمی‌کند (< 3.6) رفع مثبت کاذب useless-super-delegation هنگامی که آرگومان کلیدواژه‌ای پیش‌فرض یک متغیر است.
  • صدور صحیح duplicate-key هنگامی که اعضای Enum کلیدهای تکراری دیکشنری هستند

    بسته شد: #5150

  • استفاده از تنظیم py-version برای بررسی نحو جایگزین union (PEP 604)، به‌جای نسخه مفسر Python.
  • زیرکلاس‌های dict توسط بررسی‌کننده bad-reversed-sequence به‌عنوان قابل‌معکوس‌سازی در نظر گرفته می‌شوند (از Python 3.8 به بعد).

    بسته شد: #4981

  • پشتیبانی از پیکربندی الگوی کلاس‌های mixin از طریق mixin-class-rgx
  • افزوده شدن بررسی‌کننده جدید use-implicit-booleaness-not-comparison: زمانی صادر می‌شود که از مقایسه لیترال مجموعه برای بررسی خالی بودن استفاده شده باشد.

    بسته شد: #4774

  • اکنون missing-param-doc ستاره‌ها را برای پارامترهای با طول متغیر و کلیدواژه‌ای به‌درستی تجزیه می‌کند

    بسته شد: #3733

  • اکنون missing-param-doc مستندسازی پارامترهای Numpy بدون نوع‌بندی صریح را به‌درستی مدیریت می‌کند

    بسته شد: #5222

  • دیگر pylint هنگام بررسی عبارت‌های انتساب در دستورهای if دچار فروپاشی نمی‌شود

    بسته شد: #5178

  • به‌روزرسانی بررسی‌کننده literal-comparison` برای نادیده‌گرفتن لیترال‌های تاپل

    بسته شد: #3031

  • نرمال‌سازی ورودی گزینه ignore-paths برای مجاز کردن هر دو نوع مسیرهای Posix و Windows

    بسته شد: #5194

  • رفع صدور تکراری not-callable برای properties قابل‌استنتاج

    بسته شد: #4426

  • اکنون self-cls-assignment انتساب تاپل را نیز در نظر می‌گیرد
  • رفع ناتوانی missing-function-docstring در بررسی __init__ و سایر متدهای جادویی حتی در صورت تنظیم بودن گزینه no-docstring-rgx برای انجام آن
  • افزوده شدن بررسی‌کننده using-final-decorator-in-unsupported-version. زمانی صادر می‌شود که py-version روی نسخه‌ای تنظیم شده باشد که از typing.final پشتیبانی نمی‌کند (< 3.8)
  • افزوده شدن گزینه پیکربندی exclude-too-few-public-methods برای امکان مستثنی‌کردن کلاس‌ها از بررسی‌کننده min-public-methods.

    بسته شد: #3370

  • در صورت عدم وجود پیاده‌سازی فعال سمافور اشتراکی در سیستم‌عامل میزبان، پارامتر --jobs اکنون به ۱ بازمی‌گردد.

    بسته شد: #5216

  • رفع فروپاشی در unused-private-member هنگام بررسی اعضای خصوصی روی __class__

    بسته شد: #5261

  • دیگر هنگام مواجهه با یک لیست در پیکربندی toml فروپاشی رخ نمی‌دهد.

    بسته شد: #4580

  • انتقال misplaced-comparison-constant به افزونه اختصاصی خود comparison_placement. این بررسی‌کننده سلیقه‌ای بود و اکنون دیگر پیش‌فرض نیست. می‌توان آن را با افزودن pylint.extensions.comparison_placement به load-plugins در پیکربندی خود مجدداً فعال کرد.

    بسته شد: #1064

  • بررسی‌کننده جدید bad-configuration-section افزوده شد که برای گزینه‌های نابجا در فضای‌نام سطح‌بالای pylint برای پیکربندی toml اخطار صادر می‌کند. دیکشنری‌های سطح‌بالا یا گزینه‌های تعریف‌شده در بخش‌های نادرست همچنان بدون اعلان نادیده گرفته می‌شوند، که این موضوع در یک مورد پیگیری دنبال می‌شود.

    پیگیری در #5259

  • رفع فروپاشی در protected-access هنگام پیمایش کلاس (بیرونی)
  • افزوده شدن بررسی‌کننده جدید useless-with-lock برای یافتن استفاده نادرست از دستور with و قفل‌های ماژول threading. زمانی صادر می‌شود که with threading.Lock(): به‌جای with lock_instance: استفاده شود.

    بسته شد: #5208

  • غیرحساس کردن اعتبارسنج yn به بزرگی و کوچکی حروف، جهت مجاز شمردن True و False در فایل‌های پیکربندی.
  • رفع فروپاشی در فراخوانی‌های open() هنگامی که آرگومان mode یک رشته ساده نباشد.

    رفع بخشی از #5321

  • وراثت از کلاسی که __class_getitem__ را پیاده‌سازی کرده است دیگر منجر به صدور inherit-non-class نمی‌شود.
  • در Pyreverse - افزودن دایرکتوری ریشه پروژه به sys.path

    بسته شد: #2479

  • عدم صدور consider-using-f-string در صورتی که py-version روی Python < 3.6 تنظیم شده باشد. f-strings در Python 3.6 اضافه شد

    بسته شد: #5019

  • رفع پس‌رفت در unspecified-encoding با pathlib.Path.read_text()

    بسته شد: #5029

  • عدم صدور consider-using-f-string در صورتی که متغیرهای درون‌یابی‌شونده شامل بک‌اسلش باشند
  • رفع مثبت کاذب در cell-var-from-loop هنگامی که متغیر به‌عنوان مقدار پیش‌فرض یک پارامتر فقط-کلیدواژه‌ای استفاده می‌شود.

    بسته شد: #5012

  • رفع مثبت کاذب undefined-variable با Lambda، IfExp و عبارت انتساب.
  • رفع مثبت کاذب useless-suppression برای wrong-import-order

    بسته شد: #2366

  • رفع مشکل وابستگی toml

    بسته شد: #5066

  • رفع مثبت کاذب useless-suppression برای line-too-long

    بسته شد: #4212

  • رفع عدم بررسی پارامترهای متدهای بازنویسی‌شده از object پایه در invalid-name

    بسته شد: #3614

  • رفع فروپاشی در consider-using-f-string در صورتی که format فراخوانی نشود

    بسته شد: #5058

  • رفع فروپاشی با AssignAttr در بلوک‌های if TYPE_CHECKING.

    بسته شد: #5111

  • بهبود اطلاعات گره برای invalid-name در آرگومان تابع.
  • جلوگیری از فراخوانی بررسی‌کننده‌های نوع بازگشتی روی توابعی که بدنه آن‌ها سه‌نقطه (ellipses) است

    بسته شد: #4736

  • افزودن توابع کمکی is_sys_guard و is_typing_guard از astroid به pylint.checkers.utils.
  • رفع پس‌رفت در استنتاج ClassDef

    بسته شد: #5030 بسته شد: #5036

  • رفع پس‌رفت در استنتاج گره Compare

    بسته شد: #5048

  • رفع مثبت کاذب isinstance-second-argument-not-valid-type با typing.Callable.

    بسته شد: #3507 بسته شد: #5087

  • اکنون توصیه می‌شود که توسعه pylint روی Python نسخه 3.8 یا بالاتر انجام شود. این کار امکان استفاده از جدیدترین تجزیه‌کننده ast را فراهم می‌سازد.
  • اکنون همه وظایف استاندارد در CI مربوط به pylint به‌طور پیش‌فرض روی Python 3.8 اجرا می‌شوند. ما همچنان از python نسخه 3.6 و 3.7 پشتیبانی می‌کنیم و آزمون‌ها را برای آن مفسرها اجرا می‌نماییم.
  • TypingChecker
رفع منفی کاذب برای deprecated-typing-alias و consider-using-alias همراه با typing.Type + typing.Callable.

از آغاز به کار pylint تا نسخه 2.14.0 (شامل آن)، یک گزارش تغییرات (changelog) داشتیم که دربردارندهٔ تمام تغییرات غیربدیهی Pylint بود، از جمله تغییراتی که برای کاربر ملموس نبودند؛ یعنی تغییراتی که تنها اگر توسعه‌دهندهٔ فعال روی pylint یا افزونه‌های pylint یا یک تاریخ‌نگار متن‌باز بودید برایتان جذابیت داشت.

از نسخه 1.6.0 تا 2.14.0 در pylint، افزون بر گزارش تغییرات کامل، خلاصه‌ای از تغییرات (عمدتاً کاربرمحور) نیز وجود داشت.

در نسخه 2.11، یک بررسی‌کننده (checker) پیش‌فرض جدید اضافه کردیم که استفاده از f-string را پیشنهاد می‌کند، زیرا در حال حاضر کارآمدترین روش برای قالب‌بندی رشته‌ها است. می‌توانید از pyupgrade https://github.com/asottile/pyupgrade، ruff https://docs.astral.sh/ruff یا flynt https://github.com/ikamensh/flynt برای مهاجرت خودکار ساختارهای قدیمی % و format() خود استفاده کنید.

ما افزونهٔ جدید SetMembershipChecker را اضافه کردیم که استفاده از set را برای آزمون عضویت پیشنهاد می‌کند، زیرا عملکرد بهتری نسبت به لیست‌ها یا تاپل‌ها دارد. همچنین بهبودهایی در CodeStyleChecker اعمال شد؛ اگر هنوز از آن استفاده نمی‌کنید حتماً نگاهی به آن بیندازید.

برخی باگ‌های دیرینه، مثبت‌های کاذب، یا منفی‌های کاذب را برطرف کردیم و گزینه‌های کوچک و کاربردی برای راحتی کار مانند min-similarity-lines اضافه کردیم که در صورت تنظیم روی 0، بررسی کدهای تکراری را غیرفعال می‌کند.

در پشت صحنه، کدهای هر دو پروژه pylint و astroid به‌طور فزاینده‌ای مجهز به تعیین نوع (type hint) شده‌اند، که اگر از آن‌ها به‌عنوان کتابخانه استفاده می‌کنید برایتان مفید خواهد بود. برای اینکه این نوع‌گذاری جدید منطقی‌تر و ساده‌تر بماند، برخی از توابع یا انواع را منسوخ (deprecate) کرده‌ایم که در نسخهٔ اصلی (major) بعدی حذف خواهند شد. این تلاشی پیوسته و ادامه‌دار است.

بررسی آیندهٔ possible-forgotten-f-prefix همچنان مثبت‌های کاذب بسیار زیادی داشت، و انتشار آن مجدداً به تعویق افتاد. اگر مایلید دانش فنی یا موردی برای استفاده ارائه دهید، موضوع possible-forgotten-f-prefix در https://github.com/pylint-dev/pylint/pull/4787 را بررسی کنید :)

•
افزوده شدن consider-using-f-string: زمانی صادر می‌شود که از .format() یا '%' برای قالب‌بندی یک رشته استفاده شود.

بسته شدن #3592

•
بررسی‌کننده حالت انتقال به python3 و گزینهٔ py3k آن حذف شدند. همچنان می‌توانید آن را در نسخه‌های قدیمی‌تر pylint پیدا کنید.

•
افزوده شدن افزونه جدید SetMembershipChecker همراه با بررسی use-set-for-membership: زمانی صادر می‌شود که از یک list یا tuple تعریف‌شده در جا برای آزمون عضویت استفاده شود. sets برای این کار بهینه‌تر هستند.

بسته شدن #4776

•
افزوده شدن consider-using-assignment-expr: زمانی صادر می‌شود که یک مقداردهی بلافاصله پس از یک عبارت if بیاید و هر دو بتوانند با استفاده از یک عبارت انتساب := ترکیب شوند. نیازمند Python 3.8 است.

بسته شدن #4862

  • افزوده شدن کلید پیکربندی py-version (در بخش [MAIN]). برای بررسی‌های وابسته به نسخه استفاده می‌شود. به صورت پیش‌فرض روی هر نسخهٔ پایتونی که pylint با آن اجرا می‌شود تنظیم خواهد شد.
  • پیام invalid-name اکنون هنگام استفاده از چندین عبارت باقاعده (regex) برای سبک نام‌گذاری، با جزئیات بیشتری نمایش داده می‌شود.
  • رفع مثبت کاذب برای consider-using-with اگر یک context manager در مسیرهای مختلف جریان کنترل (مانند عبارت if-else) به یک متغیر نسبت داده شود.

    بسته شدن #4751

  • رفع مثبت کاذب برای function-redefined در نشانه‌گذاری‌های ساده نوع (type annotations)

    بسته شدن #4936

  • رفع مثبت کاذب برای protected-access در صورتی که یک عضو محافظت‌شده در اعلان نوع (type hints) تعاریف توابع استفاده شده باشد
  • رفع مثبت کاذب dict-iter-missing-items برای دیکشنری‌هایی که تنها از چندتایی‌ها (tuples) به عنوان کلید استفاده می‌کنند

    بسته شدن #3282

  • بررسی‌کنندهٔ unspecified-encoding اکنون فراخوانی‌های pathlib.Path().read_text() و pathlib.Path().write_text() را نیز بررسی می‌کند

    بسته شدن #4945

  • رفع مثبت کاذب superfluous-parens برای تاپل‌های ایجادشده با تاپل‌های درونی

    بسته شدن #4907

  • رفع مثبت کاذب unused-private-member هنگام دسترسی به مشخصه‌ها در یک کلاس با استفاده از cls

    بسته شدن #4849

  • گسترش بررسی consider-using-in برای پشتیبانی از دسترسی به مشخصه‌ها (attribute access).
  • تنظیم min-similarity-lines روی 0 اکنون باعث می‌شود بررسی‌کنندهٔ تشابه از بررسی کدهای تکراری صرف‌نظر کند

    بسته شدن #4901

  • رفع باگی که در آن در صورت عدم وجود دایرکتوری والد حافظهٔ نهان (cache)، pylint خطایی اعلام می‌کرد

    بسته شدن #4900

  • بررسی‌کنندهٔ global-variable-not-assigned اکنون متغیرهای سراسری را که هرگز در یک حوزهٔ محلی دوباره مقداردهی نمی‌شوند شناسایی کرده و توابع (دوباره مقداردهی‌شده) را ثبت می‌کند

    بسته شدن #1375 بسته شدن #330

  • بررسی‌کنندهٔ consider-iterating-dictionary اکنون بررسی‌های عضویت را نیز مد نظر قرار می‌دهد

    بسته شدن #4069

تاریخ انتشار: 2021-09-16

•
بررسی‌کننده unspecified-encoding اکنون کدگذاریِ pathlib.Path() را به‌درستی بررسی می‌کند

بسته شدن #5017

تاریخ انتشار: 2021-09-16

  • بررسی‌کننده حالت مهاجرت به python3 و گزینه py3k آن حذف شدند. همچنان می‌توانید آن را در نسخه‌های قدیمی‌تر pylint پیدا کنید.
  • اکنون هنگام raise کردن یک رشته، raising-bad-type به‌درستی صادر می‌شود
  • افزونه جدید SetMembershipChecker همراه با بررسی use-set-for-membership اضافه شد: هنگام استفاده از یک list یا tuple تعریف‌شده به‌صورت درجا (in-place) برای آزمودن عضویت صادر می‌شود. ساختارهای sets برای این کار بهینه‌تر هستند.

    بسته شدن #4776

  • کلید پیکربندی py-version (در بخش [MASTER]) اضافه شد. برای بررسی‌های وابسته به نسخه استفاده می‌شود. به‌طور پیش‌فرض با هر نسخه Python که pylint با آن اجرا شود تنظیم خواهد شد.
  • CodeStyleChecker: بررسی consider-using-assignment-expr اضافه شد: هنگامی صادر می‌شود که یک انتساب بلافاصله با یک دستور if دنبال شود و هر دو بتوانند با استفاده از عبارت انتساب (assignment expression) := ترکیب شوند. نیازمند Python 3.8 است

    بسته شدن #4862

  • بررسی consider-using-f-string اضافه شد: هنگامی صادر می‌شود که از ()format. یا '%' برای قالب‌بندی رشته استفاده شود.

    بسته شدن #3592

  • رفع مثبت کاذب برای consider-using-with اگر یک مدیر زمینه (context manager) به یک متغیر در مسیرهای مختلف جریان کنترل (مانند عبارت if-else) نسبت داده شده باشد.

    بسته شدن #4751

  • پروتکل https اکنون در مستندات ترجیح داده شده است و http://pylint.pycqa.org به‌درستی به https://pylint.pycqa.org تغییر مسیر می‌دهد

    بسته شدن #3802

  • رفع مثبت کاذب برای function-redefined برای یادداشت‌های نوع (type annotations) ساده

    بسته شدن #4936

  • رفع مثبت کاذب برای protected-access در صورتی که یک عضو محافظت‌شده در اعلان‌های نوع (type hints) تعاریف توابع استفاده شده باشد
  • رفع مثبت کاذب dict-iter-missing-items برای دیکشنری‌هایی که تنها از تاپل‌ها به عنوان کلید استفاده می‌کنند

    بسته شدن #3282

  • بررسی‌کننده unspecified-encoding اکنون فراخوانی‌های pathlib.Path().read_text() و pathlib.Path().write_text() را نیز بررسی می‌کند

    بسته شدن #4945

  • رفع مثبت کاذب superfluous-parens برای تاپل‌های ایجادشده با تاپل‌های درونی

    بسته شدن #4907

  • رفع مثبت کاذب unused-private-member برای دسترسی به ویژگی‌ها در یک کلاس با استفاده از cls

    بسته شدن #4849

  • رفع مثبت کاذب unused-private-member برای staticmethodهای خصوصی که در classmethodها مورد دسترسی قرار گرفته‌اند.

    بسته شدن #4849

  • گسترش بررسی consider-using-in برای کارکرد در دسترسی به ویژگی‌ها.
  • تنظیم min-similarity-lines روی 0 اکنون باعث می‌شود بررسی‌کننده شباهت، بررسی کد تکراری را متوقف کند

    بسته شدن #4901

  • رفع باگی که در آن pylint در صورت عدم وجود دایرکتوری والد حافظه موقت (cache) خطا می‌داد

    بسته شدن #4900

  • بررسی‌کننده global-variable-not-assigned اکنون متغیرهای سراسری را که هرگز در یک حوزه محلی (local scope) مجدداً مقداردهی نشده‌اند و همچنین توابع (مقداردهی مجدد شده) را شناسایی می‌کند

    بسته شدن #1375 بسته شدن #330

  • رفع مثبت‌های کاذب برای invalid-all-format / E0605 <#invalid-all-format> که در زمان اجرا list یا tuple هستند

    بسته شدن #4711

  • رفع مشکل no-self-use و docparams extension برای توابع و متدهای async.
  • افزودن مستندات برای pyreverse و symilar

    بسته شدن #4616

  • پیام‌های غیرنمادین با حروف بزرگ و کوچک نادرست اکنون به‌درستی use-symbolic-message-instead را فعال می‌کنند

    بسته شدن #5000

  • بررسی‌کننده consider-iterating-dictionary اکنون بررسی‌های عضویت را نیز مد نظر قرار می‌دهد

    بسته شدن #4069

  • پیام invalid-name هنگام استفاده از چندین regex برای شیوه نام‌گذاری اکنون دارای جزئیات بیشتری است.

    از آغاز pylint تا نگارش 2.14.0 (شامل آن)، ما یک گزارش تغییرات داشتیم که شامل تمام تغییرات غیربدیهی Pylint بود؛ از جمله تغییراتی که برای کاربران نهایی نبودند، یعنی تغییراتی که تنها در صورتی ممکن است برایتان جذاب باشند که توسعه‌دهنده‌ای باشید که روی pylint یا افزایه‌های pylint کار می‌کند یا یک تاریخ‌نگار منبع‌باز باشید.

    از نگارش 1.6.0 تا 2.14.0 پایتون‌لینت (pylint)، علاوه بر گزارش کامل تغییرات، خلاصه‌ای از تغییرات (عمدتاً تغییرات مربوط به کاربران) نیز ارائه می‌شد.

در نسخه 2.10، چندین بررسی پیش‌فرض جدید مانند unspecified-encoding، forgotten-debug-statement یا use-dict-literal اضافه کرده‌ایم. همچنین چند بررسی اختیاری و سلیقه‌ای نیز وجود دارد. اکنون می‌توانید استفاده از حلقه while را ممنوع کنید یا عشق انحصاری خود به عبارات سه‌تایی (ternary expressions) را علناً ابراز نمایید. قول می‌دهیم اگر این موارد را به پیکربندی خود اضافه کنید، ساعت‌ها بحث و گفتگوی سرگرم‌کننده با کل اعضای تیمتان خواهید داشت.

ما همچنین برخی از باگ‌های دیرینه، موارد مثبت کاذب، یا گزینه‌های جاافتاده مانند ignore-signature را برطرف کرده‌ایم که اکنون روی امضای توابع درونی نیز اعمال می‌شود.

گزینه جدیدی برای غیرفعال کردن خط بعدی به نام disable-next اضافه شده است. همچنین امکان صادر کردن نمودارهای رنگی و نمودار plantuml با استفاده از pyreverse فراهم شده است. متغیر PYLINT_HOME در صورت تنظیم نشدن، اکنون به XDG_CACHE_HOME اشاره می‌کند.

کارایی بررسی‌کننده شباهت بهبود یافته و چندین اصلاح جزئی نیز برای بهبود عملکرد انجام شده است.

ما در طول نگارش 2.11 به کار روی بهبود کارایی ادامه خواهیم داد. همچنین بررسی جدید possible-forgotten-f-prefix را که در زمان انتشار مثبت‌های کاذب بسیار زیادی داشت نهایی خواهیم کرد. اگر می‌خواهید اطلاعات یا مورد کاربردی ارائه دهید، مسئله مربوط به possible-forgotten-f-prefix را در https://github.com/pylint-dev/pylint/pull/4787 بررسی کنید :)

  • افزوده شدن unspecified-encoding: زمانی صادر می‌شود که ()open بدون مشخص کردن یک کدگذاری (encoding) فراخوانی شود

    بسته شدن #3826

  • افزوده شدن use-list-literal: زمانی صادر می‌شود که list() بدون هیچ آرگومانی به جای استفاده از [] فراخوانی شود

    بسته شدن #4365

  • افزوده شدن use-dict-literal: زمانی صادر می‌شود که dict() بدون هیچ آرگومانی به جای استفاده از {} فراخوانی شود

    بسته شدن #4365

  • افزوده شدن forgotten-debug-statement: زمانی صادر می‌شود که فراخوانی‌های breakpoint، pdb.set_trace یا sys.breakpointhook یافت شوند

    بسته شدن #3692

  • افزوده شدن use-sequence-for-iteration: زمانی صادر می‌شود که پیمایش روی یک set تعریف‌شده به صورت درجا (in-place) انجام گیرد.
  • افزوده شدن بررسی‌کننده format-string-without-interpolation: زمانی صادر می‌شود که قالب‌بندی روی یک رشته بدون وجود متغیری برای جایگزینی اعمال شود

    بسته شدن #4042

  • افزوده شدن بررسی‌کننده redundant-u-string-prefix: زمانی صادر می‌شود که پیشوند u به یک رشته اضافه شده باشد

    بسته شدن #4102

•
CodeStyleChecker
  • محدود کردن صدور consider-using-tuple تنها برای lists تعریف‌شده به صورت درجا (in-place).
  • صدور consider-using-tuple حتی اگر لیست شامل یک عبارت ستاره‌دار (starred) باشد.
  • افزوده شدن افزونه اختیاری consider-ternary-expression: هرگاه در هر دو شاخه یک بلوک if/else به یک متغیر مقداردهی شود، صادر می‌شود.

    بسته شدن # 4366

  • افزوده شدن افزونه اختیاری while-used: هرگاه یک حلقه while استفاده شود صادر می‌شود.

    بسته شدن # 4367

  • ابزار pyreverse اکنون با استفاده از گزینه colorized اجازه تولید نمودارهای رنگی تولیدشده را می‌دهد.
  • ابزار Pyreverse - افزودن خروجی در قالب PlantUML
  • در صورتی که یک مدیر زمینه (context manager) از یک تابع بازگردانده شود، دیگر consider-using-with فعال نمی‌شود.
  • هنگامی که فایلی مشکل‌دار باشد، pylint دیگر با یک ردگیری خطا (traceback) دچار فروپاشی (crash) نمی‌شود. در عوض، یک فایل متنی الگو برای باز کردن یک مسئله در سامانه ردیابی باگ ایجاد می‌کند. بدین ترتیب به جای ناممکن شدن فرآیند، بررسی کد (linting) می‌تواند برای سایر فایل‌های بدون مشکل ادامه یابد.
  • ابزار Pyreverse - نمایش روابط ساختاری "has-a" کلاس‌ها که از type-hints استنتاج شده‌اند
  • کارایی بررسی‌کننده Similarity بهبود یافته است.
  • افزوده شدن time.clock به توابع/متدهای منسوخ‌شده برای python 3.3
  • افزوده شدن گزینه ignored-parents به بررسی‌کننده طراحی جهت نادیده گرفتن کلاس‌های مشخص از بررسی too-many-ancestors (کد R0901).
  • در صورت محافظت شدن در پس یک دستور if، خطای no-member صادر نشود.

    ارجاع به #1162 بسته شدن #1990 بسته شدن #4168

  • رفع موارد مثبت کاذب برای superfluous-parens با عملگر والروس (walrus)، عملگر سه‌تایی و درون درک لیست (list comprehension).

    بسته شدن #2818 بسته شدن #3249 بسته شدن #3608 بسته شدن #4346

  • بازسازی ساختار --list-msgs و --list-msgs-enabled: هر دو گزینه اکنون نشان می‌دهند که آیا پیام‌ها با مفسر فعلی قابل انتشار هستند یا خیر.

    بسته شدن #4778

  • رفع منفی کاذب برای used-before-assignment در زمانی که متغیر درون یک مدیریت‌کننده استثنا (exception handler) مقداردهی شده، اما خارج از آن مدیریت‌کننده استفاده شده است.

    بسته شدن #626

  • افزوده شدن گزینه disable-next: اجازه استفاده از # pylint: disable-next=msgid را جهت غیرفعال کردن یک پیام برای خط بعدی می‌دهد

    بسته شدن #1682

  • اصلاح بررسی‌کننده cell-var-from-loop: مدیریت متغیرهای cell در ساخت‌های comprehensions درون توابع، و عبارات آرگومان‌های پیش‌فرض توابع. همچنین مدیریت سایه‌اندازی پایه‌ای متغیرها (variable shadowing).

    بسته شدن #2846 بسته شدن #3107

  • رفع باگ در بررسی‌کننده cell-var-from-loop: در صورتی که هر دو گزینه unused-variable و used-before-assignment غیرفعال باشند، دیگر موارد منفی کاذب رخ نمی‌دهد.
  • با فعال بودن گزینه "ignore-signatures" در similarities، امضای متدهای کلاس نیز همانند امضای توابع نادیده گرفته می‌شوند

    بسته شدن #4653

تاریخ انتشار: 2021-08-21

  • اکنون از platformdirs به‌جای appdirs استفاده می‌شود زیرا بسته اخیر دیگر نگهداری نمی‌شود.

    بسته شد #4886

  • رفع فروپاشی در بررسی‌کننده‌ای که هنگام شکست در استنتاج روی copy.copy خطای shallow-copy-environ را ایجاد می‌کرد

    بسته شد #4891

تاریخ انتشار: 2021-08-20

•
ابزار pylint هنگامی که PYLINT_HOME وجود ندارد، دچار فروپاشی نمی‌شود.

بسته شد #4883

تاریخ انتشار: 2021-08-20

  • ‏pyreverse: افزودن گزینه‌ای برای تولید خروجی رنگی.

    بسته شد #4488

  • ‏pyreverse: افزودن خروجی در قالب PlantUML.

    بسته شد #4498

  • در صورتی که یک مدیر بافت (context manager) از تابعی بازگردانده شود، consider-using-with دیگر فعال نمی‌شود.

    بسته شد #4748

  • ابزار pylint هنگام مواجهه با یک فایل مشکل‌دار، دیگر با traceback دچار فروپاشی نمی‌شود. در عوض، یک فایل متنی الگو برای ثبت گزارش خطا در سامانه پیگیری اشکالات ایجاد می‌کند. به این ترتیب تحلیل و بررسی کد (linting) می‌تواند به‌جای متوقف شدن، برای سایر فایل‌های بدون مشکل ادامه یابد.
  • ‏pyreverse: نمایش روابط «شامل بودن» (has-a) کلاس‌ها که از type-hint استنتاج شده‌اند

    بسته شد #4744

  • رفع فروپاشی هنگام وارد کردن (import) فراتر از بسته سطح بالا در زمان ساخت پیام import-error

    بسته شد #4775

  • افزودن گزینه ignored-parents به بررسی‌کننده طراحی جهت نادیده گرفتن کلاس‌های مشخص از بررسی too-many-ancestors (کد R0901).

    رفع بخشی از #3057

  • افزودن unspecified-encoding: زمانی صادر می‌شود که open() بدون مشخص کردن کدگذاری (encoding) فراخوانی شود

    بسته شد #3826

  • بهبود کارایی بررسی‌کننده شباهت (Similarity checker). رفع مشکل استفاده هم‌زمان از --min-similarity-lines با --jobs.

    بسته شد #4120 بسته شد #4118

  • عدم صدور خطای no-member در صورتی که توسط عبارت if محافظت شده باشد.

    ارجاع به #1162 بسته شد #1990 بسته شد #4168

  • مقدار پیش‌فرض برای PYLINTHOME اکنون استاندارد XDG_CACHE_HOME است و pylint اکنون از appdirs استفاده می‌کند.

    بسته شد #3878

  • افزودن use-list-literal: زمانی صادر می‌شود که list() بدون هیچ آرگومانی به‌جای استفاده از [] فراخوانی شود

    بسته شد #4365

  • افزودن use-dict-literal: زمانی صادر می‌شود که dict() بدون هیچ آرگومانی به‌جای استفاده از {} فراخوانی شود

    بسته شد #4365

  • افزودن افزونه اختیاری consider-ternary-expression: زمانی صادر می‌شود که یک متغیر در هر دو شاخه یک بلوک if/else مقداردهی شود.

    بسته شد #4366

  • افزودن افزونه اختیاری while-used: هر زمان که یک حلقه while استفاده شود، صادر می‌شود.

    بسته شد #4367

  • افزودن forgotten-debug-statement: زمانی صادر می‌شود که فراخوانی‌های breakpoint، pdb.set_trace یا sys.breakpointhook یافت شوند

    بسته شد #3692

  • رفع مثبت کاذب در unused-private-member هنگام استفاده از توابع تودرتو درون یک کلاس

    بسته شد #4673

  • رفع فروپاشی در unused-private-member که با مشخصه‌های تودرتو رخ می‌داد.

    بسته شد #4755

  • رفع مثبت کاذب در unused-private-member برای نام‌های کلاس

    بسته شد #4681

  • رفع مثبت‌های کاذب در superfluous-parens با عملگر walrus، عملگر سه‌تایی و درون تعاریف فشرده لیست (list comprehension).

    بسته شد #2818 بسته شد #3249 بسته شد #3608 بسته شد #4346

  • افزودن بررسی‌کننده format-string-without-interpolation: زمانی صادر می‌شود که قالب‌بندی روی یک رشته بدون وجود هیچ متغیری برای جایگزینی اعمال شود

    بسته شد #4042

  • بازآرایی گزینه‌های --list-msgs و --list-msgs-enabled: اکنون هر دو گزینه نشان می‌دهند که آیا پیام‌ها با مفسر فعلی قابل صدور هستند یا خیر.

    بسته شد #4778

  • رفع منفی کاذب در used-before-assignment هنگامی که متغیر درون یک مدیر استثنا (exception handler) مقداردهی شده، اما بیرون از آن استفاده شده است.

    بسته شد #626

  • افزودن گزینه disable-next: امکان استفاده از # pylint: disable-next=msgid را برای غیرفعال کردن یک پیام در خط بعدی فراهم می‌کند

    بسته شد #1682

  • افزودن بررسی‌کننده redundant-u-string-prefix: زمانی صادر می‌شود که پیشوند u به یک رشته اضافه شده باشد

    بسته شد #4102

  • اصلاح بررسی‌کننده cell-var-from-loop: مدیریت متغیرهای سلولی در تعاریف فشرده (comprehensions) درون توابع و عبارات آرگومان‌های پیش‌فرض توابع. همچنین مدیریت سایه‌اندازی پایه‌ای متغیرها (variable shadowing).

    بسته شد #2846 بسته شد #3107

  • رفع اشکال در بررسی‌کننده cell-var-from-loop: در حالتی که هر دو گزینه unused-variable و used-before-assignment غیرفعال باشند، دیگر موارد منفی کاذب رخ نمی‌دهد.
  • رفع مثبت کاذب در invalid-all-format در صورت استفاده از توابع توکار list یا tuple

    بسته شد #4711

  • فایل‌های پیکربندی اکنون می‌توانند حاوی متغیرهای محیطی باشند

    بسته شد #3839

  • رفع مثبت کاذب در used-before-assignment همراه با یک عبارت انتساب در یک گره Return

    بسته شد #4828

  • افزودن use-sequence-for-iteration: زمانی صادر می‌شود که روی یک set تعریف‌شده به صورت برخط (in-place) پیمایش انجام شود.
  • CodeStyleChecker
  • محدود کردن صدور consider-using-tuple تنها برای lists تعریف‌شده به صورت برخط (in-place).
  • صدور consider-using-tuple حتی در صورتی که لیست حاوی یک عبارت ستاره‌دار (starred) باشد.
  • نادیده گرفتن خطوط دکوراتورها توسط بررسی‌کننده شباهت‌ها زمانی که پرچم ignore signatures فعال است

    بسته شد #4839

  • مجاز بودن مقادیر true و false در pylintrc برای سازگاری بهتر با پیکربندی toml.
  • با فعال بودن گزینه شباهت‌های "ignore-signatures"، امضای متدهای کلاس به همان شیوه توابع نادیده گرفته می‌شوند

    بسته شد #4653

  • بهبود کارایی هنگام استنتاج گره‌های Call با بهره‌گیری از حافظه پنهان (caching)..IP • 2 بهبود پیام خطا برای invalid-metaclass / E1139 <#invalid-metaclass> هنگامی که گره (node) یک Instance است.

از آغاز کار pylint تا نسخهٔ 2.14.0 (شامل آن)، گزارش تغییراتی (changelog) داشتیم که شامل تمام تغییرات غیرجزئی Pylint می‌شد؛ از جمله تغییراتی که برای کاربران نهایی ملموس نبودند، یعنی تغییراتی که شاید تنها اگر توسعه‌دهندهٔ pylint یا افزونه‌های آن بودید، یا یک تاریخ‌نگار منبع‌باز، برایتان جذابیت داشتند.

از pylint 1.6.0 تا 2.14.0، علاوه بر گزارش تغییرات کامل، خلاصه‌ای از تغییرات (عمدتاً کاربرمحور) نیز ارائه می‌شد.

اکنون Pylint با python 3.10 سازگار است.

بررسی‌های جدید زیادی اضافه شده‌اند؛ برخی هشدارهای کارایی غیرسلیقه‌ای مانند use-maxsplit-arg، برخی هشدارهای شیوه‌نامهٔ نگارشِ مورد توافق همگانی مانند unnecessary-dict-index-lookup یا بررسی‌های جدید برای موارد منسوخ‌شده (deprecation).

هدف ما کاهش هشدارهای اضافی (noise) pylint برای کاربرانی است که برای نخستین‌بار از آن استفاده می‌کنند و اختیاری کردن برخی از بررسی‌های جدید گامی در همین راستا است. بدین منظور، یک بررسی‌کنندهٔ اختیاریِ شیوه‌نامهٔ کد ایجاد کرده‌ایم که می‌توان آن را با استفاده از pylint.extensions.code_style از طریق گزینهٔ load-plugins بارگذاری کرد. بیش از هر زمان دیگر، اگر به عنوان یک کاربر باتجربه خواهان دریافت بیشترین تعداد بررسی‌های ممکن هستید، باید فهرست افزونه‌های pylint را بررسی کنید: https://pylint.readthedocs.io/en/latest/user_guide/checkers/extensions.html#optional-checkers.

  • deprecated-decorator: هنگامی صادر می‌شود که از یک دکوراتور منسوخ‌شده استفاده شود.
  • consider-using-dict-items: هنگامی صادر می‌شود که روی کلیدهای دیکشنری پیمایش صورت گیرد و سپس در بدنهٔ حلقه با همان کلید به دیکشنری نمایه (index) زده شود.
  • use-maxsplit-arg: هنگامی صادر می‌شود که تنها به اولین یا آخرین عنصر از str.split() دسترسی پیدا شود.
  • گزینهٔ ignore_signatures به بررسی‌کنندهٔ شباهت اضافه شده است. این گزینه امکان می‌دهد موارد مثبت کاذب در زمانی که چندین تابع پارامترهای یکسانی دارند کاهش یابد.
  • unnecessary-dict-index-lookup: هنگامی صادر می‌شود که روی آیتم‌های دیکشنری (جفت‌های کلید-مقدار) پیمایش صورت گیرد و دسترسی به مقدار از طریق جستجوی نمایه انجام شود.
  • consider-using-from-import: هنگامی صادر می‌شود که یک زیرپیمانه/عضو از یک بسته وارد (import) شده و با همان نام نام‌گذاری مستعار (alias) شود.
  • بررسی‌کنندهٔ جدید unused-private-member: هنگامی صادر می‌شود که یک عضو خصوصی (یعنی عضوی که با __ آغاز می‌شود) در یک کلاس تعریف شده اما استفاده نشود.
  • بررسی‌کنندهٔ جدید invalid-class-object: هنگامی صادر می‌شود که مقداری غیر از کلاس به مشخصهٔ __class__ نسبت داده شود.
  • invalid-all-format: هنگامی صادر می‌شود که __all__ قالبی نامعتبر داشته باشد، یعنی یک tuple یا list نباشد.
  • بررسی‌کنندهٔ جدید await-outside-async: هنگامی صادر می‌شود که await در خارج از یک تابع async استفاده شود.
  • افزودن افزونهٔ جدید CodeStyleChecker. این افزونه شامل بررسی‌کننده‌هایی است که می‌توانند یکدستی کد را بهبود بخشند. از این رو لزوماً مزیتی در کارایی ارائه نمی‌دهند و در بسیاری از موارد سلیقه‌ای (opinionated) هستند.
  • consider-using-tuple: هنگامی صادر می‌شود که یک لیست یا مجموعهٔ تعریف‌شده به‌صورت درجا بتواند با یک چندتایی (tuple) جایگزین شود.
  • consider-using-namedtuple-or-dataclass: هنگامی صادر می‌شود که مقادیر دیکشنری بتوانند با نمونه‌هایی از namedtuple یا dataclass جایگزین شوند.

  • رفع مثبت کاذب consider-using-with (R1732) در صورتی که یک شرط سه‌گانه همراه با with استفاده شده باشد.
  • رفع مثبت کاذب consider-using-with (R1732) در صورتی که contextlib.ExitStack وظیفهٔ فراخوانی متد __exit__ را بر عهده داشته باشد.
  • افزودن یادداشت‌های نوع به فایل‌های dot در pyreverse.
  • برچسب‌های Pylint اکنون به قالب استاندارد vX.Y.Z هستند و دیگر به صورت pylint-X.Y.Z نخواهند بود.
  • رفع مثبت کاذب too-many-ancestors هنگام ارث‌بری از کلاس‌های توکار، به‌ویژه از پیمانهٔ collections.abc.
  • پیام‌های خروجی برای خطای arguments-differ بر اساس حالت‌های مختلف خطا سفارشی‌سازی شده‌اند.
  • گزینهٔ جدید --fail-on=<msg ids>; برای بازگرداندن کدهای خروج غیرصفر صرف‌نظر از مقدار fail-under.
  • خطای جدیدی به نام arguments-renamed ایجاد شده است که هرگونه تغییر در نام پارامترهای توابع بازنویسی‌شده (overridden) را شناسایی می‌کند. این خطا با هدف جداسازی کارایی arguments-differ پیاده‌سازی شده است.
  • رفع ناسازگاری با Python 3.6.0 ناشی از استفاده از typing.Counter و typing.NoReturn.
  • امکان استفاده از فهرست جداشده با کاما در output-format و جداسازی فایل‌های خروجی برای هر قالب تعیین‌شده. هر فایل خروجی را می‌توان بعد از یک دونقطه تعیین کرد، برای مثال: --output-format=json:myfile.json,colorized
  • بررسی‌کنندهٔ using-constant-test اکنون شرط‌های ثابتی را که شامل لیترال‌های لیست مانند [] و [1, 2, 3] هستند شناسایی می‌کند.
  • دستور پیکربندی ignore-paths افزوده شد. الگوهای عبارات باقاعده (regex) تعریف‌شده با مسیر فایل تطبیق داده می‌شوند.
  • افزودن پشتیبانی از مقادیر ممیز شناور هنگام تجزیهٔ پیکربندی از pyproject.toml.
  • رفع مثبت کاذب useless-type-doc در آرگومان نادیده‌گرفته‌شده با استفاده از pylint.extensions.docparams هنگامی که تابع با استفاده از pep484 دارای نوع تعیین‌شده بود اما نوع در داخل docstring ذکر نشده بود.
  • رفع عدم پشتیبانی از شناسایی نام‌های مستعار منسوخ‌شده برای توابع/متدهای موجود.
  • افزودن توابع/متدهای منسوخ‌شدهٔ گوناگون برای python 3.10، 3.7، 3.6 و 3.3.
  • عدم صدور مجدد consider-using-with برای ThreadPoolExecutor و ProcessPoolExecutor به دلیل این‌که کاربردهای موجهی بدون بلوک with دارند.
  • رفع خرابی هنگامی که یک شیء قابل‌فراخوانی (callable) که یک مدیر زمینه برمی‌گرداند به یک آیتم از لیست یا دیکشنری اختصاص داده می‌شد.

تاریخ انتشار: 2021-07-28

•
رفع مثبت کاذب undefined-variable هنگامی که نام متغیر در دکوراتور با آرگومان تابع مطابقت دارد

بستن #3791

تاریخ انتشار: 2021-07-21

  • رفع یک خرابی هنگامی که خطای 'TypeError object does not support item assignment' در کدی که تجزیه می‌شود وجود داشته باشد.

    بستن #4439

  • رفع خرابی در صورتی که یک شیء قابل فراخوانی با مقدار بازگشتی context manager، به یک آیتم از list یا dict انتساب داده می‌شد

    بستن #4732

  • رفع یک خرابی هنگامی که یک AttributeInferenceError در زمان عدم موفقیت در استنتاج نام واقعی یک import در astroid به‌درستی مدیریت نمی‌شد.

    بستن #4692

تاریخ انتشار: 2021-07-20

  • افزودن time.clock به توابع/متدهای منسوخ‌شده برای python 3.3
  • رفع باگی که در آن --fail-on حتی در صورت وجود اشکال مشخص‌شده، می‌توانست کد خروج صفر را بازگرداند

    بستن #4296 بستن #3363

  • رفع شکست سخت هنگام مدیریت صفت ناموجود در کلاسی با پایه‌های تکراری

    بستن #4687

  • رفع مثبت کاذب consider-using-with (R1732) در صورتی که یک عبارت شرطی سه‌گانه همراه با with استفاده شود

    بستن #4676

  • رفع مثبت کاذب deprecated-module هنگامی که یک import نسبی از نام ماژول منسوخ‌شده استفاده می‌کند.

    بستن #4629

  • رفع مثبت کاذب consider-using-with (R1732) در صورتی که contextlib.ExitStack وظیفه فراخوانی متد __exit__ را به عهده داشته باشد

    بستن #4654

  • رفع یک مثبت کاذب برای unused-private-member هنگام تغییر دادن یک صفت خصوصی با cls

    بستن #4657

  • رفع نادیده گرفته شدن توابع خالی توسط بررسی‌کننده تشابه‌ها با فعال بودن گزینه "ignore-signatures"

    بستن #4652

  • رفع مثبت کاذب use-maxsplit-arg هنگامی که اندیس در یک حلقه افزایش می‌یابد

    بستن #4664

  • عدم صدور پیام cyclic-import در صورتی که import توسط typing.TYPE_CHECKING محافظت شده باشد.

    بستن #3525

  • رفع مثبت کاذب not-callable با نحو جایگزین TypedDict

    بستن #4715

  • شفاف‌سازی مستندات برای consider-using-from-import / R0402 <#consider-using-from-import>
  • عدم صدور هشدار unreachable برای توابع مولد خالی

    بستن #4698

  • عدم صدور import-error، no-name-in-module و ungrouped-imports برای importهایی که توسط sys.version_info یا typing.TYPE_CHECKING محافظت شده‌اند.

    بستن #3285 بستن #3382

  • رفع invalid-overridden-method در خصوصیت‌های تو در تو

    بستن #4368

  • رفع مثبت کاذب unused-private-member هنگام استفاده از __new__ در یک کلاس

    بستن #4668

  • عدم صدور پیام consider-using-with برای ThreadPoolExecutor و ProcessPoolExecutor زیرا آن‌ها کاربردهای معتبری بدون بلوک with دارند.

    بستن #4689

  • رفع خرابی هنگام استنتاج متغیرهای انتساب‌یافته در الگوهای match

    بستن #4685

  • رفع یک خرابی هنگامی که در زمان استنتاج یک تابع معیوب در یک context manager، استثنای StopIteration برانگیخته می‌شد.

    بستن #4723

    تاریخ انتشار: 2021-07-01

  • رفع خطای فروپاشی هنگام تحلیل تابع خالی دارای docstring در بررسی‌کنندهٔ similarity.

    بسته شدن #4648

  • بررسی‌کنندهٔ similarity دیگر سه فاصلهٔ خالی انتهایی را برای خط‌های خالی در گزارش خود اضافه نمی‌کند.

تاریخ انتشار: 2021-07-01

  • رفع خطای فروپاشی هنگام تحلیل کدی که از type(self) برای دسترسی به یک ویژگی کلاس در بررسی‌کنندهٔ unused-private-member استفاده می‌کرد.

    بسته شدن #4638

  • رفع مثبت کاذب در unused-private-member هنگام دسترسی به یک متغیر خصوصی با self.

    بسته شدن #4644

  • رفع مثبت کاذب در unnecessary-dict-index-lookup و consider-using-dict-items برای جستجوهای نمایهٔ دیکشنری که دوباره مقداردهی شده‌اند.

    بسته شدن #4630

تاریخ انتشار: 2021-06-30

•
ارتقای astroid به نسخهٔ 2.6.2

بسته شدن #4631 بسته شدن #4633

تاریخ انتشار: 2021-06-29

  • اکنون از Python 3.10 پشتیبانی می‌شود.
  • افزودن حاشیه‌نویسی‌های نوع به فایل‌های dot در pyreverse.

    بسته شدن #1548

  • رفع عدم پشتیبانی از شناسایی نام‌های مستعار منسوخ‌شده برای توابع/متدهای موجود.

    بسته شدن #4618

  • بستهٔ astroid به نسخهٔ 2.6.1 ارتقا یافت.
  • افزودن توابع/متدهای منسوخ‌شدهٔ گوناگون برای python 3.10، 3.7، 3.6 و 3.3.
  • رفع مثبت کاذب useless-type-doc برای آرگومان نادیده‌گرفته‌شده هنگام استفاده از pylint.extensions.docparams در شرایطی که نوع تابع با pep484 تعیین شده بود اما نه در داخل docstring.

    بسته شدن #4117 بسته شدن #4593

  • بستهٔ setuptools_scm حذف شده و با tbump جایگزین شد تا وابستگی‌های پنهان زمان اجرا به setuptools حذف گردند.
  • رفع خطای فروپاشی هنگامی که یک تابع آزمون با @pytest.fixture تزیین شده و astroid نمی‌تواند نام دکوراتور را هنگام استفاده از open بدون with استنتاج کند.

    بسته شدن #4612

  • افزودن deprecated-decorator: زمانی که از یک دکوراتور منسوخ‌شده استفاده شود صادر می‌شود.

    بسته شدن #4429

  • افزودن رفتار ignore-paths. الگوهای regex تعریف‌شده با مسیر کامل فایل تطبیق داده می‌شوند.

    بسته شدن #2541

  • رفع منفی کاذب برای consider-using-with در صورتی که فراخوانی‌هایی مانند open() خارج از عبارات انتساب استفاده می‌شدند.
  • هشدار مربوط به arguments-differ اکنون تفاوت شناسایی‌شده را با ذکر نام آرگومان یا آرگومان‌های تغییریافته و نوع تغییر رخ‌داده به‌طور صریح مشخص می‌کند.
  • سرکوب consider-using-with درون مدیران زمینه (context managers).

    بسته شدن #4430

  • افزودن گزینهٔ --fail-on برای بازگرداندن کدهای خروج غیرصفر، صرف‌نظر از مقدار --fail-under.
  • چندتایی numversion دوباره حاوی اعداد صحیح است تا مشکل چندین افزونهٔ pylint که به آن وابسته بودند رفع شود.

    بسته شدن #4420

  • رفع مثبت کاذب too-many-ancestors هنگام ارث‌بری از کلاس‌های توکار، به‌ویژه از ماژول collections.abc.

    بسته شدن #4166 بسته شدن #4415

  • بررسی ماژول‌های منسوخ‌شدهٔ کتابخانهٔ استاندارد (Stdlib) به بررسی‌کنندهٔ stdlib منتقل شد. ماژول‌های منسوخ‌شدهٔ جدید اضافه شدند.
  • رفع صدور مثبت کاذب no-member برای ویژگی‌های انتزاعی.
  • ایجاد پیام خطای جدیدی به نام arguments-renamed که هرگونه تغییر در نام پارامترهای توابع بازنویسی‌شده را شناسایی می‌کند.

    بسته شدن #3536

  • بررسی‌کنندهٔ جدید consider-using-dict-items. هنگامی صادر می‌شود که روی کلیدهای دیکشنری پیمایش صورت گیرد و سپس به همان دیکشنری با آن کلید در بدنهٔ حلقه نمایه داده شود.

    بسته شدن #3389

  • عدم صدور import-error اگر وارد کردن ماژول پشت عبارت if sys.version_info >= (x, x) محافظت شده باشد.
  • رفع ناسازگاری با Python 3.6.0 ناشی از استفاده از typing.Counter و typing.NoReturn.

    بسته شدن #4412

  • بررسی‌کنندهٔ جدید use-maxsplit-arg. هنگامی صادر می‌شود که تنها به اولین یا آخرین عنصر str.split() دسترسی پیدا شود.

    بسته شدن #4440

  • افزودن ignore_signatures به بررسی‌کنندهٔ کدهای تکراری.

    بسته شدن #3619

  • رفع خطاهای مستندات در بند "Block disables" از راهنمای کاربر.
  • بررسی‌کنندهٔ جدید unnecessary-dict-index-lookup. زمانی صادر می‌شود که روی آیتم‌های دیکشنری (جفت‌های کلید-مقدار) پیمایش انجام شده و به مقدار از طریق جستجوی نمایه دسترسی پیدا شود.

    بسته شدن #4470

  • بررسی‌کنندهٔ جدید ``consider-using-from-import``. هنگامی که یک زیرماژول/عضو از یک بسته وارد شده و با همان نام مستعارگذاری شود، صادر می‌شود.

    بسته شدن #2309

  • پشتیبانی از فهرست جداشده با کاما در output-format و فایل‌های خروجی جداگانه برای هر قالب مشخص‌شده.

    بسته شدن #1798

  • توانمندسازی using-constant-test در تشخیص آزمون‌های ثابت متشکل از لیترال‌های لیست مانند [] و [1, 2, 3].
  • بهبود پیام خطای بررسی‌کنندهٔ unnecessary-comprehension با ارائهٔ پیشنهاد کد.

    بسته شدن #4499

  • بررسی‌کنندهٔ جدید unused-private-member. هنگامی صادر می‌شود که یک عضو خصوصی (یعنی عضوی که با __ شروع می‌شود) از یک کلاس تعریف شده اما استفاده نشده باشد.

    بسته شدن #4483

  • رفع منفی کاذب در consider-using-enumerate هنگام پیمایش روی یک ویژگی.

    بسته شدن #3657

  • بررسی‌کنندهٔ جدید invalid-class-object. هنگامی صادر می‌شود که یک غیرکلاس به ویژگی __class__ منتسب گردد.

    بسته شدن #585

  • رفع خطای فروپاشی هنگام عدم امکان بارگیری یک افزونه از پیکربندی، و ایجاد خطای bad-plugin-value / E0013 <#bad-plugin-value>' به‌جای آن.

    بسته شدن #4555

  • افزودن پشتیبانی از مقادیر ممیز شناور هنگام تجزیهٔ پیکربندی از pyproject.toml.

    بسته شدن #4518.IP • 2 invalid-length-returned، در پی ارتقایی در astroid اکنون هنگامی که اصلاً چیزی بازگردانده نمی‌شود نیز کار می‌کند.

  • logging-format-interpolation و logging-not-lazy، در پی ارتقایی در astroid اکنون روی کلاس لاگر ایجادشده از یک import تغییرنام‌یافتهٔ logging کار می‌کنند.
  • رفع مثبت کاذب no-member با کلاس پایهٔ جنریک (generic)

    بسته شد: pylint-dev/astroid#942

  • رفع مثبت کاذب assigning-non-slot با کلاسی پایه که از typing.Generic ارث‌بری می‌کند

    بسته شد: #4509 بسته شد: pylint-dev/astroid#999

  • وارسی‌کنندهٔ جدید invalid-all-format. زمانی صادر می‌شود که __all__ قالب نامعتبری داشته باشد، یعنی یک tuple یا list نباشد.
  • رفع مثبت کاذب unused-variable و undefined-variable با تطبیق الگو (Pattern Matching) در Python 3.10
  • وارسی‌کنندهٔ جدید await-outside-async. زمانی صادر می‌شود که await بیرون از یک تابع async استفاده شود.
  • شفاف‌سازی مستندات برای افزونهٔ typing.

    بسته شد: #4545

  • افزودن افزونهٔ جدید CodeStyleChecker. این افزونه شامل وارسی‌کننده‌هایی است که می‌توانند یکدستی کد را بهبود بخشند. از این رو لزوماً مزیتی در کارایی ایجاد نمی‌کنند و اغلب اوقات سلیقه‌ای (opinionated) هستند.
  • وارسی‌کنندهٔ جدید consider-using-tuple. زمانی صادر می‌شود که بتوان یک لیست یا مجموعهٔ تعریف‌شده درجا (in-place) را با یک tuple جایگزین کرد.
  • وارسی‌کنندهٔ جدید consider-using-namedtuple-or-dataclass. زمانی صادر می‌شود که مقادیر دیکشنری را بتوان با نمونه‌های namedtuple یا dataclass جایگزین کرد.
  • رفع خطایی که هنگام استفاده از slice به عنوان زیرنویس (subscript) برای dict رخ می‌داد.
  • کاهش مثبت‌های کاذب در استنتاج ویژگی‌های .value و .name در زیرکلاس‌های Enum، در پی ارتقایی در astroid

    بسته شد: #1932 بسته شد: #2062

  • رفع اشکال مربوط به cached_property که هنگام بازنویسی (override) یک property موجب خطای invalid-overridden-method می‌شد.

    بسته شد: #4023

  • رفع مثبت کاذب unused-import برای ماژول‌های واردشده‌ای که در جستجوی صفت‌ها در کامنت‌های نوع (type comments) به آن‌ها ارجاع داده شده است.

    بسته شد: #4603

از آغاز pylint تا نسخهٔ 2.14.0 (شامل این نسخه)، سیاهه‌تغییراتی داشتیم که دربردارندهٔ تمام تغییرات غیرجزئی Pylint بود؛ از جمله تغییراتی که رو به کاربر نبودند، یعنی تغییراتی که تنها در صورتی برای شما جالب بودند که توسعه‌دهنده‌ای باشید که روی pylint یا افزونه‌های pylint کار می‌کند یا تاریخ‌نگار پروژه‌های متن‌باز باشید.

از pylint 1.6.0 تا 2.14.0، علاوه بر سیاهه‌تغییرات کامل، خلاصه‌ای از تغییرات (عمدتاً رو به کاربر) نیز وجود داشت.

•
وابستگی اضافی 'doc' (extra-require) حذف شده است. __pkginfo__` دیگر شامل متاداده‌های بسته نیست (به‌جز numversion، تا نسخهٔ 3.0). متاداده‌ها از این طریق قابل دسترسی هستند:

`python from importlib import metadata metadata.metadata('pylint') ` این روش را به import کردن از __pkginfo__ ترجیح دهید.

  • پیام بازآرایی جدید consider-using-with. این پیام زمانی صادر می‌شود که توابع یا متدهای تخصیص‌دهندهٔ منابع در کتابخانهٔ استاندارد (مانند open() یا threading.Lock.acquire()) که می‌توانند به عنوان context manager استفاده شوند، بدون بلوک with فراخوانی شوند.
  • افزودن وارسی deprecated-argument برای آرگومان‌های منسوخ‌شده.
  • افزودن افزونهٔ جدید ConfusingConsecutiveElifChecker. این وارسی‌کنندهٔ اختیاری در صورتی که دستورهای if/elif با سطوح تورفتگی متفاوت مستقیماً پشت سر هم بیایند، یک پیام بازآرایی (R5601 confusing-consecutive-elif) صادر می‌کند.
  • افزودن وارسی consider-using-min-max-builtin برای دستورهای if که می‌توانند با min یا max توکار پایتون جایگزین شوند.
  • افزودن افزونهٔ جدید TypingChecker. این وارسی‌کنندهٔ اختیاری می‌تواند استفاده از نام‌های مستعار منسوخ‌شدهٔ typing را شناسایی کرده و در صورت امکان استفاده از نحو جایگزین union را پیشنهاد کند. (برای نمونه، 'typing.Dict' می‌تواند با 'dict'، و 'typing.Unions' با '|' جایگزین شود، و غیره.) اگر قصد استفاده از آن را دارید، حتماً گزینه‌های پیکربندی را بررسی کنید!
  • افزودن وارسی deprecated-class برای کلاس‌های منسوخ‌شده.
  • گزینهٔ جدید --output=<file> برای ذخیرهٔ نتیجه در یک فایل به جای چاپ در stdout.

    بستن #1070

  • کاهش استفاده از اصطلاحات فهرست سیاه/فهرست سفید (blacklist/whitelist). به‌ویژه، extension-pkg-allow-list جایگزینی برای extension-pkg-whitelist است و پیام blacklisted-name اکنون به عنوان disallowed-name صادر می‌شود. نام‌های قبلی برای حفظ سازگاری عقبروی همچنان پذیرفته می‌شوند.
  • بسته‌بندی اکنون منحصراً از طریق setuptools انجام می‌شود. پوشه‌های doc، tests، man، elisp و فایل Changelog دیگر بسته‌بندی نمی‌شوند - که حجم بسته را تا ۷۵٪ کاهش می‌دهد.
  • به‌روزرسانی astroid به 2.5.4
  • نام فایل COPYING برای استانداردسازی به LICENSE تغییر یافت.

تاریخ انتشار: 2021-05-31

•
نسخهٔ Astroid برای شاخهٔ 2.8 بر روی 2.5.6 ثابت (pinned) شده است.

ارجاع به #4527

تاریخ انتشار: 2021-04-26

  • نگه‌داشتن __pkginfo__.numversion به صورت یک تاپل (tuple) برای جلوگیری از شکستن pylint-django.

    بستن #4405

  • ابزار scm_setuptools به بسته‌بندی اضافه شده است.
  • برچسب‌های Pylint اکنون به شکل استاندارد vX.Y.Z هستند و دیگر به صورت pylint-X.Y.Z نخواهند بود.
  • پیام هشدار جدید deprecated-class. این پیام هنگام درون‌ریزی (import) یا فراخوانی کلاس‌های منسوخ‌شدهٔ کتابخانهٔ استاندارد صادر می‌شود (مانند collections.Iterable که در Python 3.10 حذف خواهد شد).

    بستن #4388

تاریخ انتشار: 2021-04-25

•
بازگرداندن موقت numversion در __pkginfo__ به دلیل ایجاد شکست در عملکرد Pylama، و بازگردانی (revert) تغییر ناسازگار و غیرضروری pylint.version.

بستن #4399

تاریخ انتشار: 2021-04-24

  • پیام بازآرایی (refactoring) جدید consider-using-with. این پیام هنگامی صادر می‌شود که توابع یا متدهای تخصیص منابع در کتابخانهٔ استاندارد (مانند open() یا threading.Lock.acquire()) که قابلیت استفاده به عنوان مدیر زمینه (context manager) را دارند، بدون یک بلوک with فراخوانی شوند.

    بستن #3413

  • رفع موارد مثبت کاذب در متغیرهای استفاده‌نشده درون توابع دکوراتور

    بستن #4252

  • افزودن افزونهٔ جدید ConfusingConsecutiveElifChecker. این بررسی‌کنندهٔ اختیاری در صورتی که دستورهای if/elif با سطوح تورفتگی متفاوت بلافاصله پشت سر هم بیایند، یک پیام بازآرایی (R5601 confusing-consecutive-elif) صادر می‌کند.
  • گزینهٔ جدید --output=<file> برای ذخیرهٔ خروجی در یک فایل به جای چاپ در stdout.

    بستن #1070

  • استفاده از یک پیام تجویزی (prescriptive) برای unidiomatic-typecheck

    بستن #3891

  • اعمال const-naming-style بر روی ثابت‌های ماژول که با typing.Final حاشیه‌نویسی شده‌اند
  • بسته‌بندی اکنون منحصراً از طریق setuptools انجام می‌شود. پوشه‌های doc، tests، man، elisp و فایل Changelog دیگر بسته‌بندی نمی‌شوند - که اندازهٔ بسته را تا ۷۵٪ کاهش می‌دهد.
  • بسته‌بندی دبیان اکنون (به‌طور رسمی) در https://salsa.debian.org/python-team/packages/pylint انجام می‌شود.
  • وابستگی اختیاری 'doc' (extra-require) حذف شده است.
  • اکنون __pkginfo__ فقط شامل __version__ است (که از طریق pylint.__version__ نیز در دسترس است)؛ سایر فراداده‌ها همچنان از طریق دستور from importlib import metadata;metadata.metadata('pylint') در دسترس هستند.
  • نام فایل COPYING برای استانداردسازی به LICENSE تغییر یافت.
  • رفع مثبت کاذب used-before-assignment در مقادیر بازگشتی تابع.

    بستن #4301

  • به‌روزرسانی astroid به 2.5.3

    بستن #2822، #4206، #4284

  • افزودن بررسی consider-using-min-max-builtin برای دستورهای if که می‌توانند با توابع توکار min یا max پایتون جایگزین شوند

    بستن #3406

  • عدم فعال‌سازی خودکار ارزیابی به تعویق افتادهٔ حاشیه‌نویسی‌های نوع با Python 3.10
  • به‌روزرسانی astroid به 2.5.4
  • افزودن افزونهٔ جدید TypingChecker. این بررسی‌کنندهٔ اختیاری می‌تواند استفاده از نام‌های مستعار منسوخ‌شدهٔ typing را شناسایی کرده و در صورت امکان استفاده از نحو جایگزین union را پیشنهاد دهد. (برای مثال، 'typing.Dict' می‌تواند با 'dict'، و 'typing.Unions' با '|' جایگزین شود، و غیره.) در صورت تمایل به استفاده، حتماً گزینه‌های پیکربندی آن را بررسی کنید!
  • فعال‌سازی مجدد شمارش‌های قدیمی در حالت گزارش (report mode).

    بستن #3819

  • هنگام تشخیص inconsistent-return-statements، عبارت assert False به عنوان یک گره بازگشتی (return node) در نظر گرفته می‌شود.

    بستن #4019

  • اگر امتیاز دقیقاً برابر با config.fail_under باشد، اجرا با شکست مواجه نخواهد شد.
  • توابعی که هیچ‌گاه مقداری برنمی‌گردانند می‌توانند NoReturn را به عنوان نوع راهنما (type hint) اعلان کنند تا inconsistent-return-statements صادر نشود.

    بستن #4122، #4188

  • بهبود بررسی‌های دسترسی حفاظت‌شده (protected access) برای مجاز دانستن دسترسی در متدهای کلاس

    بستن #1159

  • رفع مشکل مربوط به نحو PEP 585 و استفاده از collections.abc.Set
  • رفع مشکلی که باعث می‌شد متغیرهای کلاس دارای حاشیه‌نویسی typing.ClassVar به عنوان ثابت‌های کلاس شناسایی شوند. اکنون، متغیرهای کلاسی که با typing.Final حاشیه‌نویسی شده‌اند به این صورت شناسایی می‌شوند.

    بستن #4277

  • یکپارچه‌سازی مداوم با Read the Docs اضافه شده است.

    بستن #3850

  • عدم نمایش DuplicateBasesError هنگام دسترسی به مشخصه‌ها (attributes)
  • رفع خرابی برنامه هنگام بررسی setup.cfg برای پیکربندی pylint در صورت وجود نویسه‌های غیر اسکی (non-ascii)

    بستن #4328

  • امکان نادیده گرفتن کدهای محصور در بک‌تیک توسط غلط‌یاب املایی

    بستن #4319

  • امکان نادیده گرفتن دستورالعمل‌های ابزارهای پایتون (مانند black، flake8، zimports، isort، mypy، bandit و pycharm) در ابتدای توضیحات توسط غلط‌یاب املایی

    بستن #4320

  • رفع مشکلی که باعث ایجاد خطا در pylint مربوط به Emacs هنگام استفاده با tramp می‌شد
  • بهبود بررسی نحو نامعتبر PEP 585 در داخل توابع در صورت فعال بودن ارزیابی به تعویق افتادهٔ حاشیه‌نویسی‌های نوع
  • بهبود بررسی نحو نامعتبر PEP 585 به عنوان آرگومان‌های پیش‌فرض تابع

    از آغاز pylint تا نگارش 2.14.0 (شامل آن)، سیاههٔ تغییراتی وجود داشت که شامل تمام تغییرات غیرجزئی Pylint می‌شد؛ از جمله تغییراتی که رو به کاربر نبودند، یعنی تغییراتی که ممکن است تنها اگر توسعه‌دهنده‌ای باشید که روی pylint یا افزونه‌های pylint کار می‌کنید، یا تاریخ‌نگار نرم‌افزارهای متن‌باز هستید برایتان جالب باشند.

    از pylint 1.6.0 تا 2.14.0، علاوه بر سیاههٔ کامل تغییرات، خلاصه‌ای از تغییرات (عمدتاً رو به کاربر) نیز ارائه می‌شد.

  • اکنون Python 3.6+ الزامی است.
  • حذف پیام‌های تکراری هنگام استفاده از چندین job.
  • پشتیبانی از قابلیت‌های جدید typing ارائه‌شده توسط mypy 0.8
  • کاهش تعداد هشدارهای کاذب (false positive) به طور کلی
  • کاهش وقوع بازگشت‌های واقعاً عمیق که از محدودیت سیستم فراتر می‌رفتند (برای اصلاح مربوط به pandas، گزارش #3836 را ببینید)

  • افزودن بررسی nan-comparison برای مقایسهٔ مقادیر NaN
  • افزودن پشتیبانی از ignored-argument-names در DocstringParameterChecker و افزودن پیام‌های useless-param-doc و useless-type-doc.
  • افزودن بررسی empty-comment برای کامنت‌های خالی.
  • افزودن بررسی simplifiable-condition برای مقادیر ثابت اضافی در شرط‌های شامل and/or.
  • افزودن بررسی condition-evals-to-constant برای شرط‌های شامل and/or که به یک مقدار ثابت ارزیابی می‌شوند.
  • افزودن بررسی consider-using-generator برای استفاده از ساختار list comprehension درون توابع any یا all.

  • رفع هشدار کاذب برای builtin-not-iterating زمانی که zip یا map شیء پیمایش‌پذیر (iterable) دریافت می‌کند
  • رفع مشکل خاموش شدن استخر پردازش موازی (multiprocessing pool) در linter که هنگام اجرای موازی با سایر افزونه‌های pytest هشدار ایجاد می‌کرد.
  • اکنون بر اساس invalid-name نام‌گذاری Enumها با حروف بزرگ (UPPER_CASE) الزامی است.
  • رفع اشکالی که هنگام استفاده از --jobs 2 یا بیشتر منجر به تولید پیام‌های تکراری می‌شد.
  • افزودن گزینهٔ check-protected-access-in-special-methods در ClassChecker برای فعال/غیرفعال کردن صدور پیام protected-access برای صفت‌های با پیشوند تک‌زیرخط در متدهای ویژه.
  • اکنون در صورتی که یکی از شاخه‌های دستور try/except به طور صریح مقداری را بازنگرداند، در حالی که دیگری بازمی‌گرداند، پیام inconsistent-return-statements صادر می‌شود.
  • رفع هشدار کاذب برای پیام useless-super-delegation هنگامی که آرگومان کلیدواژه‌ای پیش‌فرض یک دیکشنری است.
  • رفع عبارت‌های باقاعدهٔ آسیب‌پذیر در pyreverse. ابهامات عبارت‌های باقاعدهٔ آسیب‌پذیر رفع شده و تطبیق آن‌ها ایمن‌تر و سریع‌تر شده است.
  • اکنون len-as-conditions تنها برای کلاس‌هایی فعال می‌شود که مستقیماً از list، dict یا set ارث‌بری کرده و تابع __bool__ را پیاده‌سازی نکرده‌اند، یا برای مولدهایی مانند range یا ساختارهای list/dict/set comprehension. این امر هشدارهای کاذب را برای سایر کلاس‌ها مانند DataFrame در pandas یا Array در numpy کاهش می‌دهد.
  • رفع مشکل در تشخیص کدهای تکراری برای --jobs=2+
  • گزینهٔ جدید allowed-redefined-builtins نام متغیرهایی را که مجاز به سایه‌اندازی (shadowing) روی شناسه‌های توکار (builtins) هستند مشخص می‌کند.
  • بهبود بررسی‌های دسترسی محافظت‌شده (protected access) برای مجاز شمردن دسترسی در متدهای کلاس

تاریخ انتشار: 2021-03-30

  • رفع مشکلی که در آن msgidهای غیرفعال‌شده نادیده گرفته نمی‌شدند

    بسته شدن #4265

  • رفع مشکل مربوط به ثابت‌های کلاسی دارای حاشیه‌نویسی نوع (annotated)

    بسته شدن #4264

    تاریخ انتشار: 2021-03-29

  • افزودن منطق برای بررسی صفت‌های منسوخ‌شده در DeprecationMixin.
  • کاهش استفاده از واژگان فهرست سیاه/فهرست سفید (blacklist/whitelist). به طور ویژه، extension-pkg-allow-list جایگزینی برای extension-pkg-whitelist است و پیام blacklisted-name اکنون به عنوان disallowed-name صادر می‌شود. نام‌های پیشین برای حفظ سازگاری رو به عقب همچنان پذیرفته می‌شوند.
  • انتقال بررسی‌کننده منسوخ‌شده به DeprecatedMixin

    بستن #4086

  • ارتقای نسخه astroid به 2.5.2
  • رفع مثبت کاذب برای method-hidden هنگام استفاده از صفت و متد خصوصی

    بستن #3936

  • قابلیت use-symbolic-message-instead اکنون روی پیام‌های قدیمی مانند C0111 (missing-docstring) نیز کار می‌کند.
  • حذف چاپ ناخواسته در خروجی استاندارد (stdout) از _emit_no_member
  • افزودن یک گزینه خط فرمان برای تعیین دایرکتوری خروجی pyreverse

    بستن #4159

  • رفع مشکل مربوط به Enumها و class-attribute-naming-style=snake_case

    بستن #4149

  • افزودن گزینه allowed-redefined-builtins برای تنظیم دقیق بررسی redefined-builtin.

    بستن #3263

  • رفع مشکل هنگام اجرا با python -m pylint

    بستن #4161

  • معاف کردن typing.TypedDict از بررسی too-few-public-methods.

    بستن #4180

  • رفع مثبت کاذب no-member برای حاشیه‌نویسی‌های نوع فاقد مقدار پیش‌فرض.

    بستن #3167

  • افزودن --class-const-naming-style برای ثابت‌های Enum و متغیرهای کلاس مشخص‌شده با typing.ClassVar

    بستن #4181

  • رفع خطای astroid.Inference برای متغیرهای تعریف‌نشده همراه با len()`

    بستن #4215

  • رفع شماره ستون در پیام‌های هشدار FIXME

    بستن #4218

  • بهبود مدیریت عبارت‌های انتساب (assignment expressions) و مدیریت بهتر حالت‌های مرزی

    بستن #3763، #4238

  • بهبود بررسی اشتراک‌پذیر بودن کلاس (subscriptable) بر اساس PEP585
  • رفع مستندات و نحوه مدیریت نام فایل در --import-graph
  • رفع مثبت کاذب برای unused-import روی آرگومان‌های کلیدواژه‌ای کلاس

    بستن #3202

  • رفع پس‌رفت در پلاگین‌های روی PYTHONPATH در صورتی که دومی دایرکتوری کاری جاری (cwd) باشد

    بستن #4252

تاریخ انتشار: 2021-02-28

  • رفع مثبت کاذب در Enum.__members__.items()، Enum.__members__.values و Enum.__members__.keys

    بستن #4123

  • پاک‌سازی صحیح ورودی‌های خطرناک sys.path (نه تنها اولین مورد)

    بستن #3636

  • بهبودهای جریان کاری و بسته‌بندی

    تاریخ انتشار: 2021-02-23

  • در دسترس قرار دادن UnittestLinter در pylint.testutils
  • عدم بررسی دایرکتوری‌هایی که با '.' شروع می‌شوند هنگام استفاده از register_plugins

    بسته شدن #4119

تاریخ انتشار: 2021-02-21

  • معرفی DeprecationMixin برای بررسی‌های قابل استفاده مجدد منسوخ‌سازی (deprecation).

    بسته شدن #4049

  • رفع مثبت کاذب برای builtin-not-iterating هنگامی که map یک تکرارپذیر (iterable) دریافت می‌کند

    بسته شدن #4078

  • اکنون Python 3.6+ الزامی است.
  • رفع مثبت کاذب برای builtin-not-iterating هنگامی که zip یک تکرارپذیر (iterable) دریافت می‌کند
  • افزودن بررسی nan-comparison برای مقایسه‌های NaN
  • رفع باگ برای شماره خط پیام empty-comment.

    بسته شدن #4009

  • صدور bad-reversed-sequence برای دیکشنری‌ها تنها در نسخه‌های پیش از py3.8

    بسته شدن #3940

  • مدیریت دکوراتورهای کلاسی اعمال‌شده روی توابع.

    بسته شدن #3882

  • افزودن بررسی برای کامنت‌های خالی
  • رفع ایراد جزئی در مستندات contribute.rst
  • اکنون بر اساس invalid-name نام‌گذاری Enumها با حروف بزرگ UPPER_CASE الزامی است.

    بسته شدن #3834

  • افزودن بررسی‌های جاافتاده برای توابع منسوخ‌شده.
  • ارزیابی به تعویق افتاده حاشیه‌نویسی‌ها (annotations) اکنون به طور پیش‌فرض در صورت بالاتر بودن نسخه پایتون از 3.10 شناسایی می‌شود

    بسته شدن #3992

  • اصلاح متادیتای ستون برای بررسی‌های anomalous backslash
  • پایان پشتیبانی از Python 3.5
  • افزودن پشتیبانی از pep585 با ارزیابی به تعویق افتاده

    بسته شدن #3320

  • بررسی نحو جایگزین union - سند PEP 604

    بسته شدن #4065

  • رفع چندین مورد مثبت کاذب در عبارات انتساب (assignment expressions)

    بسته شدن #3347, #3953, #3865, #3275

  • رفع مثبت کاذب TypedDict inherit-non-class در Python 3.9+

    بسته شدن #1927

  • رفع مشکل نحو تو در توی PEP 585
  • رفع مشکل نحو تو در توی PEP 604
  • رفع کرش در undefined-variable ناشی از صفت‌های زنجیره‌ای در metaclass

    بسته شدن #3742

  • رفع مثبت کاذب برای not-async-context-manager هنگامی که از contextlib.asynccontextmanager استفاده می‌شود

    بسته شدن #3862

  • اصلاح خاموش شدن استخر چندپردازشی (multiprocessing pool) تحلیل‌گر کد (که هنگام اجرا به صورت موازی با سایر افزونه‌های pytest هشدار صادر می‌کرد)

    بسته شدن #3779

  • رفع صدور مثبت کاذب no-self-use و unused-argument برای متدهای انواع ساختاری جنریک (Protocol[T])

    بسته شدن #3885

  • رفع باگی که هنگام استفاده از --jobs 2 یا بیشتر منجر به پیام‌های تکراری می‌شد.

    بسته شدن #3584

  • افزودن گزینه check-protected-access-in-special-methods در ClassChecker برای فعال/غیرفعال کردن صدور پیام protected-access برای صفت‌های با پیشوند تک‌زیرخط در متدهای ویژه.

    بسته شدن #3120

  • رفع عبارات منظم آسیب‌پذیر در pyreverse

    بسته شدن #3811

  • پیام inconsistent-return-statements اکنون در صورتی صادر می‌شود که یکی از دستورهای try/except برخلاف دیگری به طور صریح مقداری را برنگرداند.

    بسته شدن #3468

  • رفع مثبت کاذب useless-super-delegation هنگامی که آرگومان کلیدواژه‌ای پیش‌فرض یک دیکشنری است.

    بسته شدن #3773

  • رفع کرش هنگامی که فایل پیکربندی مشخص‌شده وجود ندارد
  • افزودن پشتیبانی از ignored-argument-names در DocstringParameterChecker و افزودن پیام‌های useless-param-doc و useless-type-doc.

    بسته شدن #3800

  • اعمال سازگار docparams در زمانی که docstring وجود ندارد

    بسته شدن #2738

  • رفع مثبت کاذب duplicate-code هنگامی که خطوط تنها حاوی فاصله‌های خالی و نویسه‌های غیرالفبایی-عددی هستند (مانند پرانتز، کروشه، کاما و غیره)
  • بهبود پیام تحلیل کد برای singleton-comparison با مقادیر بولی
  • رفع کرش غلط‌یاب املایی در خطوط دندانه‌دار docstring که شبیه کامنت‌های # هستند

    بسته شدن #3786

  • رفع خطای AttributeError در checkers/refactoring.py
  • بهبود فیلتر املایی دستورالعمل‌های sphinx
  • رفع باگ در ارزیابی به تعویق افتاده هنگام استفاده از نام‌های مستعار برای حاشیه‌نویسی‌ها.

    بسته شدن #3798

  • رفع ایرادات جزئی در مستندات
  • بهبود عملکرد بررسی طول خط.
  • حذف منسوخ‌سازی نادرست inspect.getfullargspec
  • رفع مثبت کاذب signature-differs برای توابعی با آرگومان‌های متغیر (variadics)

    بسته شدن #3737

  • رفع کرش در consider-using-enumerate هنگام مواجهه با range() بدون آرگومان

    بسته شدن #3735

  • بررسی len-as-conditions اکنون فقط برای کلاس‌هایی فعال می‌شود که مستقیماً از list، dict یا set ارث‌بری کرده و تابع __bool__ را پیاده‌سازی نکرده‌اند، یا از مولدهایی نظیر range یا درک‌های list/dict/set مشتق شده‌اند. این امر باید موارد مثبت کاذب را برای سایر کلاس‌ها، مانند DataFrame در pandas یا Array در numpy کاهش دهد.

    بسته شدن #1879

  • رفع مشکل کار نکردن duplicate-errors با -j2+

    بسته شدن #3314

  • گزینه generated-members اکنون با نام کامل (qualified name) اعضا مطابقت داده می‌شود

    بسته شدن #2498

  • افزودن بررسی برای تابع bool به len-as-condition
  • افزودن بررسی simplifiable-condition برای مقادیر ثابت غیرضروری در شرط‌های با استفاده از and/or.
  • افزودن بررسی condition-evals-to-constant برای شرط‌های با استفاده از and/or که حاصل آن‌ها به یک مقدار ثابت ارزیابی می‌شود.

    بسته شدن #3407

  • تغییر setup.py برای کار با distlib https://pypi.org/project/distlib بسته شد: #3555
  • بررسی جدید: consider-using-generator

    این بررسی زمانی هشدار می‌دهد که یک comprehension در داخل یک تابع any یا all استفاده شده باشد، زیرا غیرضروری است و باید به جای آن از یک generator استفاده شود. استفاده از generator کد کمتری برده و بسیار سریع‌تر خواهد بود.

    بسته شد: #3165

  • افزودن Github Actions جهت جایگزینی Travis و AppVeyor در آینده

از ابتدای pylint تا نسخه 2.14.0، ما یک گزارش تغییرات (changelog) داشتیم که شامل تمام تغییرات غیرجزئی در Pylint بود، از جمله تغییراتی که کاربر با آن‌ها مواجه نمی‌شد؛ یعنی تغییراتی که ممکن است تنها در صورتی برای شما جالب باشد که توسعه‌دهنده‌ای باشید که روی pylint یا افزونه‌های pylint کار می‌کنید، یا تاریخ‌نگار پروژه‌های منبع‌باز باشید.

از pylint 1.6.0 تا 2.14.0، علاوه بر گزارش کامل تغییرات، خلاصه‌ای از تغییرات (عمدتاً مربوط به کاربران) نیز وجود داشت.

  • بررسی‌های bad-continuation و bad-whitespace حذف شده‌اند. ابزار black یا یک قالب‌بند دیگر می‌تواند بهتر از Pylint در این مورد به شما کمک کند
  • پشتیبانی از isort 5 اضافه شد

  • افزودن بررسی super-with-arguments برای علامت‌گذاری موارد فراخوانی super به سبک Python 2.
  • افزودن بررسی raise-missing-from برای استثناهایی که باید علت (cause) داشته باشند.

  • بررسی‌های bad-continuation و bad-whitespace حذف شده‌اند. ابزار black یا یک قالب‌بند دیگر می‌تواند بهتر از Pylint در این زمینه به شما کمک کند
  • گزینه no-space-check حذف شده است؛ دیگر نمی‌توان با استفاده از گزینه‌های هوشمندانه، خط خالی را مانند یک trailing-whitespace در نظر گرفت.
  • بررسی mixed-indentation حذف شده است؛ دیگر مفید نیست زیرا TabError مستقیماً در python3 گنجانده شده است
  • رفع مثبت کاذب در superfluous-parens / C0325 <#superfluous-parens> برای عملگر walrus
  • افزودن پشتیبانی از هر دو نسخه isort 4 و isort 5. اگر isort 4 را در نیازمندی‌های پروژه خود قفل (pin) کرده‌اید، تغییری ایجاد نمی‌شود. با این حال اگر از isort 5 استفاده می‌کنید، توجه داشته باشید که گزینه known-standard-library در isort 4 و isort 5 یکسان تفسیر نمی‌شود (برای جزئیات بیشتر به راهنمای مهاجرت در مستندات isort (دیگر در دسترس نیست) مراجعه کنید). برای حفظ سازگاری اکثر کاربران pylint، گزینه known-standard-library در pylint اکنون به extra-standard-library در isort 5 نگاشت می‌شود. اگر واقعاً آنچه را می‌خواهید که known-standard-library اکنون در isort 5 ارائه می‌دهد، باید بررسی wrong-import-order را در pylint غیرفعال کرده و isort را به صورت دستی با یک فایل پیکربندی مناسب isort اجرا کنید.

تاریخ انتشار: 2021-02-16

•
نسخه Astroid برابر < 2.5 تعیین شده است

بسته شد: #4093

تاریخ انتشار: 2020-08-20

  • رفع باگ‌های مختلف مربوط به حوزه (scope) در بازبین undefined-variable

    بسته شد: #1082، #3434، #3461

  • بررسی‌های bad-continuation و bad-whitespace حذف شده‌اند، ابزار black یا یک قالب‌بند دیگر می‌تواند در این مورد بهتر از Pylint به شما کمک کند

    بسته شد: #246، #289، #638، #747، #1148، #1179، #1943، #2041، #2301، #2304، #2944، #3565

  • گزینه no-space-check حذف شده است. دیگر نمی‌توان با استفاده از گزینه‌های هوشمندانه، خط خالی را مانند یک trailing-whitespace در نظر گرفت

    بسته شد: #1368

  • هنگام مواجهه با توابع overload، خطای missing-kwoa دیگر صادر نمی‌شود

    بسته شد: #3655

  • بررسی mixed-indentation حذف شده است؛ دیگر مفید نیست زیرا TabError مستقیماً در python3 گنجانده شده است

    بسته شد: #2984 #3573

  • افزودن بررسی super-with-arguments برای علامت‌گذاری موارد فراخوانی super به سبک Python 2.
  • افزودن یک FAQ با شرح این که برای جلوگیری از تکرار پیام‌ها با سایر linterهای محبوب، کدام پیام‌ها باید غیرفعال شوند
  • رفع مثبت کاذب در superfluous-parens / C0325 <#superfluous-parens> برای عملگر walrus

    بسته شد: #3383

  • رفع اشکال عدم پذیرش اعداد ممیز شناور در fail-under
  • رفع اشکالی که در آن ignore-docstrings تمام خطوط موجود در یک ماژول را نادیده می‌گرفت
  • رفع پیکربندی pre-commit که می‌توانست منجر به خطوط تکراری کشف‌نشده در کد شود
  • رفع یک فروپاشی در حالت موازی هنگامی که مسیر فایل ماژول تعیین نشده است

    بسته شد: #3564

  • افزودن بررسی raise-missing-from برای استثناهایی که باید یک علت (cause) داشته باشند.
  • پشتیبانی از هر دو نسخه isort 4 و isort 5. اگر isort 4 را در نیازمندی‌های پروژه خود قفل کرده‌اید، تغییری ایجاد نمی‌شود. با این حال اگر از isort 5 استفاده می‌کنید، توجه داشته باشید که گزینه known-standard-library در isort 4 و isort 5 یکسان تفسیر نمی‌شود (برای جزئیات بیشتر به راهنمای مهاجرت در مستندات isort مراجعه کنید). برای حفظ سازگاری اکثر کاربران pylint، گزینه known-standard-library در pylint اکنون به extra-standard-library در isort 5 نگاشت می‌شود. اگر واقعاً آنچه را می‌خواهید که known-standard-library اکنون در isort 5 معنی می‌دهد، باید بررسی wrong-import-order را در pylint غیرفعال کرده و isort را به صورت دستی با یک فایل پیکربندی مناسب isort اجرا کنید.

    بسته شد: #3722

  • رفع یک فروپاشی ناشی از عدم محافظت در برابر InferenceError هنگام فراخوانی infer_call_result

    بسته شد: #3690

  • رفع یک فروپاشی در حالت موازی هنگامی که مسیر فایل ماژول تعیین نشده است

    بسته شد: #3564

    از آغاز pylint تا نسخهٔ 2.14.0 (شامل آن)، ما یک گزارش تغییرات داشتیم که حاوی تمام تغییرات غیرجزئی Pylint بود، از جمله تغییراتی که مربوط به سمت کاربر نبودند؛ یعنی تغییراتی که تنها در صورتی ممکن است برای شما جالب باشد که توسعه‌دهنده‌ای باشید که روی pylint یا افزونه‌های آن کار می‌کند، یا یک تاریخ‌نگار منبع‌باز باشید.

    از pylint 1.6.0 تا 2.14.0، علاوه‌بر گزارش کامل تغییرات، خلاصه‌ای از تغییرات (عمدتاً سمت کاربر) نیز وجود داشت.

•
بررسی جدید isinstance-second-argument-not-valid-type اضافه شد.
این بررسی هر زمان که pylint فراخوانی تابع isinstance را با آرگومان دومی که یک type نیست بیابد، صادر می‌شود. چنین کدی احتمالاً ناخواسته است زیرا باعث پرتاب خطای TypeError در زمان اجرا خواهد شد.
•
بررسی جدید assert-on-string-literal اضافه شد.
این بررسی هر زمان که pylint یک دستور assert با یک رشتهٔ لفظی (string literal) به عنوان آرگومان نخست پیدا کند صادر می‌شود. چنین دستورهای assert احتمالاً ناخواسته هستند زیرا همواره موفقیت‌آمیز خواهند بود.
•
بررسی جدید f-string-without-interpolation اضافه شد.
این بررسی هر زمان که pylint استفاده از یک f-string فاقد هرگونه مقدار درون‌یابی‌شده را تشخیص دهد صادر می‌شود، بدین معنی که f-string می‌تواند یک رشتهٔ معمولی باشد.
•
چندین بررسی برای انواع بازگشتی نامعتبر توابع پروتکل اضافه شدند:
  • invalid-bool-returned: تابع __bool__ مقدار bool بازنگرداند
  • invalid-index-returned: تابع __index__ مقدار integer بازنگرداند
  • invalid-repr-returned): تابع __repr__ مقدار string بازنگرداند
  • invalid-str-returned): تابع __str__ مقدار string بازنگرداند
  • invalid-bytes-returned): تابع __bytes__ مقدار string بازنگرداند
  • invalid-hash-returned): تابع __hash__ مقدار integer بازنگرداند
  • invalid-length-hint-returned): تابع __length_hint__ یک integer غیرمنفی بازنگرداند
  • invalid-format-returned): تابع __format__ مقدار string بازنگرداند
  • invalid-getnewargs-returned): تابع __getnewargs__ مقدار tuple بازنگرداند
  • invalid-getnewargs-ex-returned): تابع __getnewargs_ex__ یک tuple به فرم (tuple, dict) بازنگرداند
•
بررسی جدید inconsistent-quotes اضافه شد.
این بررسی زمانی صادر می‌شود که جداکننده‌های نقل‌قول (" و ') به‌طور یکنواخت در سرتاسر یک ماژول استفاده نشوند. این بررسی اجازه می‌دهد تا از گریزدهی (escaping) غیرضروری اجتناب شود؛ برای مثال، "Don't error" در ماژولی که در سایر موارد رشته‌ها با نقل‌قول تکی مشخص می‌شوند مجاز است تا نیازی به گریز دادن نقل‌قول تکی در Don't نباشد.
•
بررسی جدید non-str-assignment-to-dunder-name برای اطمینان از این‌که فقط مقادیر string به ویژگی‌های __name__ انتساب داده می‌شوند، اضافه شد.
  • پیکربندی می‌تواند از یک فایل setup.cfg یا pyproject.toml در دایرکتوری جاری خوانده شود. یک فایل setup.cfg باید نام بخش‌های pylintrc را با pylint. پیشوندگذاری کند، برای نمونه [pylint.MESSAGES CONTROL]. یک فایل pyproject.toml باید نام بخش‌ها را با tool.pylint. پیشوندگذاری کند، برای نمونه [tool.pylint.'MESSAGES CONTROL']. این فایل‌ها همچنین می‌توانند از خط فرمان مشخص و ارسال شوند.
  • افزودن گزینه‌های جدید good-names-rgx و bad-names-rgx برای مجاز کردن یا ممنوع ساختن نام‌ها از طریق عبارت‌های منظم (regular expressions)

    برای فراهم ساختن مدیریت بهتر نام‌های مجاز/غیرمجاز، دو گزینهٔ پیکربندی جدید اضافه کردیم: good-names-rgxs: فهرستی از عبارت‌های منظم جداشده با کاما، که اگر نامی با آن‌ها تطابق یابد از بررسی نام‌گذاری معاف می‌شود. bad-names-rgxs: فهرستی از عبارت‌های منظم جداشده با کاما، که در صورت تطابق یک نام با آن‌ها، همواره به‌عنوان نام غیرمجاز علامت‌گذاری خواهد شد.

  • انواع تغییرپذیر (mutable) از collections.* اکنون به‌عنوان مقادیر پیش‌فرض خطرناک علامت‌گذاری می‌شوند.
  • افزودن پرچم جدید --fail-under جهت تنظیم آستانهٔ امتیازی که کمتر از آن آزمون‌های کلی رد می‌شوند. اگر امتیاز بالاتر از آستانهٔ fail-under باشد، pylint با مقدار ۰ برای مشخص کردن نبود خطا به SystemExit خاتمه می‌دهد.
  • افزودن گزینهٔ جدید notes-rgx برای انعطاف‌پذیرتر کردن هشدارهای fixme. اکنون می‌توان از هر دو گزینهٔ notes یا notes-rgx برای شناسایی هشدارهای fixme استفاده کرد.
  • نویسه‌های غیر ASCII اکنون توسط invalid-name مجاز شمرده می‌شوند.
  • دستور pylint دیگر برای موارد غیرثابت (non-constants) یافت‌شده در سطح ماژول، خطای invalid-name صادر نمی‌کند.

    برنامهٔ Pylint همهٔ متغیرهای سطح ماژول را ثابت فرض می‌کرد، که این موضوع در الزامات واقعی PEP 8 نیست.

  • بررسی جدیدی با نام non-ascii-name برای شناسایی شناسه‌های دارای نویسه‌های غیر ASCII اضافه شد.
  • توابع overloaded در سیستم تایپینگ دیگر بررسی‌های no-self-use، unused-argument، missing-docstring و موارد مشابهی که توابع overloaded را توابع عادی تلقی می‌کردند، تحریک نمی‌کنند.
  • دیگر نمی‌توان python -m pylint را وادار به وارد کردن (import) فایل‌ها از دایرکتوری محلی کرد.
  • دستور جدید --list-extensions اضافه شد.

    این دستور تمام افزونه‌های موجود در pylint.extensions را فهرست می‌کند.

  • موارد مثبت کاذب (false positives) متعددی برطرف شده‌اند که می‌توانید جزئیات بیشتر را در فایل‌های Changelog مطالعه کنید.
  • انواع متعددی از قالب‌بندی رشته در توابع logging مجاز هستند.

پیام logging-fstring-interpolation بازگردانده شده است تا امکان استفاده از چندین نوع قالب‌بندی رشته فراهم شود. نوع قالب‌بندی مورد استفاده به‌جای گزینهٔ logging-format-style، از طریق فعال و غیرفعال کردن پیام‌ها تعیین می‌گردد. مقدار fstr برای گزینهٔ logging-format-style نامعتبر است.

تاریخ انتشار: 2020-06-8

  • رفع پس‌رفتی که در آن کامنت‌های غیرفعال‌سازی (disable) دارای نام بررسی‌کننده به همراه اعداد، به‌درستی تجزیه نمی‌شدند

    بستن #3666

  • مدیریت صحیح ویژگی‌های انتزاعی (abstract properties) توسط property-with-parameters

    بستن #3600

  • پیام continue-in-finally دیگر روی Python 3.8 که اکنون در آن معتبر است، صادر نمی‌شود

    بستن #3612

  • رفع پس‌رفتی که در آن پیام‌های دارای خط تیره به‌طور کامل تجزیه نمی‌شدند

    بستن #3604

  • در یک فایل پیکربندی TOML، اکنون می‌توان به‌جای رشته‌ها از انواع غنی (غیر رشته‌ای) مانند list، integer یا boolean استفاده کرد. برای نمونه، اکنون می‌توان یک list از شناسه‌های پیام را برای فعال‌سازی به‌شکل زیر تعریف کرد:
enable = [
    "use-symbolic-message-instead",
    "useless-suppression",
]

بستن #3538

  • رفع پس‌رفتی که در آن امتیاز با چندین کار (jobs) هم‌روند گزارش نمی‌شد

    بستن #3547

  • محافظت در برابر خطای AttributeError هنگام بررسی cell-var-from-loop

    بستن #3646

    تاریخ انتشار: 2020-05-05

•
pylint.Run پارامتر do_exit را به عنوان یک پارامتر منسوخ می‌پذیرد

بستن #3590

تاریخ انتشار: 2020-05-05

  • رفع خرابی در جستجوی method-hidden برای کلاس‌های پایه ناشناخته

    بستن #3527

  • بازگرداندن پارامتر exit در pylint.Run به do_exit

    این مورد چند انتشار پیش سهواً به do_exit تغییر یافته بود.

    بستن #3533

  • تشخیص چندآرگومانی (variadic) در no-value-for-parameter برای دستورهای انتساب بهبود یافته است

    بستن #3563

  • امکان شناسایی صحیح فایل‌های بسته (package) هنگام استفاده از چندین پردازش (multiple jobs)

    بستن #3524

  • امکان ارزیابی (linting) دایرکتوری‌های فاقد __init__.py که یک پس‌رفت در نسخه 2.5 بود.

    بستن #3528

تاریخ انتشار: 2020-04-27

  • رفع منفی کاذب در undefined-variable هنگام استفاده از مشخصه کلاس در ساختارهای درک (comprehension).

    بستن #3494

  • رفع مثبت کاذب در undefined-variable هنگام استفاده از مشخصه کلاس در دکوراتور یا به عنوان راهنمای نوع (type hint).

    بستن #511 بستن #1976

  • حذف نشانه‌گذاری HTML (HTML quoting) پیام‌ها در خروجی JSON.

    بستن #2769

  • تنظیم قاعده invalid-name برای کار با شناسه‌های غیر ASCII و افزودن قاعده non-ascii-name.

    بستن #2725

  • آرگومان‌های فقط‌موضعی (positional-only) برای useless-super-delegation لحاظ می‌شوند
  • هشدار unidiomatic-typecheck دیگر برای عملگرهای in و not in صادر نمی‌شود

    بستن #3337

  • یادداشت‌های نوع (annotations) آرگومان‌های فقط‌موضعی برای unused-import لحاظ می‌شوند

    بستن #3462

  • افزودن دستوری برای فهرست کردن افزونه‌های موجود.
  • امکان پردازش صحیح متغیرهای استفاده‌شده هنگام فعال یا غیرفعال بودن بررسی‌های مختلف

    بستن #3445

  • اصلاح قاعده dangerous-default-value / W0102 <#dangerous-default-value> جهت در نظر گرفتن مقادیر پیش‌فرض آرگومان‌های کلیدواژه‌ای

    بستن #3373

  • رفع مثبت کاذب در self-assigning-variable هنگام باز کردن تاپل (tuple unpacking).

    بستن #3433

  • هشدار no-self-use دیگر برای کدهای خرد نوع‌بندی (typing stubs) صادر نمی‌شود.

    بستن #3439

  • رفع مثبت کاذب در undefined-variable هنگام استفاده از __class__

    بستن #3090

  • صدور invalid-name برای متغیرهای تعریف‌شده در حلقه‌ها در سطح ماژول.

    بستن #2695

  • افزودن بررسی برای مواردی که آرگومان دوم در isinstance یک نوع (type) نیست.

    بستن #3308

  • افزودن گزینه 'notes-rgx' جهت استفاده در بررسی fixme.

    بستن #2874

  • بررسی function-redefined توابعی را که به صورت شرطی بازتعریف شده‌اند، مستثنی می‌کند.

    بستن #2410

  • توابع typing.overload از بررسی‌های رشته مستندات (docstring) مستثنی شدند

    بستن #3350

  • صدور invalid-overridden-method برای بازنویسی‌های نامناسب async def.

    بستن #3355

  • جلوگیری از وارد کردن (import) کد کاربر توسط python -m pylint ...

    دستور python -m pylint ... دایرکتوری کاری فعلی را به عنوان نخستین عنصر sys.path اضافه می‌کند. این امر یک رخنه امنیتی بالقوه ایجاد می‌کند که در آن pylint تا زمانی که کد در ماژول‌هایی هم‌نام با stdlib یا ماژول‌های خود pylint قرار داشته باشد، کدهای سطح کاربر را وارد خواهد کرد.

    بستن #3386

  • افزودن گزینه dummy-variables-rgx برای بررسی _redeclared-assigned-name.

    بستن #3341

  • اصلاح ایجاد گراف برای مسیرهای نسبی
  • افزودن بررسی برای دستورهای assert روی مقادیر رشته‌ای ثابت (string literals).

    بستن #3284

  • عملگر not in برای برخی از بررسی‌کننده‌های انتقال به Python 3 به عنوان یک زمینه تکرار (iterating context) در نظر گرفته می‌شود.
  • بررسی جدید inconsistent-quotes اضافه شد.
  • افزودن بررسی برای انتساب مقدار غیررشته‌ای به مشخصه __name__.

    بستن #583

  • متدهای __pow__، __imatmul__، __trunc__، __floor__ و __ceil__ به عنوان نام‌های متد خاص شناخته می‌شوند.

    بستن #3281

  • افزودن خطاها برای توابع پروتکل هنگام تشخیص انواع بازگشتی نامعتبر. E0304 (invalid-bool-returned / E0304 <#invalid-bool-returned>): __bool__ یک مقدار bool بازنگرداند E0305 (invalid-index-returned / E0305 <#invalid-index-returned>): __index__ یک عدد صحیح بازنگرداند E0306 (invalid-repr-returned / E0306 <#invalid-repr-returned>): __repr__ یک رشته بازنگرداند E0307 (invalid-str-returned / E0307 <#invalid-str-returned>): __str__ یک رشته بازنگرداند E0308 (invalid-bytes-returned / E0308 <#invalid-bytes-returned>): __bytes__ یک رشته بازنگرداند E0309 (invalid-hash-returned / E0309 <#invalid-hash-returned>): __hash__ یک عدد صحیح بازنگرداند E0310 (invalid-length-hint-returned / E0310 <#invalid-length-hint-returned>): __length_hint__ یک عدد صحیح غیرمنفی بازنگرداند E0311 (invalid-format-returned / E0311 <#invalid-format-returned>): __format__ یک رشته بازنگرداند E0312 (invalid-getnewargs-returned / E0312 <#invalid-getnewargs-returned>): __getnewargs__ یک تاپل بازنگرداند E0313 (invalid-getnewargs-ex-returned / E0313 <#invalid-getnewargs-ex-returned>): __getnewargs_ex__ یک تاپل به شکل (tuple, dict) بازنگرداند

    بستن #560

  • بررسی‌های missing-*-docstring می‌توانند انتساب‌های __doc__ را جستجو کنند.

    بستن #3301

  • قاعده undefined-variable اکنون می‌تواند تکرارپذیرهای تعریف‌نشده حلقه را بیابد

    بستن #498

  • تابع safe_infer تا زمانی که تمام مسیرها نوع یکسانی داشته باشند، می‌تواند یک مقدار را استنتاج کند.

    بستن #2503

  • افزودن پرچم --fail-under <score> که در فایل .pylintrc نیز قابل پیکربندی است. اگر امتیاز نهایی بیشتر از امتیاز تعیین‌شده باشد، یک موفقیت تلقی شده و pylint با کد خروج 0 خاتمه می‌یابد. در غیر این صورت، یک شکست تلقی شده و pylint با کد خروج فعلی خود بر اساس پیام‌های صادرشده خارج می‌شود.

    بستن #2242

  • عدم صدور line-too-long برای خطوط چندگانه زمانی که یادداشت disable=line-too-long در انتهای آن‌ها قرار دارد

    بستن #2957

  • رفع یک AttributeError ناشی از مدیریت نادرست استنتاج dataclasses در pyreverse.sp بسته شد #3256
  • معاف نکردن except بدون نوع (bare except) از بررسی‌های undefined-variable و موارد مشابه

    اگر گره‌ای درون یک TryExcept قرار داشت، pylint هنگام تصمیم‌گیری برای صدور یا عدم صدور پیام از گردانندهٔ except راهنمایی می‌گرفت. پیش‌تر با except بدون نوع مانند یک نادیده‌گیری تمام‌عیار رفتار می‌شد، در حالی که تنها استثناهای متناظر باید به آن روش مدیریت شوند (مانند NameError یا ImportError).

    بسته شد #3235

  • عدم صدور assignment-from-no-return هنگامی که یک تابع صرفاً یک استثنا برمی‌انگیزد (raise می‌کند)

    بسته شد #3218

  • مجاز شمردن نام‌های مستعار واردسازی (import aliases) برای معافیت از import-error هنگام استفاده در حاشیه‌نویسی‌های نوع (type annotations).

    بسته شد #3178

  • معاف شدن Ellipsis` از ``multiple-statements برای سربارگذاری توابع (function overloads).

    بسته شد #3224

  • عدم صدور invalid-name برای متغیرهای غیرثابت یافت‌شده در سطح ماژول.

    نرم‌افزار Pylint عبارت زیر از PEP-8 را بیش از حد تعمیم داده بود و تمام متغیرهای سطح ماژول را به عنوان ثابت در نظر می‌گرفت، که این منظورِ این عبارت نبود:

    ثابت‌ها معمولاً در سطح ماژول تعریف می‌شوند و با حروف تمام‌بزرگ که با خط زیرین کلمات را جدا می‌کند نوشته می‌شوند.

    بسته شد #3111 بسته شد #3132

  • اجازه صدور implicit-str-concat-in-sequence برای الحاق مجاورتی رشته‌ها (string juxtaposition)

    بسته شد #3030

  • نام implicit-str-concat-in-sequence به implicit-str-concat تغییر یافت
  • گزارشگر json دیگر redirect_stdout را دور نمی‌زند.

    بسته شد #3227

  • انتقال NoFileError، OutputLine، FunctionalTestReporter، FunctionalTestFile، LintModuleTest و متدهای مرتبط از test_functional.py به pylint.testutils جهت تسهیل آزمون افزونه‌های شخص ثالث pylint.
  • امکان خواندن پیکربندی از یک فایل setup.cfg یا pyproject.toml.

    بسته شد #617

  • رفع مثبت کاذب در exception-escape هنگام استفاده از مولدها (generators)

    بسته شد #3128

  • تابع inspect.getargvalues دیگر به عنوان منسوخ علامت‌گذاری نمی‌شود.
  • بررسی جدید f-string-without-interpolation اضافه شد

    بسته شد #3190

  • نشانه‌گذاری ابزارهای تغییرپذیر collections.* به عنوان مقادیر پیش‌فرض خطرناک

    بسته شد #3183

  • پشتیبانی افزونهٔ docparams از انواع چندگانه در بخش‌های raises.

    همچنین در تمام بخش‌های معتبر، می‌توان چندین نوع را با کاما از هم جدا کرد.

    بسته شد #2729

  • امکان تحلیل موازی کد (linting) هنگام اجرا تحت Prospector
  • رفع مثبت‌های کاذب method-hidden هنگامی که یک زیرکلاس متدی را که پنهان می‌شود تعریف می‌کند.

    بسته شد #414

  • حالت انتقال به پایتون ۳ در بیشتر پایگاه‌های کد ۳۰ تا ۵۰ درصد سریع‌تر شده است
  • حالت انتقال به پایتون ۳ دیگر خطاهای نحوی (syntax errors) را نادیده نمی‌گیرد

    بسته شد #2956

  • ارسال شیء واقعی PyLinter به زیرفرآیندها جهت امکان استفاده از کلاس‌های سفارشی PyLinter.

    شیء PyLinter (و تمام اعضای آن به جز reporter) باید از فرآیند pickling پشتیبانی کند تا بتوان شیء PyLinter را به فرایندهای کارگر (worker) منتقل کرد.

  • پاک‌سازی setup.py

    الزام‌آور کردن pytest-runner تنها در صورت اجرای آزمون‌ها، مشابه با McCabe.

    پاک‌سازی فایل setup.py و رفع تعدادی از هشدارهای مربوط به آن.

  • مدیریت SyntaxError در فایل‌هایی که از طریق گزینهٔ --from-stdin ارسال می‌شوند

    اگر فایلی که از ورودی استاندارد (stdin) خوانده می‌شود حاوی syntaxerror باشد، Pylint دیگر traceback نمایش نمی‌دهد.

  • اصلاح سبک حروف بزرگ برای عدم اجازه به ۳ یا بیشتر حرف بزرگ که در ادامه حرف کوچک داشته باشند.
  • رفع مثبت‌های کاذب undefined-variable و unused-import هنگام استفاده از یک متاکلاس از طریق یک مشخصه (attribute).

    بسته شد #1603

  • صدور unused-argument برای توابعی که قبل از برانگیختن استثنا، تنها بخشی از فهرست آرگومان‌های خود را استفاده می‌کنند.

    بسته شد #3246

  • اصلاح افزونهٔ broad_try_clause برای بررسی دستورهای try/finally و بررسی دستورهای تودرتو (به عنوان مثال، درون یک دستور if).
  • شناسایی کلاس‌هایی که به‌طور صریح از abc.ABC ارث‌بری دارند یا دارای متاکلاس abc.ABCMeta هستند به عنوان کلاس انتزاعی. این امر مانع از فعال شدن هشدار W0223 توسط آن‌ها می‌شود.

    بسته شد #3098

  • رفع حساسیت بیش از حد arguments-differ هنگامی که تابع بازنویسی‌شده از آرگومان‌های متغیر (variadics) استفاده می‌کند

    در صورتی که تابع بازنویس‌کننده در امضای خود آرگومان‌های متغیر ترتیبی (positional) یا کلیدواژه‌ای (keyword) ارائه دهد که بتوانند به‌طور معقول همه پارامترهای داده‌شده توسط تابع بازنویسی‌شده را بپذیرند و انتقال دهند، هیچ پیامی صادر نمی‌شود.

    بسته شد #1482 بسته شد #1553

  • انواع مختلف قالب‌بندی رشته‌ها در توابع لاگ‌گیری (logging) مجاز است.

    پیام logging-fstring-interpolation مجدداً بازگردانده شده است تا امکان استفاده از چندین نوع قالب‌بندی رشته فراهم شود.

    بسته شد #3361

    از ابتدای pylint تا نسخهٔ 2.14.0 (به‌همراه آن)، یک گزارش تغییرات (changelog) وجود داشت که دربردارندهٔ تمام تغییرات غیربدیهی در Pylint بود؛ از جمله تغییراتی که مربوط به سمت کاربر نبودند، یعنی تغییراتی که تنها اگر توسعه‌دهندهٔ فعال روی pylint یا افزونه‌های آن و یا تاریخ‌نگار متن‌باز باشید ممکن است برایتان جذاب باشد.

    از pylint 1.6.0 تا 2.14.0، علاوه بر گزارش تغییرات کامل، خلاصه‌ای از تغییرات (عمدتاً سمت کاربر) نیز وجود داشت.

  • import-outside-toplevel

    این بررسی زمانی هشدار می‌دهد که ماژول‌ها از جایی غیر از بالاترین سطح ماژول (toplevel)، مثلاً درون یک تابع یا کلاس وارد (import) شوند.

  • بررسی جدیدی افزوده شد: consider-using-sys-exit

    این بررسی زمانی صادر می‌شود که تشخیص داده شود به جای sys.exit() که روش ترجیحی برای خروج از برنامه است، quit() یا exit() فراخوانی شده است.

    بسته شد #2925

  • بررسی جدیدی افزوده شد: arguments-out-of-order

    این بررسی زمانی هشدار می‌دهد که آرگومان‌هایی با نام‌های منطبق با امضای تابع داشته باشید، اما آن‌ها را با ترتیبی متفاوت به تابع ارسال کنید.

    بسته شد #2975

  • بررسی‌های جدیدی افزوده شدند: no-else-break و no-else-continue

    این بررسی‌ها بلوک‌های غیرضروری else و elif را پس از دستورهای break و continue مشخص می‌کنند.

    بسته شد #2327

  • بررسی unnecessary-comprehension افزوده شد که ساخت‌های درک (comprehension) غیرضروری را تشخیص می‌دهد.

    این بررسی زمانی صادر می‌شود که pylint ساخت‌های list-comprehension، set-comprehension یا dict-comprehension غیرضروری را پیدا کند که می‌توان آن‌ها را با سازنده‌های list، set یا dict بازنویسی کرد.

    بسته شد #2905

  • بررسی جدیدی افزوده شد: invalid-overridden-method

    این بررسی زمانی صادر می‌شود که تشخیص داده شود یک متد به عنوان property یا یک property به عنوان متد بازنویسی (override) شده است. این موضوع می‌تواند نشان‌دهندهٔ باگی در کد برنامه باشد که خطای زمان اجرا (runtime error) ایجاد می‌کند.

    بسته شد #2670

  • بررسی جدیدی افزوده شد: redeclared-assigned-name

    این بررسی زمانی صادر می‌شود که pylint تشخیص دهد یک نام در همان انتساب یک یا چند بار مقداردهی شده است که نشان‌دهندهٔ یک باگ احتمالی است.

    بسته شد #2898

  • بررسی جدیدی افزوده شد: self-assigning-variable

    این بررسی زمانی صادر می‌شود که متغیر به خودش منتسب شود، که ممکن است نشان‌دهندهٔ یک باگ احتمالی در کد برنامه باشد.

    برای مثال، کد زیر این هشدار را ایجاد می‌کند:

def new_a(attr, attr2):
  a_inst = Aclass()
  a_inst.attr2 = attr2
  # should be: a_inst.attr = attr, but have a typo
  attr = attr
  return a_inst

بسته شد #2930

  • بررسی جدید property-with-parameters افزوده شد که داشتن بیش از یک آرگومان در یک property را تشخیص می‌دهد.

    بسته شد #3006

  • بررسی subprocess-run-check برای مدیریت subprocess.run بدون تعیین صریح کلمهٔ کلیدی check افزوده شد.

    بسته شد #2848

  • پیام بررسی جدید dict-iter-missing-items افزوده شد. این پیام هنگام تلاش برای پیمایش روی یک dict در یک حلقهٔ for بدون فراخوانی متد .items() آن صادر می‌شود.

    بسته شد #2761

  • پیام بررسی جدید missing-parentheses-for-call-in-test افزوده شد. این پیام در صورتی صادر می‌شود که فراخوانی یک تابع درون یک آزمون (test) انجام شود اما پرانتزهای آن جا افتاده باشد.
  • بررسی جدید class-variable-slots-conflict افزوده شد.

    این بررسی زمانی صادر می‌شود که pylint متغیر کلاسی را بیابد که با یک نام slot تداخل دارد، که در زمان اجرا موجب برانگیختن ValueError می‌شود.

    برای مثال، کد زیر موجب بروز خطا می‌شود:

class A:
    __slots__ = ('first', 'second')
    first = 1
  • بررسی جدید preferred-module افزوده شد.

    این بررسی زمانی صادر می‌شود که pylint ماژول واردشده‌ای را پیدا کند که جایگزین ترجیح‌داده‌شده‌ای برای آن در preferred-modules فهرست شده است.

    برای نمونه، می‌توانید ماژول‌های ترجیحی را به صورت xml:defusedxml,json:ujson تنظیم کنید تا pylint استفاده از defusedxml به جای xml و ujson را به جای json پیشنهاد دهد.

  • افزونهٔ جدید broad_try_clause اضافه شد.

    این افزونه حداکثر تعداد قابل‌پیکربندی از دستورها را در درون یک بند try اعمال می‌کند. این امر اعمال رهنمودهای PEP 8 را دربارهٔ دستورهای try / except و حجم کد درون بند try تسهیل می‌کند.

    می‌توانید این افزونه را با استفاده از --load-plugins=pylint.extensions.broad_try_clause فعال کنید و تعداد دستورها را در یک عبارت try با استفاده از --max-try-statements پیکربندی نمایید.

  • عدم صدور protected-access زمانی که یک مشخصه با پیشوند تک خط زیرین درون یک متد ویژه استفاده می‌شود

    بستن مسئله #1802

  • اکنون len-as-condition تنها زمانی فعال می‌شود که فراخوانی len(x) بدون یک مقایسه صریح انجام شده باشد.

    پیام و توضیحات مربوط به این بررسی‌کننده برای انعکاس این رفتار جدید تغییر کرده است؛ با درخواست صریح مبنی بر این که یا بر نادرست (false) ارزیابی شدن دنباله‌های خالی تکیه شود یا طول دنباله با یک مقدار عددی (اسکالر) مقایسه گردد.

    OK:

if len(x) == 0:
  pass
while not len(x) == 0:
  pass
assert len(x) > 5, message

KO:

if not len(x):
  pass
while len(x) and other_cond:
  pass
assert len(x), message
  • اکنون در صورتی که پرچم --from-stdin در خط فرمان استفاده شود، فایل از stdin خوانده می‌شود. علاوه بر پرچم --from-stdin، باید نام یک فایل (تکی) نیز در خط فرمان مشخص شود که برای گزارش مورد نیاز است.
  • بررسی‌کننده برای وارد کردن‌های گروه‌بندی‌نشده (ungrouped imports) اکنون آسان‌گیرتر شده است.

اکنون موارد وارد کردن (import) می‌توانند بر اساس شیوه وارد کردن به‌صورت الفبایی مرتب شوند. این امر pylint را با isort سازگار می‌کند.

موارد وارد کردن زیر دیگر خطای ungrouped-imports را فعال نمی‌کنند

import unittest
import zipfile
from unittest import TestCase
from unittest.mock import MagicMock
•
بررسی‌کننده برای مستندات بازگشتی ناموجود (missing return documentation) اکنون انعطاف‌پذیرتر است.

مورد زیر دیگر خطای missing-return-doc را فعال نمی‌کند

def my_func(self):
    """This is a docstring.
    Returns
    -------
    :obj:`list` of :obj:`str`
        List of strings
    """
    return ["hi", "bye"] #@
•
گزینهٔ خط فرمان و پیکربندی signature-mutators اضافه شد.

با این گزینه، کاربران می‌توانند نادیده گرفتن خطاهای too-many-function-args، unexpected-keyword-arg و no-value-for-parameter را برای توابعی که با تزیین‌کننده‌های تغییردهندهٔ امضای تابع تزیین شده‌اند، انتخاب کنند.

برای نمونه، یک آزمون ممکن است بخواهد از hypothesis استفاده کند. اضافه کردن hypothesis.extra.numpy.arrays به signature_mutators به این معنا خواهد بود که no-value-for-parameter برای قطعه کد زیر ایجاد نمی‌شود:

@given(img=arrays(dtype=np.float32, shape=(3, 3, 3, 3)))
def test_image(img):
    ...
•
امکان استفاده از f-strings به عنوان یک روش معتبر قالب‌بندی رشته‌های لاگ‌گیری (logging) فراهم شد.

بررسی‌کنندهٔ logging-fstring--interpolation در logging-format-interpolation ادغام شده است تا گزینهٔ logging-format-style بتواند معتبر بودن سبک قالب‌بندی رشته لاگ را کنترل کند. برای فعال‌سازی این قابلیت، مقدار جدید fstr برای گزینهٔ logging-format-style معتبر است.

•
دستور --list-msgs-enabled اضافه شد.

هنگام فعال یا غیرفعال کردن چندین پیام و گروه در یک فایل پیکربندی، ممکن است مشخص نباشد که در عمل کدام پیام‌ها فعال و کدام غیرفعال هستند. این دستور جدید فهرست نهایی و حل‌وفصل‌شدهٔ پیام‌های فعال/غیرفعال را تولید می‌کند که بر اساس نماد مرتب شده‌اند، اما شناسه (ID) آن‌ها نیز برای استفاده با --help-msg ارائه می‌شود..SS تغییرات کامل (Full changelog)

تاریخ انتشار: 2019-11-13

  • معاف شدن تمام نام‌های یافت‌شده در حاشیه‌نویسی‌های نوع (type annotations) از unused-import

    کد پیشین فرض می‌کرد که تنها نام‌های typing باید معاف شوند، اما لازم است این کار برای سایر نام‌های موجود در کامنت‌های نوع نیز انجام شود.

    بستن #3112

  • تسهیل شناسایی وارد کردن نوع (type import) برای نام‌هایی که از ماژول typing نمی‌آیند

    بستن #3191

تاریخ انتشار: 2019-10-18

  • رفع اشکال unnecessary-comprehension در comprehensionهایی که دارای بسته‌بندی مجدد (repacking) مضاعف عناصر هستند.

    بستن #3148

  • پیام import-outside-toplevel برای گره‌های ImportFrom نیز صادر می‌شود.

    بستن #3175

  • عدم صدور no-method-argument برای توابعی که صرفاً از آرگومان‌های مکانی (positional-only) استفاده می‌کنند.

    بستن #3161

  • پیام consider-using-sys-exit در صورت وارد شدن exit در حوزه محلی، دیگر صادر نمی‌شود.

    بستن #3147

  • بررسی invalid-overridden-method اکنون abc.abstractproperty را نیز در نظر می‌گیرد.

    بستن #3150

  • رفع مشکل ایجاد نادرست هشدار missing-yield-type-doc هنگامی که یک مولد (generator) نوع yield را مستند نکرده اما دارای حاشیه‌نویسی نوع است.

    بستن #3185

  • توابع typing.overload از بررسی too-many-function-args معاف شدند.

    بستن #3170

تاریخ انتشار: 2019-09-30

  • گزینه ignored-modules می‌تواند زیرماژول‌ها را نیز نادیده بگیرد.

    بستن #3135

  • بررسی self-assigning-variable انتساب‌های سطح کلاس را نادیده می‌گیرد.

    بستن #2930

  • در صورت وارد کردن exit() از sys، از صدور consider-using-sys-exit صرف‌نظر می‌شود.

    بستن #3145

  • معافیت انتساب‌های دارای حاشیه‌نویسی بدون متغیر از بررسی class-variable-slots-conflict

    بستن #3141

  • اصلاح utils.is_error برای در نظر گرفتن توابعی که خروج زودهنگام (return early) دارند.

    این تغییر یک خطای منفی کاذب (false negative) را در unused-variable برطرف می‌کند؛ در حالتی که یک تابع در آخرین دستور خود استثنایی صادر می‌کرد اما همچنان متغیرهای استفاده‌نشده‌ای در بدنه داشت، این هشدار پیش‌تر فعال نمی‌شد.

    بستن #3028

    تاریخ انتشار: 2019-09-25

  • مستثنی کردن تعاریف بررسی نوع (type checking) که در هر دو بند از یک محافظ بررسی نوع (type checking guard) تعریف شده‌اند.

    بسته شدن گزارش #3127

  • مستثنی کردن تعاریف بررسی نوع درون محافظ بررسی نوع.

    در کامیت a7f236528bb3758886b97285a56f3f9ce5b13a99 پشتیبانی اولیه‌ای برای صدور هشدار used-before-assignment در صورتی که یک متغیر تنها درون یک محافظ بررسی نوع (با استفاده از متغیر TYPE_CHECKING از ماژول typing) تعریف شده باشد اضافه شد. متأسفانه این مورد، استفاده از واردات (import) بررسی نوع را در داخل خودِ محافظ پوشش نداده بود، که موجب ایجاد خطاهای کاذب used-before-assignment / E0601 <#used-before-assignment> می‌شد.

    بسته شدن گزارش #3119

  • الزام به astroid >= 2.3 جهت جلوگیری از هرگونه مشکل ناسازگاری.

تاریخ انتشار: 2019-09-24

  • بررسی جدید: import-outside-toplevel

    این بررسی زمانی هشدار می‌دهد که ماژول‌ها از جایی غیر از بالاترین سطح ماژول (toplevel)، مثلاً درون یک تابع یا کلاس وارد (import) شوند.

  • مدیریت ابهام در استنتاج (inference ambiguity) برای invalid-format-index

    بسته شدن گزارش #2752

  • حذف بررسی‌های مخصوص Python 2 مانند relative-import، invalid-encoded-data و missing-super-argument.
  • پشتیبانی از ارجاعات رو به جلو (forward references) برای بررسی function-redefined.

    بسته شدن گزارش #2540

  • مدیریت تعریف‌های مجدد در واردات (import) بررسی نوع.

    بسته شدن گزارش #2834

  • افزودن بررسی جدید، consider-using-sys-exit

    این بررسی زمانی صادر می‌شود که فراخوانی quit() یا exit() به جای sys.exit() شناسایی شود؛ در حالی که sys.exit() روش ترجیحی برای خروج از برنامه است.

    بسته شدن گزارش #2925

  • بررسی useless-suppression اکنون نادیده‌گیری‌های cyclic-import را نادیده می‌گیرد؛ زیرا به دلیل ناقص بودن بافتار (context) در هنگام بررسی، ممکن بود منجر به موارد مثبت کاذب شود.

    بسته شدن گزارش #3064

  • افزودن بررسی‌های جدید، no-else-break و no-else-continue

    این بررسی‌ها بلوک‌های غیرضروری else و elif پس از دستورهای break و continue را مشخص می‌کنند.

    بسته شدن گزارش #2327

  • عدم صدور protected-access هنگامی که مشخصه‌ای با پیشوند تک زیرخط (underscore) درون یک متد خاص استفاده شده باشد.

    بسته شدن گزارش #1802

  • اصلاح مقادیر "statement" در گزارش‌های آماری PyLinter بر اساس ماژول.
  • افزودن بررسی جدید، invalid-overridden-method

    این بررسی زمانی صادر می‌شود که بازنویسی (override) یک متد به عنوان property یا یک property به عنوان متد تشخیص داده شود. این حالت می‌تواند نشان‌دهندهٔ باگی در کد برنامه باشد که خطای زمان اجرا ایجاد می‌کند.

    بسته شدن گزارش #2670

  • افزودن بررسی جدید، arguments-out-of-order

    این بررسی زمانی هشدار می‌دهد که نام آرگومان‌ها با امضای تابع مطابقت دارد ولی با ترتیبی متفاوت به تابع ارسال می‌شوند.

    بسته شدن گزارش #2975

  • افزودن بررسی جدید، redeclared-assigned-name

    این بررسی زمانی صادر می‌شود که pylint تشخیص دهد یک نام یک یا چند بار در یک انتساب یکسان مقداردهی شده است که نشان‌دهندهٔ یک باگ بالقوه است.

    بسته شدن گزارش #2898

  • نادیده گرفتن فراخوانی‌های lambda با آرگومان‌های متغیر (variadic) بدون بافتار (context).

    استنتاج آرگومان‌های موضعی متغیر و آرگومان‌های کلیدواژه‌ای منجر به تاپل‌ها (Tuples) و دیکشنری‌های (Dicts) خالی می‌شود که می‌تواند در برخی موارد منجر به مثبت‌های کاذب در رابطه با no-value-for-parameter / E1120 <#no-value-for-parameter> گردد. برای جلوگیری از این امر، تا زمانی که از انتشار بافتار فراخوانی (call context propagation) پشتیبانی شود، در صورت شناسایی چنین مواردی آن‌ها را نادیده می‌گیریم. ما قبلاً این کار را برای فراخوانی توابع انجام داده بودیم، اما اصلاح قبلی lambdas را در نظر نگرفته بود.

    بسته شدن گزارش #2918

  • افزودن بررسی جدید، self-assigning-variable. این بررسی زمانی صادر می‌شود که تشخیص داده شود یک متغیر به خودش منتسب شده است، که ممکن است نشان‌دهندهٔ باگی بالقوه در کد برنامه باشد.

    بسته شدن گزارش #2930

  • افزودن بررسی جدید، property-with-parameters.

    این بررسی زمانی صادر می‌شود که تشخیص داده شود یک property تعریف‌شده دارای پارامترهایی است که بی‌استفاده هستند.

    بسته شدن گزارش #3006

  • مستثنی کردن کلاس‌های پروتکل (protocol classes) از چندین بررسی.

    بسته شدن گزارش #3002.

  • افزودن بررسی unnecessary-comprehension برای تشخیص comprehensionهای غیرضروری.

    این بررسی زمانی صادر می‌شود که pylint عبارت‌های list-، set- یا dict-comprehension غیرضروری را بیابد که می‌توانند با سازنده‌های list-، set- یا dict بازنویسی شوند.

    بسته شدن گزارش #2905

  • مستثنی کردن متغیرهای نمونه (instance) و کلاسِ PEP 526 از بررسی no-member.

    بسته شدن گزارش #2945

  • مستثنی کردن attrs از بررسی too-few-public-methods.

    بسته شدن گزارش #2988.

  • صدور unused-import برای نام‌های واردات صحیح در محدوده‌های (scopes) تابع.

    بسته شدن گزارش #2928

  • پایان پشتیبانی از Python 3.4.
  • عدم فعال‌سازی assignment-from-no-return برای متدهای ناهمگام (async).

    بسته شدن گزارش #2902

  • عدم صدور attribute-defined-outside-init برای متغیرهای تعریف‌شده در setterها.

    بسته شدن گزارش #409

  • گزارش شماره ستون برای خطاهای نحوی (Syntax errors).

    بسته شدن گزارش #2914

  • پشتیبانی از واردات نام کامل (fully qualified) از typing برای حاشیه‌نویسی نوع (type annotations).

    بسته شدن گزارش #2915

  • مستثنی کردن __dict__ از attribute-defined-outside-init
  • اصلاح نشانگر بررسی املا زمانی که خطا بیش از یک بار در همان خط رخ می‌دهد.

    بسته شدن گزارش #2895

  • رفع خطای منجر به خرابی (crash) زمانی که والد شیء فراخوانی‌شده قابل تعیین نیست.
  • مجاز دانستن of در GoogleDocstring.re_multiple_type
  • افزودن subprocess-run-check برای مدیریت subprocess.run بدون تعیین صریح کلیدواژهٔ check.

    بسته شدن گزارش #2848

  • هنگامی که دستگیره‌های except لخت (bare except handlers) قابل استنتاج نیستند، نادیده گرفتن try-except-raise

    بسته شدن گزارش #2853.IP • 2 مدیریت موارد بیشتری از unnecessary-lambda هنگام کار با kwargs اضافی در فراخوانی‌های محصورشده (wrapped calls)

    بستن #2845

  • بهبود مدیریت ارزیابی به تعویق‌افتادهٔ یادداشت‌ها (postponed evaluation of annotations)

    بستن #2847

  • پشتیبانی از ارزیابی به تعویق‌افتادهٔ یادداشت‌ها برای یادداشت‌های متغیرها.

    بستن #2838

  • در صورتی که فایل اجرایی جاری یک مفسر پایتون نباشد، epylint.py_run به‌طور پیش‌فرض از python استفاده می‌کند.

    بستن #2837

  • نادیده گرفتن docstringهای خام هنگام اجرای بررسی‌کنندهٔ Similarities با گزینهٔ ignore-docstrings=yes
  • رفع خرابی و کرش هنگام فراخوانی inherit_from_std_ex روی کلاسی که نیاکان خودش است

    بستن #2680

  • افزودن یک بررسی جدید که اگر فراخوانی تابعی درون یک آزمون به کار رود اما فاقد پرانتز باشد، به کاربر هشدار می‌دهد.

    بستن #2658

  • بررسی len-as-condition اکنون تنها زمانی فعال می‌شود که فراخوانی len(x) بدون مقایسه‌ای صریح انجام شده باشد

    پیام و توضیحات ارائه‌شده همراه با این بررسی‌کننده برای بازتاب این رفتار جدید تغییر کرده است؛ با درخواست صریح مبنی بر این‌که یا به نادرست بودن (false) دنباله‌های خالی تکیه شود یا طول با یک مقدار اسکالر مقایسه گردد.

    بستن #2684

  • افزودن بررسی‌کنندهٔ preferred-module که در صورت وجود یک ماژول جایگزین مناسب که باید استفاده شود، اطلاع می‌دهد.

    این بررسی زمانی صادر می‌شود که pylint یک ماژول واردشده را بیابد که جایگزین ترجیحی آن در preferred-modules فهرست شده است.

  • عدم صدور assigning-non-slot برای کلاس‌هایی با کلاس‌های پایهٔ ناشناخته.

    بستن #2807

  • عدم صدور old-division برای گره‌های غیر Const.

    بستن #2808

  • افزودن آرگومان‌های متد به نویسندهٔ dot برای pyreverse.

    بستن #2139

  • پشتیبانی از تحلیل کد (linting) فایل از طریق stdin.

    محیط‌های توسعه یکپارچه (IDEها) ممکن است از پشتیبانی بررسی کد از یک فایل درون‌حافظه‌ای بهره‌مند شوند.

    بستن #1187

  • افزودن بررسی جدید class-variable-slots-conflict

    این بررسی هنگامی صادر می‌شود که pylint متغیر کلاسی را بیابد که با یک نام slot تداخل دارد؛ چیزی که در زمان اجرا موجب برانگیختن خطای ValueError می‌شود.

  • افزودن بررسی جدید: dict-iter-missing-items / E1141 <#dict-iter-missing-items> (E1141)

    بستن #2761

  • رفع مشکل نام pylint در خروجی python -m pylint --version

    بستن #2764

  • تغییر مجوز اقلام لوگو و نشان‌ها به مجوز CC BY-SA 4.0.
  • صرف‌نظر کردن از عبارت‌های if از f-stringها برای بررسی‌کنندهٔ check_elif

    بستن #2816

  • کد C0412 (ungrouped-import) اکنون با isort سازگار است.

    بستن #2806

  • افزودن افزونه‌ای جدید برای تشخیص کد بیش از اندازه در یک بند try

    بستن #2877

  • گزینهٔ signature-mutators اضافه شد. با این گزینه، کاربران می‌توانند نادیده‌گرفتن هشدارهای too-many-function-args، unexpected-keyword-arg و no-value-for-parameter را برای توابعی که با دکوراتورهای تغییردهندهٔ امضای تابع تزئین شده‌اند، انتخاب کنند.

    بستن #259

  • رفع نادیده‌گرفته‌شدن کامنت pragma در خط فیزیکی مستقل، هنگامی که بخشی از یک خط منطقی به همراه خط فیزیکی پیشین بود.

    بستن #199

  • رفع مثبت کاذب undefined-loop-variable برای تابعی که درون حلقه تعریف شده و از متغیر تعریف‌شده در همان حلقه استفاده می‌کند.

    بستن #202

  • رفع صدور هشدارهای unused-argument و function-redefined برای توابعی که با typing.overload تزئین شده‌اند.

    بستن #1581

  • رفع مثبت کاذب در consider-using-dict-comprehension برای ساختارهایی که نمی‌توانند به یک comprehension تبدیل شوند

    بستن #2963

  • افزودن __post_init__ به defining-attr-methods به منظور جلوگیری از attribute-defined-outside-init در dataclassها.

    بستن #2581

  • تغییر توضیحات W0199 برای استفاده از عبارت 2-item-tuple به جای 2-uple.
  • مجاز کردن . به عنوان پیشوند برای تفکیک نام Sphinx.
  • بررسی‌کننده‌ها اکنون باید رابطهٔ یک‌به‌یک را میان "msgid" (مانند: C1234) و "symbol" (مانند: human-readable-symbol) حفظ کنند
  • در بررسی‌کننده‌ها، یک old_names اکنون می‌تواند برای چندین پیام جدید استفاده شود و pylint اکنون کمی سریع‌تر شده است

    این بدان معناست که اگر یک old_names جزئی برای تعریف پیام تعریف کنید، یک استثنا به شما اعلام خواهد کرد که باید شناسهٔ مرتبط را تغییر نام دهید.

  • امکان انتخاب f-stringها به عنوان روشی معتبر برای قالب‌بندی رشته‌های ثبت گزارش (logging).

    بستن #2395

  • افزودن دستور --list-msgs-enabled برای فهرست کردن تمام پیام‌های فعال و غیرفعال با توجه به فایل RC جاری و آرگومان‌های خط فرمان.

    از آغاز pylint تا نگارش 2.14.0 به‌طور کامل، گزارش تغییراتی وجود داشت که شامل تمام تغییرات غیرجزئی در Pylint می‌شد؛ از جمله تغییراتی که کاربر با آن‌ها مواجه نمی‌شد؛ یعنی تغییراتی که ممکن بود تنها برای توسعه‌دهندگانی که روی pylint یا پلاگین‌های آن کار می‌کنند یا تاریخ‌نگاران متن‌باز جالب باشند.

    از نگارش 1.6.0 تا 2.14.0 در pylint، علاوه بر گزارش کامل تغییرات، خلاصه‌ای از تغییرات (عمدتاً مرتبط با کاربر) نیز وجود داشت.

•
این انتشار، عملکرد سری 2.X را پس از افت کارایی رخ‌داده در چند نگارش پیشین بهبود می‌بخشد.

  • پیام بررسی جدید wrong-exception-operation اضافه شد. این پیام زمانی صادر می‌شود که عملیاتی روی یک استثنا انجام شود، اما آن عملیات برای استثنای مذکور معتبر نباشد. معمولاً هنگام وجود عملیات دوتایی میان استثناها در گرداننده‌های except صادر می‌شود.

    بستن #2494

  • هشدار جدید no-else-raise مشابه no-else-return اضافه شد

    بستن #2558

  • گزینه جدید check-str-concat-over-line-jumps برای بررسی implicit-str-concat-in-sequence در چندین خط اضافه شد.

شمار فراوانی رفع اشکال و بهبود در این انتشار گنجانده شده است، که در اینجا به چند مورد از آن‌ها اشاره می‌شود. برای مشاهده تمام تغییرات، گزارش کامل تغییرات را بررسی کنید.

  • دیگر هشدارهای بررسی *-not-iterating برای توابع توکاری که توسط itertools مصرف می‌شوند صادر نمی‌شود
  • برخی موارد مثبت کاذب برای no-self-argument و unsubscriptable-object هنگام استفاده از __class_getitem__ (جدید در Python 3.7) برطرف شد
  • اکنون pylint از Ellipsis به‌عنوان هم‌معنی برای دستورهای pass پشتیبانی می‌کند.
  • هشدار fixme تنها روی کامنت‌ها فعال می‌شود.
  • دستور pylint باز کردن بسته‌بندی با ستاره (starred unpacking) را از بررسی‌های Python 3 مربوط به *-not-iterating معاف می‌کند.
  • وارسی‌کننده compare-to-zero اکنون با بررسی برابری و همانی، سخت‌گیری کمتری اعمال می‌کند.

``yield from`` از بررسی‌های ``-not-iterating`` در Python 3 معاف شد.

  • یک مورد مثبت کاذب در not-async-context-manager ناشی از عدم درک contextlib.asynccontextmanager برطرف شد.
  • وارسی‌کننده bad-reversed-sequence برای در نظر گرفتن اشیای بیشتری که می‌توانند __reversed__ را تعریف کنند بازنویسی شد.
  • اکنون در صورت فقدان یک عضو در enumها، هشدار no-member صادر می‌شود.
  • پلاگین‌ها اکنون می‌توانند از قلاب load_configuration() استفاده کنند. این قلاب پس از بارگیری پیکربندی اجرا می‌شود تا از رونویسی پیکربندی ویژه پلاگین از طریق پیکربندی مبتنی بر کاربر جلوگیری شود.
  • یک گزینه خط فرمان جدید با نام list-groups برای فهرست کردن تمام گروه‌های وارسی که pylint می‌شناسد اضافه شده است. این گزینه برای آگاهی از اینکه چه گروه‌هایی را می‌توان به‌صورت جداگانه فعال یا غیرفعال کرد مفید است.

تاریخ انتشار: 2019-02-27

  • محافظت در برابر NonDeducibleTypeHierarchy هنگام فراخوانی is_subtype نیمه‌خصوصی

    تابع astroid.helpers.is_subtype زمانی که نتواند کلاس‌های پایه نوع‌های داده‌شده را استنتاج کند NonDeducibleTypeHierarchy را صادر می‌کند؛ اما این کار در بافتار خودش منطقی است، چرا که این متد بیشتر برای آگاه ساختن فرآیند استنتاج از سلسله‌مراتب کلاس‌ها استفاده می‌شود. اما برای خود pylint چندان منطقی نیست، به همین دلیل ما این استثنا را در اینجا مدیریت می‌کنیم و نه در astroid

    بستن pylint-dev/astroid#644

  • یک گزینه خط فرمان جدید با نام list-groups برای فهرست کردن تمام گروه‌های وارسی که pylint می‌شناسد اضافه شد.
  • امکان استفاده از BaseException برای صدور broad-except، دقیقاً مانند Exception فراهم شد.

    بستن #2741

  • رفع یک مورد کرش که برای bad-str-strip-call زمانی که strip() مقدار None را دریافت می‌کرد رخ می‌داد

    بستن #2743

  • عدم صدور بررسی‌های *-not-iterating برای توابع توکاری که توسط itertools مصرف می‌شوند

    بستن #2731

  • رفع خرابی ناشی از تکرار روی Uninferable در یک بررسی قالب‌بندی رشته.

    بستن #2727

  • رفع موارد مثبت کاذب برای no-self-argument و unsubscriptable-object هنگام استفاده از __class_getitem__ (جدید در Python 3.7)

    بستن #2416

  • پشتیبانی از Ellipsis به‌عنوان هم‌معنی برای دستورهای pass.

    بستن #2718

  • فعال شدن fixme فقط روی کامنت‌ها.

    بستن #2321

  • رفع یک مورد مثبت کاذب برای انتساب‌های unused-variable و nonlocal

    بستن #2671

  • افزودن قلاب load_configuration() برای پلاگین‌ها

    قلاب اختیاری جدیدی برای پلاگین‌ها افزوده شد: load_configuration(). این قلاب پس از بارگیری پیکربندی اجرا می‌شود تا از رونویسی پیکربندی ویژه پلاگین از طریق پیکربندی مبتنی بر کاربر جلوگیری شود.

    بستن #2635

  • رفع مثبت کاذب در missing-raises-doc / W9006 <#missing-raises-doc> (W9006)

    بستن #1502

  • معاف کردن باز کردن با ستاره از بررسی‌های Python 3 مربوط به *-not-iterating

    بستن #2651

  • کاهش حساسیت compare-to-zero از طریق بررسی برابری و همانی

    بستن #2645

  • افزودن هشدار no-else-raise (R1720)

    بستن #2558

  • معاف کردن yield from از بررسی‌های Python 3 مربوط به *-not-iterating.

    بستن #2643

  • رفع صدور نادرست هشدارهای no-else-return (R1705)

    مشکلی برطرف شد که در آن دستورهای if دارای دستورهای تو در توی if در مواردی به نادرستی با no-else-return نشانه‌گذاری می‌شدند و در موارد دیگر با no-else-return نشانه‌گذاری نمی‌شدند. آزمون‌هایی برای اعتبارسنجی اضافه شدند و فایل‌های مبدأ pylint برای رفع هشدارهای تازه آشکارشده به‌روزرسانی شدند.

  • رفع مثبت کاذب با not-async-context-manager ناشی از عدم درک contextlib.asynccontextmanager

    بستن #2440

  • بازنویسی bad-reversed-sequence برای پشتیبانی از اشیای بیشتری که می‌توانند __reversed__ را تعریف کنند

    یکی از این اشیا یک کلاس enum است که برای آن __reversed__ هر یک از اعضای enum را برمی‌گرداند. به این ترتیب، وارسی برای bad-reversed-sequence در هنگام بررسی وجود __reversed__ نباید تفاوتی میان کلاس‌ها و نمونه‌ها قائل شود.

    بستن #2598

  • افزودن wrong-exception-operation

    زمانی استفاده می‌شود که عملیاتی روی یک استثنا انجام شود، اما آن عملیات برای استثنای مربوطه معتبر نباشد. معمولاً هنگام وجود عملیات دوتایی میان استثناها در گرداننده‌های except صادر می‌شود.

    بستن #2494

  • صدور no-member برای enumها هنگامی که فاقد یک عضو باشند

    پیش از این، این کار را انجام نمی‌دادیم زیرا پیاده‌سازی __getattr__ را روی کلاس Enum شناسایی می‌کردیم (و این بررسی برای کلاس‌های دارای __getattr__ نادیده گرفته می‌شود)، اما این وضعیت برای Enumها مناسب است، با توجه به اینکه آن‌ها به روشی سفارشی‌شده در astroid استنتاج می‌شوند. بستن #2565

  • تعمیم chained-comparison

    نسخه پیشین به اشتباه a < b < c and b < d را تشخیص می‌داد و موفق به تشخیص a < b < c and c < d نمی‌شد.

  • جلوگیری از حذف __main__ هنگام استفاده از چندین پردازش (multiple jobs)

    بستن #2689

  • افزودن گزینه جدید 'check-str-concat-over-line-jumps' برای بررسی implicit-str-concat-in-sequence / W1403 <#implicit-str-concat-in-sequence>'
  • اصلاحاتی برای تحلیل‌گر قالب وقایع‌نگاری (logging) سبک جدید.

    تعداد آرگومان‌ها به درستی مدیریت نمی‌شد که منجر به موفقیت همیشگی بررسی می‌شد.

  • رفع مثبت کاذب not-callable برای ویژگی‌های (properties) غیرقابل استنتاج.
  • رفع مثبت کاذب useless-else-on-loop در صورتی که break در عمق else یک حلقه درونی باشد.
  • بهبودهای جزئی در متن راهنمای چند گزینه.

از ابتدای pylint تا نسخه 2.14.0 (شامل آن)، ما گزارش تغییراتی داشتیم که شامل تمام تغییرات غیرجزئی Pylint بود، از جمله تغییراتی که برای کاربران نهایی نبودند؛ یعنی تغییراتی که تنها اگر توسعه‌دهنده‌ای باشید که روی pylint یا افزونه‌های pylint کار می‌کنید یا یک تاریخ‌نگار متن‌باز هستید ممکن است برایتان جالب باشد.

از pylint 1.6.0 تا 2.14.0، علاوه بر گزارش تغییرات کامل، خلاصه‌ای از تغییرات (عمدتاً کاربرمحور) نیز وجود داشت.

  • بررسی‌کننده رشته اکنون عدم تطابق نوع در رشته قالب‌بندی را گزارش می‌کند.
  • بررسی‌کننده duplicate-string-formatting-argument برای تشخیص آرگومان‌های تکراری قالب‌بندی رشته اضافه شد که باید به جای آن به عنوان آرگومان‌های نام‌دار ارسال شوند.
  • گزینه logging-format-style یک گزینه جدید برای بررسی‌کننده وقایع‌نگاری جهت استفاده از رشته‌های قالب‌بندی به سبک ()str.format در فراخوانی‌های لاگر است.

    این گزینه دو حالت را می‌پذیرد: --logging-format-style=old برای استفاده از قالب‌بندی به سبک %، که پیش‌فرض در نظر گرفته شده است، و --logging-format-style=new برای استفاده از قالب‌بندی به سبک {}.

  • بررسی‌کننده implicit-str-concat-in-sequence الحاق رشته‌ها را درون لیست‌ها، مجموعه‌ها و تاپل‌ها تشخیص می‌دهد.

    نمونه کدی که چنین هشداری تولید می‌کند:

woops = ('a', 'b' 'c')

  • بررسی‌کننده try-except-raise اکنون سلسله‌مراتب وراثت چندسطحی را برای استثناها به درستی مدیریت می‌کند.

    بستن #2484

  • نادیده گرفتن موارد import x.y.z as z برای بررسی‌کننده useless-import-alias.
  • هشدار unnecessary-pass اکنون در صورتی که یک تابع یا کلاس تنها شامل docstring و دستور pass باشد نیز صادر می‌شود؛ چرا که در این حالت، docstring برای تعریف خالی کفایت می‌کند.
  • رفع مثبت کاذب undefined-variable و used-before-assignment هنگام استفاده از کلمه کلیدی nonlocal.
  • رفع رخ دادن استثناها در checkers.utils.is_subclass_of هنگامی که یکی از پارامترها ClassDef نباشد.
  • ابزار pylint اکنون هنگام بررسی raising-non-exception، آخرین مقدار را از میان مقادیر استنتاج‌شده استثنای برانگیخته‌شده انتخاب می‌کند. این موضوع هنگام استفاده مجدد از یک نام متغیر برای چند نوع مختلف کمک می‌کند، چرا که پیش‌تر pylint تنها نخستین مقدار استنتاج‌شده را انتخاب می‌کرد که منجر به مثبت‌های کاذب نادرست می‌شد.

    بستن #2431

  • ابزار pylint پیش‌تر هنگام بررسی هم‌روال‌های ساخته‌شده با asyncio.coroutine خطای not-an-iterable صادر می‌کرد. این مورد دیگر رخ نمی‌دهد زیرا هم‌روال‌ها به صورت صریح مدیریت می‌شوند.

    بستن #996

  • ابزار pylint در صورت وجود import استفاده‌نشده در تابع، خطای unused-variable صادر می‌کرد. اکنون به جای unused-variable، خطای unused-import صادر می‌شود.

    بستن #2421

تاریخ انتشار: 2018-11-28

•
تغییر logging-format-style به‌طوری که به‌جای شناسه‌های متناظر پایتونی، از شناسه نام استفاده کند

این کار برای بی‌نیاز کردن کاربران از فکر کردن درباره گریز (escape) دادن مقدار پیش‌فرض logging-format-style در فایل پیکربندی تولیدشده است. همچنین ابزارهای تحلیل پیکربندی ما هنگام تشخیص choices به‌طور کامل از مقادیر گریز داده‌شده پشتیبانی نمی‌کنند، بنابراین این موضوع نیازمند ترفندهای مختلفی برای دور زدن آن می‌بود.

بسته شدن #2614

تاریخ انتشار: 2018-11-27

•
رفع خرابی ناشی از implicit-str-concat-in-sequence و نویسه‌های چندبایتی.

بسته شدن #2610

تاریخ انتشار: 2018-11-25

  • در نظر گرفتن اشیاء range() برای undefined-loop-variable که از تکرار حلقه نشت می‌کند.

    بسته شدن #2533

  • deprecated-method می‌تواند از نام مشخصه برای شناسایی یک متد منسوخ‌شده استفاده کند
پیش از این ما از نام کاملاً مشخص‌شده (fully qualified name) استفاده می‌کردیم (که هنوز هم استفاده می‌کنیم)، اما نام کاملاً مشخص‌شده برای برخی نام‌های مستعار منسوخ‌شده‌ی unittest به یک تابع منسوخ‌سازی عمومی منتهی می‌شود. به‌جای اتکا به آن، اکنون به نام مشخصه نیز اتکا می‌کنیم، که باید برخی موارد مثبت کاذب را برطرف کند.
بسته شدن #1653 بسته شدن #1946
  • رفع ناسازگاری با تغییرات اعمال‌شده در توکن‌ساز stdlib.
  • pylint اشتیاق کمتری برای مصرف کل خط جهت پراگماها (pragmas) نشان می‌دهد

    بسته شدن #2485

  • دریافت تعداد صحیح پردازنده‌ها (CPUs) برای محیط‌های مجازی‌سازی‌شده یا کانتینری.

    بسته شدن #2519

  • بازگرداندن مجدد unbalanced-tuple-unpacking به وضعیت هشدار.
این مورد تا چند سال پیش یک هشدار بود، تا اینکه به یک خطا تبدیل شد. اما این بررسی ممکن است در برخی موارد پیشنهاد نادرستی ارائه دهد، به‌عنوان مثال هنگام بررسی در برابر sys.argv که در زمان تحلیل ایستا نمی‌توان آن را دانست. با توجه به اینکه ممکن است به داده‌های ناشناخته‌ی احتمالی وابسته باشد، بهتر است به‌صورت یک هشدار باقی بماند.
بسته شدن #2522
  • حذف پیشنهاد استفاده از enumerate هنگام تعریف __iter__ (C0200)

    بسته شدن #2477

  • صدور too-many-starred-assignment فقط زمانی که تعداد گره‌های Starred به‌ازای عناصر انتساب باشد

    بسته شدن #2513

  • بررسی‌کننده try-except-raise اکنون سلسله‌مراتب وراثت چندسطحی را برای استثناها به‌درستی مدیریت می‌کند.

    بسته شدن #2484

  • افزودن یک بررسی جدید، simplifiable-if-expression برای عبارت‌هایی مانند True if cond else False.

    بسته شدن #2487

  • too-few-public-methods برای typing.NamedTuple گزارش نمی‌شود

    بسته شدن #2459

  • `too-few-public-methods برای dataclassهایی که با گزینه‌ها ایجاد شده‌اند گزارش نمی‌شود.

    بسته شدن #2488

  • حذف ماژول‌های اشتباه از 'bad-python3-import'.

    بسته شدن #2453

  • گزارش‌دهنده json در صورتی که هیچ پیامی صادر نشود، یک فهرست خالی چاپ می‌کند

    بسته شدن #2446

  • افزودن یک بررسی جدید، duplicate-string-formatting-argument
این بررسی جدید هر زمان که یک آرگومان تکراری در قالب‌بندی رشته یافت شود، صادر می‌شود.
بسته شدن #497
  • assignment-from-no-return برای کوروتین‌ها صادر نمی‌شود.

    بسته شدن #1715

  • گزارش عدم تطابق نوع در رشته قالب‌بندی.
  • consider-using-ternary و simplified-boolean-expression دیگر برای بررسی‌های مبتنی بر دنباله صادر نمی‌شوند

    بسته شدن #2473

  • مدیریت AstroidSyntaxError هنگام تلاش برای وارد کردن یک ماژول.

    بسته شدن #2313

  • اجازه دادن به بازتعریف __module__ در سطح کلاس.

    بسته شدن #2451

  • قبلاً pylint اگر یک import استفاده‌نشده در تابع یافت می‌شد، خطای unused-variable صادر می‌کرد. اکنون به‌جای unused-variable، خطای unused-import صادر می‌شود.

    بسته شدن #2421

  • مدیریت asyncio.coroutine هنگام بررسی not-an-iterable.

    بسته شدن #996

  • بررسی locally-enabled حذف شده است.

    بسته شدن #2442

  • استنتاج متدهای آراسته‌شده (decorated methods) هنگام بررسی method-hidden

    بسته شدن #2369

  • انتخاب آخرین مقدار از مقادیر استنتاج‌شده هنگام جست‌وجو برای raising-non-exception

    بسته شدن #2431

  • گسترش محافظ TYPE_CHECKING به نام TYPE_CHECKING نیز، علاوه بر مشخصه‌ی آن

    بسته شدن #2411

  • نادیده گرفتن موارد import x.y.z as z برای بررسی‌کننده useless-import-alias.

    بسته شدن #2309

  • رفع مثبت کاذب در undefined-variable و used-before-assignment هنگام استفاده از کلیدواژه nonlocal.

    بسته شدن #2049

  • متوقف کردن استثنای protected-access برای مشخصه‌های ناموجود کلاس
  • عدم صدور assignment-from-no-return برای گره‌های توابع آراسته‌شده.sp بسته شد: #2385
  • اکنون پیام unnecessary-pass زمانی که یک تابع یا کلاس تنها شامل docstring و دستور pass باشد نیز صادر می‌شود.

    در پایتون، توابع ساختگی (stubbed) معمولاً بدنه‌ای دارند که فقط حاوی یک دستور pass است، که نشان می‌دهد تابع هیچ کاری انجام نمی‌دهد. با این حال، یک تابع ساختگی می‌تواند تنها یک docstring نیز داشته باشد، و تابعی با docstring و بدون بدنه نیز هیچ کاری انجام نمی‌دهد.

    بسته شد: #2208

  • پیام duplicate-argument-name برای بیش از یک آرگومان تکراری در هر تابع صادر می‌شود

    بسته شد: #1712

  • اجازه دادن به سطوح تورفتگی دوگانه برای تمایزپذیری بهتر تورفتگی‌ها

    بسته شد: #741

  • در نظر گرفتن تاپل‌ها در مدیریت‌کننده استثنا برای try-except-raise.

    بسته شد: #2389

  • اصلاح بررسی astroid.ClassDef در checkers.utils.is_subclass_of
  • رفع نادیده گرفته شدن واردسازی‌های عام (wildcard imports) توسط بازرس واردسازی
  • اصلاح اشکال در تمایز بین خارجی/داخلی در گراف واردسازی
  • اصلاح نادیده‌نگرفتن __init__.py در بررسی واردسازی‌های عام

    بسته شد: #2430

  • افزودن گزینه جدید logging_format_style به بازرس لاگ‌گیری
  • اصلاح --ignore-imports برای پشتیبانی و فهم واردسازی‌های چندخطی

    بسته شد: #1422 بسته شد: #2019

  • افزودن بررسی جدید 'implicit-str-concat-in-sequence' برای تشخیص الحاق رشته‌ها درون لیست‌ها، مجموعه‌ها و تاپل‌ها.
  • هشدار literal-comparison اکنون برای مقادیر مستقیم 0 و 1 نیز صادر می‌شود.

از آغاز pylint تا نسخه 2.14.0 (شامل آن)، ما یک گزارش تغییرات داشتیم که شامل تمام تغییرات غیرجزئی در Pylint می‌شد، از جمله تغییراتی که رو به کاربر نبودند، یعنی تغییراتی که تنها در صورتی ممکن بود برایتان جالب باشند که توسعه‌دهنده‌ای باشید که روی pylint یا افزونه‌های pylint کار می‌کند، یا یک تاریخ‌نگار پروژه‌های متن‌باز باشید.

از pylint 1.6.0 تا 2.14.0، علاوه بر گزارش تغییرات کامل، خلاصه‌ای از تغییرات (عمدتاً مرتبط با کاربر) نیز وجود داشت.

•
این انتشار عمدتاً شامل رفع اشکالاتی است که پس از عرضه 2.0 پیدا شده‌اند.

•
یک بررسی جدید افزوده شد: misplaced-format-function.

این پیام زمانی صادر می‌شود که pylint تشخیص دهد تابع format روی شیئی غیر از str فراخوانی شده است. این حالت می‌تواند به دلیل قرارگیری نادرست پرانتز بسته رخ دهد، مانند:

print('value: {}').format(123) # bad
print('value: {}'.format(123)) # good

  • بررسی try-except-raise در راستای مسئله #2323، از سطح خطا به هشدار تنزل یافت.
  • مدیریت صحیح نام جدید پیاده‌سازی پایتونی ماژول abc.

    در پایتون 3.7، ماژول abc هم دارای پیاده‌سازی C و هم پیاده‌سازی پایتون است، اما پیاده‌سازی پایتونی نام فایلی متفاوت با آنچه pylint انتظار داشت دارد که باعث سردرگمی برخی از بررسی‌ها می‌شد.

  • ماژول‌های دارای __getattr__ به طور پیش‌فرض از no-member معاف هستند

    راه ساده‌ای برای تشخیص اینکه آیا یک ماژول عضو خاصی دارد وجود ندارد، هنگامی که آن ماژول از __getattr__ استفاده می‌کند؛ قابلیتی که به تازگی به پایتون 3.7 اضافه شده است. در عوض، ما جانب احتیاط را رعایت می‌کنیم، همانند کاری که برای کلاس‌ها انجام می‌دهیم، و از بررسی آن ماژول‌ها صرف‌نظر می‌کنیم.

  • بررسی invalid name دیگر برای نام‌های توابع و مشخصه‌هایی که طولانی‌تر از ۳۰ کاراکتر باشند فعال نمی‌شود. حد بالا کاملاً حذف شد.
  • رفع مثبت کاذب در undefined-variable برای نام کلاس‌های خودارجاع در عبارات lambda
  • بررسی no-else-return نوع شاخه‌ای را که باعث ایجاد خطا شده است نیز مشخص می‌کند.
  • اصلاح رفتار ناسازگار برای bad-continuation در خط نخست فایل.
  • رفع باگی که در آن pylint قادر نبود پیام‌های مشخصی را در خط پایانی از طریق گزینه غیرفعال‌سازی سراسری غیرفعال کند.
  • ابزار pylint دیگر در حالتی که تنها یک عبارت منفرد بیابد که خود return است، useless-return را صادر نمی‌کند

    ما همچنان می‌خواهیم هنگامی که قرار است تابعی یک مقدار اختیاری را بازگرداند، صراحت حفظ شود؛ حتی با اینکه pass می‌تواند کار کند، اما به اندازه کافی صریح نیست و ممکن است تابع طوری به نظر برسد که انگار پیاده‌سازی آن فراموش شده است.

  • رفع باگی که در آن pylint هنگام ناتوانی در استنتاج مقدار یک آرگومان برای next() دچار فروپاشی می‌شد
  • ابزار pylint هنگام مواجهه با تکرارکننده‌های ناهمگام (async iterators) دیگر not-an-iterable را صادر نمی‌کند.
  • ابزار pylint امکان تعیین نوع پیش‌فرض docstring را برای مواقعی که بازرسی قادر به حدس زدن نوع نیست، به دست آورد

    برای این منظور، گزینه خط فرمان --default-docstring-type افزوده شد.

تاریخ انتشار: 2018-08-07

  • رفع خرابی pylint ناشی از عدم مدیریت صحیح ویژگی کلاس در misplaced-format-function.

    بسته شد #2384

  • عدم صدور *-builtin برای بررسی‌های توکار (builtin) در Python 3 زمانی که مورد توکار درون یک try-except استفاده شده باشد

    بسته شد #2228

  • عدم صدور simplifiable-if-statement هنگام کار با اندیس‌ها (subscripts)

تاریخ انتشار: 2018-08-01

  • پیام trailing-comma-tuple برای دستورهای yield نیز صادر می‌شود.

    بسته شد #2363

  • تنها دریافت آرگومان‌های تابع دامنه برای redefined-argument-from-local

    بسته شد #2364

  • افزودن بررسی misplaced-format-function که در صورت استفاده از تابع format روی شیئی غیر از str صادر می‌شود.

    بسته شد #2200

  • chain.from_iterable دیگر هنگام کار با مقادیر و کلیدهای dict، پیام dict-{}-not-iterating را صادر نمی‌کند
  • تنزل پیام try-except-raise از یک خطا به یک هشدار (E0705 -> W0706)

    بسته شد #2323

  • مدیریت صحیح نام جدید پیاده‌سازی پایتونی ماژول abc.

    بسته شد pylint-dev/astroid#2288

  • ماژول‌های دارای __getattr__ به‌طور پیش‌فرض از no-member معاف هستند

    راه ساده‌ای وجود ندارد تا مشخص شود آیا یک ماژول دارای عضو خاصی هست یا خیر، هنگامی که ماژول مذکور از __getattr__ استفاده می‌کند (که قابلیتی تازه در Python 3.7 است). در عوض، همان کاری را که برای کلاس‌ها انجام می‌دهیم به عنوان راه‌حل امن در نظر گرفته و از بررسی این ماژول‌ها صرف‌نظر می‌کنیم.

    بسته شد #2331

  • رفع پیام مثبت کاذب invalid name هنگامی که نام متد یا ویژگی بیشتر از 30 نویسه باشد.

    بسته شد #2047

  • گنجاندن نوع شاخه بعدی در no-else-return

    بسته شد #2295

  • رفع رفتار ناسازگار برای bad-continuation در سطر اول فایل

    بسته شد #2281

•
رفع ناتوانی در غیرفعال‌سازی برخی پیام‌ها در سطر آخر از طریق گزینه غیرفعال‌سازی سراسری (global disable)
بسته شد #2278
  • عدم صدور useless-return هنگامی که تنها یک دستور وجود دارد که خودِ بازگشت (return) است

    ما همچنان می‌خواهیم زمانی که تابعی قرار است یک مقدار اختیاری را بازگرداند، صریح باشد؛ هرچند pass نیز کار می‌کند، اما به‌اندازه کافی صریح نیست و ممکن است تابع چنین به نظر برسد که فاقد پیاده‌سازی است.

    بسته شد #2300

  • رفع مثبت کاذب undefined-variable / E0602 <#undefined-variable> برای نام کلاس‌های خودارجاع در lambdaها

    بسته شد #704

  • عدم خرابی زمانی که pylint قادر به استنتاج مقدار یک آرگومان برای next() نیست

    بسته شد #2316

  • عدم صدور not-an-iterable هنگام کار با تکرارکننده‌های ناهمگام (async iterators).

    اما صدور آن در صورت استفاده از پروتکل تکرار معمول در برابر تکرارکننده‌های ناهمگام.

    بسته شد #2311

  • امکان مشخص کردن نوع docstring پیش‌فرض برای زمانی که بررسی نتواند نوع را حدس بزند

    بسته شد #1169

    از آغاز pylint تا نسخهٔ 2.14.0 (شامل آن)، سیاههٔ تغییراتی (changelog) داشتیم که دربردارندهٔ تمام تغییرات غیرجزئی Pylint بود؛ از جمله تغییراتی که برای کاربران نهایی نبودند، یعنی تغییراتی که تنها در صورتی برای شما جالب بودند که توسعه‌دهنده‌ای باشید که روی pylint یا افزونه‌های pylint کار می‌کنید، یا تاریخ‌نگار پروژه‌های متن‌باز باشید.

    از pylint 1.6.0 تا 2.14.0، علاوه بر سیاههٔ کامل تغییرات، خلاصه‌ای از تغییرات (عمدتاً برای کاربران نهایی) نیز وجود داشت.

  • پشتیبانی از Python 2 پایان یافت. این انتشار تنها روی Python 3.4+ کار خواهد کرد.

    اگر نیاز به استفاده از pylint با Python 2 دارید، می‌توانید از Pylint 1.9+ استفاده کنید. ما تا سال ۲۰۲۰ که Python 2 رسماً به پایان عمر (EOL) می‌رسد، به انتشار نسخه‌های رفع باگ ادامه خواهیم داد. pylint قابلیت تحلیل فایل‌های Python 2 را به دست خواهد آورد، اما ممکن است برخی از بررسی‌ها کار نکنند زیرا فرض می‌کنند که محیط اجرای آن‌ها Python 2 است.

  • با توجه به حذف پشتیبانی از Python 2، حالت انتقال به Python 3 (که با --py3k فعال می‌شود) اکنون می‌تواند با Python 3 نیز اجرا شود.

    حالت انتقال در گذشته روی Python 3 بی‌اثر (no-op) بود، اما اکنون وقتی مفسر در حال اجرا Python 3 است، بسیاری از پیام‌ها می‌توانند صادر شوند. تنها پیام‌هایی صادر نخواهند شد که به نحو (syntax) خاصی وابسته باشند که مختص به Python 2 است، برای مثال print به عنوان یک عبارت (statement).

•
یک بررسی جدید افزوده شد: useless-object-inheritance.

این پیام بازسازی کد (refactoring) زمانی صادر می‌شود که pylint تشخیص دهد یک کلاس از object ارث‌بری می‌کند، که زاید است زیرا در Python 3، هر کلاسی به طور ضمنی از object ارث‌بری می‌کند.

class A(object):
    pass
class A:    # better
    pass
•
یک بررسی جدید افزوده شد: comparison-with-callable.

این پیام بازسازی کد زمانی صادر می‌شود که pylint تشخیص دهد مقایسه‌ای با یک فراخوان‌پذیر (callable) انجام شده است؛ امری که ممکن است نشان‌دهندهٔ از قلم افتادن پرانتزها باشد و به رفتارهای ناخواسته منجر گردد.

def foo():
    return None
def goo():
    return None
if foo == 786:  # bad
    pass
if foo() == 786:    # good
    pass
•
یک بررسی جدید افزوده شد: chained-comparison.

این پیام بازسازی کد اگر یک عملیات بولی را بتوان با زنجیره‌ای کردن برخی از عملیات آن ساده‌تر کرد، صادر می‌شود. مثال زیر را بررسی کنید:

if a < b and b < c:
    pass
if a < b < c:   # better
    pass
•
یک بررسی جدید افزوده شد: useless-import-alias.

این پیام بازسازی کد زمانی صادر می‌شود که نام مستعار واردسازی (import alias)، نام بستهٔ اصلی را تغییر ندهد.

import numpy as numpy # bad
import numpy as np # good
from collection import OrderedDict as OrderedDict # bad
from collection import OrderedDict as ordered_dict # good
•
یک بررسی جدید افزوده شد: comparison-with-itself.

این پیام بازسازی کد زمانی صادر می‌شود که یک متغیر با خودش مقایسه شود.

if variable == variable:  # bad
    pass
•
یک بررسی جدید افزوده شد: consider-using-in.

این پیام بازسازی کد زمانی صادر می‌شود که یک متغیر به جای استفاده از بررسی سریع‌تر و اصطلاحی‌تر "in"، با چندین مقدار متوالی که با or پیوند خورده‌اند مقایسه شود.

if variable == 1 or variable == 2 or variable == 3:  # bad
    pass
if variable in (1, 2, 3):  # good
    pass
•
یک بررسی جدید افزوده شد: consider-using-get.

این پیام بازسازی کد زمانی صادر می‌شود که بررسی وجود یک کلید در دیکشنری و دریافت مقدار آن در صورت وجود (و به‌صورت اختیاری یک مقدار پیش‌فرض در صورت عدم وجود) به‌صورت دستی انجام گیرد، به جای اینکه از روش اصطلاحی‌تر dict.get استفاده شود.

if 'key' in dictionary:  # bad
    variable = dictionary['key']
else:
    variable = 'default'
variable = dictionary.get('key', 'default')  # good
•
یک بررسی جدید افزوده شد: consider-using-join.

این پیام بازسازی کد زمانی صادر می‌شود که برای پیوند دادن رشته‌ها از یک حلقهٔ for روی یک پیمایش‌پذیر (iterable) استفاده شود، به جای str.join(sequence) که سریع‌تر است، حافظهٔ کمتری مصرف می‌کند و روش اصطلاحی‌تری به شمار می‌رود.

result = ''  # bad
for number in ['1', '2', '3']:
    result += number
result = ''.join(['1', '2', '3'])  # good
  • پیام جدید useless-return هنگامی که تابع یا متد با عبارت "return" یا "return None" خاتمه یابد و این تنها عبارت return در بدنه باشد.
  • پیام جدید use-symbolic-message-instead هنگامی که یک پیام به جای نماد (symbol)، با شناسه (id) فعال یا غیرفعال شود. استفاده از نماد صریح‌تر است و به‌خاطرسپاری آن آسان‌تر خواهد بود.
  • یک بررسی جدید افزوده شد: consider-swap-variables.

    این پیام بازسازی کد زمانی صادر می‌شود که برای جابه‌جایی مقادیر دو متغیر، از یک متغیر موقت به جای رویکرد کوتاه‌تر و اصطلاحی‌تر با استفاده از tuple-unpacking استفاده شود..sp به جای یک متغیر موقت، باید از نحو تک‌خطی به همراه کاما استفاده شود.

    برای جزئیات، این سند راهنمای نگارش https://docs.python-guide.org/writing/style یا ارائه swap values presentation در Pycon 2007 را ببینید.

temp = a  # the wrong way
a = b
b = temp
a, b = b, a  # the right way
  • دو بررسی جدید، invalid-envvar-value و invalid-envvar-default اضافه شدند.

    مورد نخست هر زمان که pylint تشخیص دهد توابع دستکاری متغیر محیطی از نوعی غیر از رشته استفاده می‌کنند فعال می‌شود، در حالی که مورد دوم هر زمان که توابع مذکور از یک متغیر پیش‌فرض با نوعی متفاوت از نوع مورد انتظار استفاده کنند، صادر می‌گردد.

  • یک بررسی جدید اضافه شد: subprocess-popen-preexec-fn،

    این پیام بازآرایی زمانی صادر می‌شود که هنگام ایجاد نمونه‌های subprocess.Popen از آرگومان کلیدواژه‌ای preexec_fn استفاده شود، که ممکن است استفاده از آن در حضور ریسه‌ها (threads) ناامن باشد.

    برای جزئیات کامل هشدار، subprocess.Popen https://docs.python.org/3/library/subprocess.html#popen-constructor را ببینید.

  • پیام جدید try-except-raise زمانی صادر می‌شود که یک بلوک مدیریت except دارای دستور raise خالی به عنوان نخستین عملگر خود باشد، یا نوع استثنای برانگیخته‌شده همان استثنایی باشد که در حال مدیریت است.
  • بررسی جدید possibly-unused-variable اضافه شد.
این مورد شبیه به unused-variable است؛ با این تفاوت که زمانی صادر می‌شود که یک فراخوانی locals() در حوزه متغیر استفاده‌نشده شناسایی شود. فراخوانی locals() می‌تواند با مصرف تمام مقادیر موجود تا نقطه فراخوانی، به‌طور بالقوه از متغیر مذکور استفاده کند. این بررسی جدید امکان غیرفعال کردن این خطا را زمانی که کاربر عمداً از locals() برای مصرف همه‌چیز استفاده می‌کند، فراهم می‌سازد.

برای نمونه، کد زیر اکنون این خطای جدید را ایجاد خواهد کرد:

def func():
    some_value = some_call()
    return locals()
  • بررسی جدید unhashable-dict-key برای تشخیص جستجوها در dict با استفاده از کلیدهای غیرقابل درهم‌سازی (unhashable) مانند لیست‌ها یا دیکشنری‌ها اضافه شد.
  • بررسی هشدار جدید self-cls-assignment اضافه شد.

    این بررسی در صورتی که به نخستین آرگومان یک متد نمونه/کلاس مقداری انتساب یابد، هشدار می‌دهد

class Foo(object):
    def foo(self, bar):
        self = bar
  • گزینه حالت پرگو (verbose mode) جدید --verbose برای نمایش خروجی‌های اضافی غیرمرتبط با بررسی‌کننده‌ها. به‌طور پیش‌فرض غیرفعال است.
  • دو بررسی جدید برای پیشنهاد استفاده از ساختارهای ادراک دیکشنری و مجموعه (dict and set comprehensions) در صورت امکان اضافه شدند.

    این دو بررسی مثال‌های زیر را نشانه‌گذاری خواهند کرد:

dict([(k, v) for (k, v) in ...]) # better as {k: v for k, v in ...}
set([k for k in ...]) # better as {k for k in ...}
  • چندین بهبود کارایی اعمال‌شده در astroid باید باعث شود که pylint نیز کمی سریع‌تر شود.

    ما پرچم جدیدی به نام max_inferable_values را در astroid.MANAGER اضافه کردیم تا حداکثر تعداد مقادیری را که astroid می‌تواند هنگام استنتاج مقادیر استنتاج کند، محدود سازد. این تغییر باید کارایی را هنگام کار با چارچوب‌های بزرگ مانند django بهبود بخشد. همچنین می‌توانید این رفتار را با pylint --limit-inference-results کنترل کنید.

    ما همچنین نحوه عملکرد متدهای nodes_of_class و get_children را بازنویسی کردیم که باید منجر به افزایش کارایی برای چندین بررسی شود.

  • رفع پیام مثبت کاذب inconsistent-return-statements زمانی که استثنا درون یک دستور else رخ می‌دهد.
  • عدم هشدار برای missing-type-doc و/یا missing-return-type-doc، در صورتی که یادداشت‌های نوع (type annotations) روی امضای تابع برای یک پارامتر و/یا نوع بازگشتی وجود داشته باشد.
  • رفع پیام مثبت کاذب inconsistent-return-statements زمانی که دستور if درون try/except قرار دارد.
  • رفع پیام مثبت کاذب inconsistent-return-statements هنگام استفاده از حلقه‌های while.
  • رفع صدور پیام مثبت کاذب no-member برای کلاسی با ویژگی‌های "خصوصی" که نام آن‌ها درهم‌سازی (mangled) شده است.
  • رفع مثبت کاذب‌های unused-argument با متغیر سایه‌اندازی‌شده در comprehension دیکشنری.
  • رفع مثبت کاذب inconsistent-return-statements هنگامی که توابع بدون بازگشت استفاده می‌شوند (مانند sys.exit).
  • رفع پیام مثبت کاذب inconsistent-return-statements زمانی که یک تابع زیر یک دستور if تعریف شده باشد.
  • رفع پیام مثبت کاذب inconsistent-return-statements با جلوگیری از استنتاج بیهوده استثنا در صورتی که استثنا مدیریت نشده باشد.
  • رفع مثبت کاذب undefined-variable برای آرگومان lambda در تعاریف کلاس.
  • فرونشانی پیام‌های مثبت کاذب not-callable ناشی از توصیف‌گرهای خاص staticmethod.
  • گسترش ignored-argument-names برای دربرگرفتن آرگومان‌های ستاره‌دار و آرگومان‌های کلیدواژه‌ای.
  • بررسی singleton-comparison شرایط بولی بهتری را برای شروط منفی پیشنهاد خواهد کرد.
  • بررسی undefined-loop-variable قبل از صدور، اشیاء پیمایش‌شده‌ی غیرخالی را در نظر می‌گیرد.

    به عنوان مثال، اگر پیمایش‌پذیر حلقه خالی نباشد، این بررسی دیگر صادر نخواهد شد.

  • کلاس‌های Enum دیگر too-few-methods را فعال نمی‌کنند.
  • متدهای ویژه اکنون در شمارش متدهای too-few-methods لحاظ می‌شوند، و بخشی از API عمومی در نظر گرفته می‌شوند. آن‌ها همچنان در تعداد متدها برای too-many-methods شمرده نمی‌شوند.
  • افزونه docparams به متدهای انتزاعی اجازه می‌دهد مستندات مقادیر بازگشتی را ثبت کنند حتی اگر پیاده‌سازی پیش‌فرض مقداری بازنگرداند. آن‌ها همچنین دیگر نیازی به مستندسازی بالا بردن خطای NotImplementedError. ندارند.
  • صرف‌نظر کردن از بررسی وارد کردن سراسری (wildcard import) برای __init__.py.
  • عدم هشدار useless-super-delegation / W0235 <#useless-super-delegation>' در صورتی که متد زیرکلاس دارای یادداشت‌های نوع متفاوتی باشد.
  • عدم هشدار مبنی بر این که یک متغیر سراسری استفاده نشده است در صورتی که با یک import تعریف شده باشد
def func():
    global sys
    import sys
  • افزودن پشتیبانی پایه برای ارزیابی به تعویق افتاده یادداشت‌های توابع.

    اگر pylint عبارت واردسازی مربوطه from __future__ import annotations را شناسایی کند، پیام‌های used-before-assignment و undefined-variable را در مواردی که ناشی از یادداشت‌ها باشد صادر نخواهد کرد.

    جزئیات بیشتر درباره ارزیابی به تعویق افتاده یادداشت‌ها را می‌توان در PEP 563 https://peps.python.org/pep-0563 خواند.

  • یک گزینه خط فرمان جدید افزوده شد، --exit-zero، برای استفاده در اسکریپت‌های یکپارچه‌سازی مداوم (CI) که در صورت بازگرداندن کد وضعیت غیرصفر توسط دستور متوقف می‌شوند. اگر این گزینه مشخص شود و Pylint با موفقیت اجرا شود، صرف‌نظر از تعداد مشکلات شناسایی‌شده، با کد 0 خارج خواهد شد.

    خطاهای پیکربندی، خطاهای تجزیه، و فراخوانی Pylint با گزینه‌های خط فرمان نامعتبر همچنان کد خطای غیرصفر بازمی‌گردانند، حتی اگر --exit-zero مشخص شده باشد.

  • عدم صدور مجدد unused-import برای واردسازی‌های typing استفاده‌شده در توضیحات نوع (type comments). به عنوان نمونه، در مثال زیر pylint پیش‌تر ایراد می‌گرفت که Any و List استفاده نشده‌اند، در حالی که باید از نظر یک بررسی‌کننده نوع، استفاده‌شده تلقی شوند.
from typing import Any, List
a = 1 # type: List[Any]
  • رفع مثبت کاذب line-too-long برای خطوط کامنت در انتهای ماژول.
  • رفع صدور useless-super-delegation هنگام تغییر مقدار پیش‌فرض آرگومان‌های کلیدواژه‌ای.
  • پشتیبانی از typing.TYPE_CHECKING برای خطاهای :ref:`unused-import`

    هنگامی که ماژول‌ها تحت محافظت typing.TYPE_CHECKING وارد می‌شوند، pylint دیگر :ref:`unused-import` را صادر نخواهد کرد.

  • رفع مثبت کاذب unused-variable در آرگومان‌های پیش‌فرض lambda.
  • بررسی assignment-from-no-return متدها را نیز همانند توابع در نظر می‌گیرد.

    اگر متدی داشته باشید که مقداری بازنمی‌گرداند، اما بعداً مقداری را به یک فراخوانی از آن متد تخصیص دهید (بنابراین در اصل None خواهد بود)، آن‌گاه pylint خطای assignment-from-no-return را صادر خواهد کرد.

  • یک پرچم جدید افزوده شد، --ignore-none که رفتار no-member را با توجه به مقادیر None کنترل می‌کند.

    پیش‌تر اگر pylint استنتاج می‌کرد که مالک دسترسی به صفت یک مقدار None است، no-member را صادر نمی‌کرد. در برخی موارد، این مسئله می‌تواند عملاً باعث باگ شود، بنابراین اگر می‌خواهید مقادیر None نیز بررسی شوند، گزینه --ignore-none=n را به pylint ارسال کنید.

  • رفع مثبت کاذب bad-continuation برای دستورات with.
  • رفع پیام مثبت کاذب bad-whitespace برای یادداشت‌های نوع حاوی علامت سه‌نقطه (ellipses).
  • رفع مثبت کاذب undefined-variable برای lambdaهای تودرتو.

تاریخ انتشار: 2018-07-15

  • اگر هرگونه کنترل‌کنندهٔ کلاس استثنای والد وجود داشته باشد، try-except-raise نباید صادر شود.

    بسته شد: #2284

  • پیام trailing-comma-tuple می‌تواند برای دستورهای return نیز صادر شود.

    بسته شد: #2269

  • رفع مثبت کاذب پیام inconsistent-return-statements هنگامی که یک استثنا درون یک دستور else صادر می‌شود.

    بسته شد: #1782

  • گره‌های ImportFrom به درستی از نام کامل برای بررسی‌های مرتب‌سازی وارد کردن (import sorting) استفاده می‌کنند.

    بسته شد: #2181

  • دستور [].extend و عملیات توکار مشابه با بررسی‌کنندهٔ انتقال به پایتون ۳ دیگر dict-*-not-iterating را صادر نمی‌کنند.

    بسته شد: #2187

  • افزودن بررسی consider-using-dict-comprehension که اگر برای مقداردهی اولیه دیکشنری از شیوهٔ قدیمی با list comprehension استفاده شود، صادر می‌شود.
  • افزودن بررسی consider-using-set-comprehension که اگر برای مقداردهی اولیه مجموعه از شیوهٔ قدیمی با list comprehension استفاده شود، صادر می‌شود.
  • پیام logging-not-lazy هر زمان که pylint استنتاج کند که یک رشته با عملگر جمع ساخته شده است، صادر می‌شود.

    بسته شد: #2193

  • افزودن بررسی chained-comparison که در صورتی صادر می‌شود که یک عملیات بولی بتواند با زنجیره‌ای کردن برخی از عملیات‌هایش ساده‌سازی شود؛ مانند "a < b and b < c" که می‌تواند به صورت "a < b < c" ساده شود.

    بسته شد: #2032

  • افزودن بررسی consider-using-in برای مقایسهٔ یک متغیر با مقادیر متعدد با استفاده از "==" و "or" به جای بررسی اینکه آیا متغیر در یک تاپل از آن مقادیر وجود دارد ("in").
  • عبارت in برای برخی از بررسی‌کننده‌های انتقال به پایتون ۳ به عنوان یک بافت پیمایشی در نظر گرفته می‌شود.

    بسته شد: #2186

  • افزودن پرچم --ignore-none برای کنترل اینکه آیا pylint باید دربارهٔ no-member در جایی که مالک None است هشدار دهد یا خیر.
  • رفع مثبت کاذب مربوط به too-many-arguments و متدهای مقید __get__.

    بسته شد: #2172

  • پارامتر mcs به عنوان اولین پارامتر متد __new__ در متاکلاس با cls جایگزین شد.

    بسته شد: #2028

  • پیام assignment-from-no-return متدها را نیز در نظر می‌گیرد.

    بسته شد: #2081

  • پشتیبانی از typing.TYPE_CHECKING برای خطاهای :ref:`unused-import`.

    بسته شد: #1948

  • کلاس‌های استنتاج‌شده در سطح تابع در صورتی که با عبارت منظم متغیر همخوانی نداشته باشند، دیگر invalid-name را صادر نمی‌کنند.

    بسته شد: #1049

  • افزودن پشتیبانی اولیه برای ارزیابی به تعویق افتادهٔ یادداشت‌های نوع تابع (function annotations).

    بسته شد: #2069

  • رفع یک باگ در missing-kwoa و پارامترهای با طول متغیر (variadics).

    بسته شد: #1111

  • بررسی simplifiable-if-statement تنها هنگام انتساب به مقصدهای یکسان در نظر گرفته می‌شود.

    بسته شد: #1984

  • آزمودن موارد بیشتر در len-as-condition، مانند len() < 1 یا len <= 0.
  • رفع صدور مثبت کاذب پیام line-too-long برای خطوط توضیحات (کامنت) در انتهای یک ماژول.

    بسته شد: #1950

  • رفع مثبت کاذب bad-continuation برای دستورهای with.

    بسته شد: #461

  • عدم صدور هشدار برای stop-iteration-return هنگام استفاده از next() بر روی itertools.count.

    بسته شد: #2158

  • افزودن بررسی consider-using-get برای استفادهٔ غیر اصولی از دریافت مقدار/مقدار پیش‌فرض یک کلید از دیکشنری.

    بسته شد: #2076

  • پیام invalid-slice-index / E1127 <#invalid-slice-index> هنگامی که برش (slice) به عنوان اندیس برای یک شیء پیچیده استفاده شود، صادر نمی‌شود.

    ما تنها از شمار اندکی از اشیای شناخته‌شده (مانند list، set و موارد مشابه) برای تعیین اینکه آیا باید invalid-slice-index / E1127 <#invalid-slice-index> در هنگام استفاده از برش برای اندیس‌گذاری یک شیء صادر شود یا خیر، استفاده می‌کنیم.

  • عدم صدور پیام unused-import برای وارد کردن‌های typing که در توضیحات نوع (type comments) به کار رفته‌اند.
  • افزودن بررسی جدید useless-import-alias / C0414 <#useless-import-alias>'.

    بسته شد: #2052

  • افزودن comparison-with-callable برای هشدار دادن در مورد مقایسه با فراخوانی‌پذیرِ خام (bare callable)، بدون فراخوانی آن.

    بسته شد: #2082

  • عدم صدور هشدار برای missing-type-doc و/یا missing-return-type-doc، در صورتی که یادداشت‌های نوع روی امضای تابع برای یک پارامتر و/یا نوع بازگشتی وجود داشته باشد.

    بسته شد: #2083

  • افزودن گزینهٔ --exit-zero برای اسکریپت‌های یکپارچه‌سازی مداوم (CI) به منظور فراخوانی آسان‌تر Pylint در محیط‌هایی که در صورت بازگرداندن کد وضعیت غیر صفر (خطا) توسط یک برنامه، متوقف می‌شوند.

    بسته شد: #2042

  • هشدار در صورتی که به اولین آرگومان یک متد نمونه/کلاس مقداری انتساب داده شود.

    بسته شد: #977

  • بررسی جدید comparison-with-itself جهت بررسی مقایسه بین مقادیر یکسان.

    بسته شد: #2051

  • افزودن هشدار جدید، logging-fstring-interpolation / W1203 <#logging-fstring-interpolation>'، که هنگام استفاده از f-string در فراخوانی‌های توابع لاگ‌گیری صادر می‌شود.

    بسته شد: #1998

  • عدم نمایش useless-super-delegation / W0235 <#useless-super-delegation>' در صورتی که متد زیرکلاس یادداشت‌های نوع متفاوتی داشته باشد.

    بسته شد: #1923

  • افزودن بررسی unhashable-dict-key.

    بسته شد: #586

  • عدم صدور هشدار در مورد استفاده نشدن یک متغیر سراسری در صورتی که از طریق یک import تعریف شده باشد.

    بسته شد: #1453

  • نادیده گرفتن بررسی وارد کردن عمومی (wildcard import) برای __init__.py.

    بسته شد: #2026

  • حالت انتقال به پایتون ۳ اکنون می‌تواند با پایتون ۳ نیز اجرا شود.
  • پیام too-few-public-methods برای dataclassها صادر نمی‌شود.

    بسته شد: #1793

  • گزینهٔ جدید حالت پرگو (verbose mode) که با پرچم خط فرمان --verbose فعال می‌شود، برای نمایش خروجی‌های اضافی غیرمرتبط با بررسی‌کننده‌ها. این گزینه به طور پیش‌فرض غیرفعال است.

    بسته شد: #1863

  • بررسی undefined-loop-variable پیش از صدور، اشیای پیمایش‌شدهٔ غیرخالی را در نظر می‌گیرد.

    بسته شد: #2039

  • افزودن پشتیبانی از نام‌های اختیاری مقدار بازگشتی در numpydoc.

    بسته شد: #2030

  • پیام singleton-comparison بررسی‌های منفی را نیز در نظر می‌گیرد..sp بسته شدن #2037
  • افزودن بررسی consider-using-in برای مقایسه یک متغیر با چندین مقدار با استفاده از "==" و "or"s به جای بررسی قرار داشتن متغیر "in" در تاپلی از آن مقادیر.

    بسته شدن #1977

  • اکنون defaultdict و زیرکلاس‌های dict در بررسی‌های dict-iter-* مدیریت می‌شوند

    بسته شدن #2005

  • پیام logging-format-interpolation همچنین در صورت استفاده از f-strings به جای نحو % صادر می‌شود.

    بسته شدن #1788

  • عدم فعال‌سازی misplaced-bare-raise / E0704 <#misplaced-bare-raise> هنگامی که raise در یک بند finally قرار دارد

    بسته شدن #1924

  • افزودن بررسی جدید، possibly-unused-variable.

    این بررسی مشابه unused-variable است، با این تفاوت که تنها زمانی صادر می‌شود که یک فراخوانی ()locals در حوزه متغیر استفاده‌نشده شناسایی شود. فراخوانی locals() می‌تواند با مصرف تمام مقادیر موجود تا نقطه فراخوانی، به طور بالقوه از متغیر مذکور استفاده کند. این بررسی جدید امکان غیرفعال کردن این خطا را در زمانی فراهم می‌کند که کاربر عمداً از locals() برای مصرف همه‌چیز استفاده کرده باشد.

    بسته شدن #1909.

  • بررسی no-else-return حالت‌های متعددی را در نظر می‌گیرد
این بررسی کمی بیش از حد محدودکننده بود زیرا گره‌های return را در گره orelse. بررسی می‌کرد. با این حال در آن نقطه می‌توان عبارت if را بازآفرینی کرد تا orelse را نداشته باشد. این امر تشخیص سایر حالت‌ها را بهبود می‌بخشد، برای نمونه اکنون گره‌های TryExcept را که بخشی از شاخه else. هستند تشخیص می‌دهد.

بسته شدن #1852

  • افزودن دو بررسی جدید، invalid-envvar-value و invalid-envvar-default.

    مورد اول زمانی فعال می‌شود که pylint تشخیص دهد توابع دستکاری متغیرهای محیطی از نوعی غیر از رشته‌ها استفاده می‌کنند، در حالی که مورد دوم هنگامی صادر می‌شود که توابع مذکور از یک متغیر پیش‌فرض با نوعی متفاوت از نوع مورد انتظار استفاده کنند.

  • افزودن بررسی consider-using-join برای الحاق رشته‌ها با استفاده از str.join(sequence)

    بسته شدن #1952

  • افزودن بررسی consider-swap-variables برای جابه‌جایی متغیرها با بسته‌گشایی تاپل (tuple unpacking)

    بسته شدن #1922

  • افزودن بررسی‌کننده جدید try-except-raise که اگر بلوک گرداننده except دارای عبارت raise به عنوان اولین عملگر خود باشد به کاربر هشدار می‌دهد. این هشدار زمانی نمایش داده می‌شود که یک عبارت raise خالی (bare raise) وجود داشته باشد که عملاً استثنای دریافت‌شده را دوباره برمی‌انگیزد، یا نوع استثنای برانگیخته‌شده مشابه استثنایی باشد که در حال مدیریت است.
  • عدم بروز خرابی با رشته‌های نامعتبر هنگام بررسی logging-format-interpolation

    بسته شدن #1944

  • معاف کردن __doc__ از فعال‌سازی هشدار redefined-builtin

    از __doc__ می‌توان برای تعیین یک docstring برای یک ماژول بدون ارسال آن به عنوان رشته نخستین عبارت استفاده کرد.

  • رفع مثبت کاذب bad-whitespace ناشی از آرگومان‌های تابع دارای مقادیر پیش‌فرض و حاشیه‌نویسی‌ها (annotations)

    بسته شدن #1831

  • رفع مثبت کاذب stop-iteration-return / R1708 <#stop-iteration-return> هنگامی که تابع توکار next در یک مولد دارای مقدار پیش‌فرض است

    بسته شدن #1830

  • رفع صدور پیام مثبت کاذب no-member برای کلاسی با ویژگی‌های "خصوصی" که نام آن‌ها درهم‌سازی (mangled) شده است.

    بسته شدن #1643

  • رفع خرابی رخ‌داده هنگام عدم مدیریت صحیح Uninferable در stop-iteration-return

    بسته شدن #1779

  • استفاده از گره مناسب برای دریافت نام توابع بازتعریف‌شده (#1792)

    بسته شدن #1774

  • عدم بروز خرابی هنگام مواجهه با raiseهای خالی در حین بررسی بازگشت‌های ناسازگار

    بسته شدن #1773

  • رفع پیام مثبت کاذب inconsistent-return-statements زمانی که عبارت if درون try/except قرار دارد.

    بسته شدن #1770

  • رفع پیام مثبت کاذب inconsistent-return-statements هنگام استفاده از حلقه‌های while.

    بسته شدن #1772

  • تصحیح شماره ستون برای قواعد فاصله‌گذاری (whitespace).

    پیش از این شماره ستون روی 0 گیر کرده بود

    بسته شدن #1649

  • رفع موارد مثبت کاذب unused-argument با متغیر سایه‌اندازی‌شده در درک دیکشنری (dictionary comprehension).

    بسته شدن #1731

  • رفع پیام مثبت کاذب inconsistent-return-statements هنگام استفاده از توابعی که هرگز بازنمی‌گردند (مانند sys.exit).

    بسته شدن #1771

  • رفع خطا هنگام بررسی این‌که آیا تابع استثنا است یا خیر، همانند bad-exception-context.
  • رفع پیام مثبت کاذب inconsistent-return-statements هنگامی که یک تابع زیر یک عبارت if تعریف شده است.

    بسته شدن #1794

  • پیام جدید useless-return هنگامی که تابع یا متد با عبارت "return" یا "return None" پایان می‌یابد و این تنها عبارت return در بدنه است.
  • رفع پیام مثبت کاذب inconsistent-return-statements با اجتناب از استنتاج بیهوده استثنا در صورتی که استثنا مدیریت نشده باشد.

    بسته شدن #1794 (بخش دوم)

  • رفع بررسی نادرست نمونه‌سازی thread هنگامی که تابع هدف در args ارائه شده باشد.

    بسته شدن #1840

  • رفع مثبت کاذب هنگامی که یک بخش Attributes در numpy پس از بخش Parameters قرار می‌گیرد

    بسته شدن #1867

  • رفع مسیر نادرست فایل هنگامی که مسیر مطلق فایل شامل چندین رشته path_strip_prefix باشد.

    بسته شدن #1120

  • رفع مثبت کاذب undefined-variable / E0602 <#undefined-variable> برای آرگومان lambda در تعاریف کلاس

    بسته شدن #1824

  • افزودن یک بررسی‌کننده جدید که در صورت فعال یا غیرفعال شدن برخی پیام‌ها با شناسه (id) به جای نماد (symbol) به کاربر هشدار می‌دهد.

    بسته شدن #1599

  • خنثی‌سازی پیام‌های مثبت کاذب not-callable ناشی از توصیف‌گرهای خاص staticmethod

    بسته شدن #1699

  • رفع نحوه مدیریت دندانه‌داری با تب‌ها (tabs)

    بسته شدن #1148

  • رفع خطای مثبت کاذب bad-continuation

    بسته شدن #638

  • رفع مثبت کاذب unused-variable / W0612 <#unused-variable> در آرگومان‌های پیش‌فرض lambda

    بسته شدن #1921 بسته شدن #1552 بسته شدن #1099 بسته شدن #210

  • به‌روزرسانی قالب پیش‌فرض گزارش برای دربرداشتن مسیرهایی که در برخی پایانه‌ها (مانند iTerm) قابل کلیک هستند..IP • 2 رفع رفتار def درون‌خطی در بررسی‌کننده too-many-statements

    حل مسئله #1978

  • رفع بروز KeyError هنگام استفاده از docparams و مستندسازی NotImplementedError.

    حل مسئله #2102

  • رفع بروز method-hidden / E0202 <#method-hidden>' هنگام انتساب به یک property یا data descriptor.
  • رفع صدور useless-super-delegation هنگام تغییر مقدار پیش‌فرض آرگومان‌های کلیدواژه‌ای.

    حل مسئله #2022

  • گسترش ignored-argument-names برای در برگرفتن آرگومان‌های ستاره‌دار و آرگومان‌های کلیدواژه‌ای

    حل مسئله #2214

  • رفع مثبت کاذب undefined-variable / E0602 <#undefined-variable> در یک lambda تو در تو

    حل مسئله #760

  • رفع پیام مثبت کاذب bad-whitespace برای typing annotations حاوی چندنقطه (...)

    حل مسئله 1992

  • تفکیک "missing-docstrings" به بخش‌های "module"، "class" و "function"

    برای کارکرد این مورد، امکان وجود چندین پیام با نام قدیمی یکسان فراهم شد.

    حل مسئله #1164

از آغاز pylint تا نسخه 2.14.0 (شامل آن)، ما گزارش تغییراتی (changelog) داشتیم که دربردارنده تمام تغییرات غیربدیهی Pylint بود، از جمله تغییراتی که برای کاربران نهایی ملموس نبودند؛ یعنی تغییراتی که تنها در صورتی برای شما جذاب بودند که توسعه‌دهنده‌ای باشید که روی pylint یا افزونه‌های pylint کار می‌کنید، یا یک تاریخ‌نگار متن‌باز باشید.

از pylint 1.6.0 تا 2.14.0، علاوه بر گزارش تغییرات کامل، خلاصه‌ای از تغییرات (عمدتاً برای کاربران نهایی) نیز وجود داشت.

از آغاز pylint تا نسخه 2.14.0 (شامل آن)، ما گزارش تغییراتی (changelog) داشتیم که دربردارنده تمام تغییرات غیربدیهی Pylint بود، از جمله تغییراتی که برای کاربران نهایی ملموس نبودند؛ یعنی تغییراتی که تنها در صورتی برای شما جذاب بودند که توسعه‌دهنده‌ای باشید که روی pylint یا افزونه‌های pylint کار می‌کنید، یا یک تاریخ‌نگار متن‌باز باشید.

از pylint 1.6.0 تا 2.14.0، علاوه بر گزارش تغییرات کامل، خلاصه‌ای از تغییرات (عمدتاً برای کاربران نهایی) نیز وجود داشت.

•
تاکنون موردی وجود ندارد

  • یک بررسی‌کننده جدید Python 3 برای هشدار درباره تابع حذف‌شده operator.div اضافه شد.
  • یک بررسی‌کننده جدید Python 3 برای هشدار درباره دسترسی به توابعی اضافه شد که از ماژول urllib به زیربسته‌های مربوطه مانند urllib.request منتقل شده‌اند.
from urllib import urlencode

در عوض کد قبلی باید از urllib.parse یا six.moves برای وارد کردن ماژول به شیوه‌ای سازگار با Python 2 و Python 3 استفاده کند:

from six.moves.urllib.parse import urlencode

برای اینکه این مورد در Python 3 نیز کار کند، لطفاً از کتابخانه six استفاده کنید:

six.reraise(Exception, "value", tb)
•
یک بررسی جدید برای هشدار درباره استفاده از رشته‌های لفظی خام یونیکد (unicode raw string literals) اضافه شد. این مورد در Python 3 یک خطای نحو (syntax error) است:
a = ur'...'
  • بررسی جدید deprecated-sys-function اضافه شد که هنگام دسترسی به اعضای حذف‌شده sys صادر می‌شود.
  • بررسی xreadlines-attribute اضافه شد که هنگام دسترسی به صفت xreadlines() روی یک شیء فایل صادر می‌شود.
  • دو بررسی جدید برای پورت کردن به Python 3 اضافه شد: exception-escape و comprehension-escape

    این دو بررسی زمانی صادر می‌شوند که pylint تشخیص دهد متغیر تعریف‌شده در بلوک‌های مذکور، خارج از بلوک داده‌شده استفاده شده است. در Python 3 این مقادیر حذف می‌شوند.

try:
  1/0
except ZeroDivisionError as exc:
   ...
print(exc) # This will raise a NameError on Python 3
[i for i in some_iterator if some_condition(i)]
print(i) # This will raise a NameError on Python 3
•
اکنون defaultdict و زیرکلاس‌های dict برای بررسی‌های dict-iter-* مدیریت می‌شوند. بدین معنی که کد زیر اکنون هنگام دسترسی به iteritems و موارد مشابه، اخطار صادر خواهد کرد:
some_dict = defaultdict(list)
...
some_dict.iterkeys()
  • کلاس‌های Enum دیگر موجب فعال شدن too-few-methods نمی‌شوند
  • متدهای خاص اکنون در شمارش too-few-methods لحاظ می‌شوند، و بخشی از API عمومی در نظر گرفته می‌شوند. آن‌ها همچنان در شمارش تعداد متدها برای too-many-methods شمرده نمی‌شوند.
  • افزونه docparams به متدهای انتزاعی اجازه می‌دهد مستندات مقادیر بازگشتی را ثبت کنند، حتی اگر پیاده‌سازی پیش‌فرض مقداری را بازنگرداند. آن‌ها همچنین دیگر نیازی به مستندسازی پرتاب NotImplementedError ندارند.

تاریخ انتشار: 2018-05-15

  • دو بررسی جدید انتقال به Python 3 اضافه شد: exception-escape و comprehension-escape

    این دو مورد هر زمان که pylint تشخیص دهد متغیر تعریف‌شده در بلوک‌های مذکور در خارج از آن بلوک استفاده شده است، صادر می‌شوند. در Python 3 این مقادیر حذف می‌شوند.

  • یک بررسی جدید deprecated-sys-function اضافه شد، که هنگام دسترسی به اعضای حذف‌شده sys صادر می‌شود.
  • بررسی xreadlines-attribute اضافه شد، که هنگام دسترسی به ویژگی xreadlines() صادر می‌شود.
  • حالت انتقال به Python 3 اکنون با خود Python 3 نیز قابل اجرا است.
  • افزونه docparams به متدهای انتزاعی اجازه می‌دهد آنچه را که پیاده‌سازی‌های بازنویسی‌کننده باید بازگردانند مستند کنند، و بدون نیاز به مستندسازی، خطای NotImplementedError را اعلام نمایند.

    بسته شدن #2044

  • متدهای خاص در شمارش too-few-methods لحاظ نمی‌شوند، و بخشی از API عمومی در نظر گرفته می‌شوند.
  • کلاس‌های Enum موجب ایجاد too-few-methods نمی‌شوند

    بسته شدن #605

  • بررسی جدیدی برای Python 2/3 جهت دسترسی به operator.div اضافه شد، که در Python 3 حذف شده است

    بسته شدن #1936

  • بررسی جدیدی برای Python 2/3 جهت دسترسی به توابع حذف‌شده urllib اضافه شد

    بسته شدن #1997

از آغاز pylint تا نسخه 2.14.0 (شامل آن)، ما گزارش تغییراتی داشتیم که شامل تمام تغییرات غیربدیهی Pylint بود، از جمله تغییراتی که رو به کاربر نبودند، یعنی تغییراتی که ممکن است فقط در صورتی برای شما جالب باشند که توسعه‌دهنده‌ای باشید که روی pylint یا افزونه‌های pylint کار می‌کنید، یا تاریخ‌نگار پروژه‌های منبع‌باز باشید.

از pylint 1.6.0 تا 2.14.0، علاوه بر گزارش تغییرات کامل، خلاصه‌ای از تغییرات (عمدتاً رو به کاربر) نیز وجود داشت.

•
تاکنون موردی نیست
•
یک بررسی جدید افزوده شد، shallow-copy-environ.

این پیام هشدار زمانی صادر می‌شود که یک کپی سطحی از os.environ ایجاد شود. کپی سطحی از os.environ آن‌طور که افراد انتظار دارند کار نمی‌کند. os.environ یک شیء dict نیست، بلکه یک شیء واسط (proxy object) است؛ بنابراین هر تغییری که در کپی اعمال شود ممکن است اثرات غیرمنتظره‌ای روی os.environ بگذارد.

به جای متد copy.copy(os.environ)، باید از os.environ.copy() استفاده شود.

برای جزئیات بیشتر https://bugs.python.org/issue15373 را ببینید.

import copy
import os
wrong_env_copy = copy.copy(os.environ)  # will emit pylint warning
wrong_env_copy['ENV_VAR'] = 'new_value'  # changes os.environ
assert os.environ['ENV_VAR'] == 'new_value'
good_env_copy = dict(os.environ)  # the right way
good_env_copy['ENV_VAR'] = 'different_value'  # doesn't change os.environ
assert os.environ['ENV_VAR'] == 'new_value'
•
یک بررسی جدید افزوده شد، keyword-arg-before-vararg.

این پیام هشدار زمانی صادر می‌شود که تابعی با یک آرگومان کلیدواژه‌ای قبل از آرگومان‌های موضعی با طول متغیر (*args) تعریف شده باشد. این امر در صورتی که مقدار آرگومان کلیدواژه‌ای در فراخوانی تابع مشخص نشود (با این فرض که مقدار پیش‌فرض تعریف‌شده در نظر گرفته می‌شود)، ممکن است منجر به تغییر لیست args گردد.

def foo(a, b=3, *args):
    print(a, b, args)
# Case1: a=0, b=2, args=(4,5)
foo(0,2,4,5) # 0 2 (4,5) ==> Observed values are same as expected values
# Case2: a=0, b=<default_value>, args=(4,5)
foo(0,4,5) # 0 4 (5,) ==> args list got modified as well as the observed value of b
# Case3: Syntax Error if tried as follows
foo(0,b=2,4,5) # syntax error
•
یک بررسی جدید افزوده شد، simplify-boolean-expression.

این پیام زمانی صادر می‌شود که بررسی consider-using-ternary به دلیل نادرست بودن یک عنصر به‌ظاهر درست (truthy) در بافت منطقی (boolean context)، کدی غیرمعادل تولید کند.

value = condition and False or other_value

این ساختار معیوب می‌تواند به این شکل ساده‌سازی شود:

value = other_value
•
یک بررسی جدید افزوده شد، bad-thread-instantiation.

این پیام زمانی صادر می‌شود که کلاس threading.Thread آرگومان target را دریافت نکند، بلکه فقط یک آرگومان دریافت کند که به‌طور پیش‌فرض همان پارامتر group است.

در مثال زیر، نمونه‌سازی با شکست مواجه می‌شود که قطعاً مطلوب نیست:

import threading
threading.Thread(lambda: print(1)) # Oups, this is the group parameter
•
یک بررسی‌کننده جدید Python 3 برای هشدار در مورد دسترسی به توابعی که از ماژول itertools حذف شده‌اند افزوده شد: izip، imap، iflter، izip_longest و ifilterfalse.
from itertools import izip
print(list(izip([1, 2], [3])))

در عوض از six.moves برای وارد کردن یک تابع سازگار با Python 2 و Python 3 استفاده کنید:

from six.moves import zip
print(list(zip([1, 2], [3])))
•
یک بررسی‌کننده جدید Python 3 برای هشدار در مورد دسترسی به فیلدهای منسوخ‌شده از ماژول types مانند ListType یا IntType افزوده شد.
from types import ListType
print(isinstance([], ListType))

در عوض از اعلان‌های موجود در فضای نام builtin استفاده کنید:

print(isinstance([], list))
•
یک بررسی‌کننده جدید Python 3 برای هشدار در مورد اعلان متد next افزوده شد که در Python 2 پروتکل Iterator را پیاده‌سازی می‌کرد، اما اکنون در Python 3 یک متد عادی است.
class Foo(object):
    def next(self):
        return 42

در عوض متد __next__ را پیاده‌سازی کنید و از six.Iterator به عنوان کلاس پایه بهره ببرید یا برای __next__ نام مستعار next را قرار دهید:

class Foo(object):
    def __next__(self):
        return 42
    next = __next__
•
سه بررسی‌کننده جدید Python 3 برای هشدار در مورد استفاده از متدهای دیکشنری در بافت‌های غیرتکرارشونده افزوده شدند.

برای نمونه، موارد زیر در Python 3 تکرارکننده (iterator) بازمی‌گردانند:

.. code-block:: python
d = {} d.keys()[0] d.items()[0] d.values() + d.keys()
یک بررسی جدید برای انتقال به Python 3 اضافه شد: non-ascii-bytes-literals

این پیام هر زمان که تشخیص داده شود یک رشتهٔ بایت حاوی نویسه‌های غیر ASCII است صادر می‌شود، که در Python 3 منجر به یک SyntaxError خواهد شد.

•
یک هشدار جدید، raising-format-tuple، مواردی را شناسایی می‌کند که در آن‌ها احتمالاً هدف پرتاب یک استثنا با رشتهٔ پیام قالب‌بندی‌شده بوده است، اما کد واقعی قالب‌بندی را از قلم انداخته و در عوض رشتهٔ الگو و پارامترهای مقدار را به عنوان آرگومان‌های جداگانه به سازندهٔ استثنا فرستاده است. بنابراین مواردی مانند این را شناسایی می‌کند:
raise SomeError('message about %s', foo)
raise SomeError('message about {}', foo)

که احتمالاً منظور به جای آن این بوده است:

raise SomeError('message about %s' % foo)
raise SomeError('message about {}'.format(foo))

این هشدار را می‌توان در پروژه‌هایی که عمداً از قالب‌بندی تنبل (lazy formatting) پیام‌ها در تمام مدیریت‌کننده‌های استثنای رو به کاربر استفاده می‌کنند نادیده گرفت.

•
پیرو توصیه‌های PEP479 https://peps.python.org/pep-0479، یک بررسی‌کنندهٔ جدید برای Python 3.0 جهت هشدار دربارهٔ پرتاب StopIteration درون یک generator اضافه شد. پرتاب StopIteration درون generator ممکن است به دلیل فراخوانی مستقیم raise StopIteration باشد:
def gen_stopiter():
    yield 1
    yield 2
    yield 3
    raise StopIteration

در عوض از یک دستور سادهٔ return استفاده کنید:

def gen_stopiter():
    yield 1
    yield 2
    yield 3
    return

پرتاب StopIteration ممکن است به دلیل فراخوانی تابع next با یک generator به عنوان آرگومان نیز رخ دهد:

def gen_next_raises_stopiter():
    g = gen_ok()
    while True:
        yield next(g)

در این حالت، فراخوانی next را با یک بلوک try/except احاطه کنید:

def gen_next_raises_stopiter():
    g = gen_ok()
    while True:
        try:
            yield next(g)
        except StopIteration:
            return
•
بررسی مربوط به پرتاب StopIteration درون generator در صورتی که استثنای پرتاب‌شده از StopIteration ارث‌بری کرده باشد نیز معتبر است.

Closes #1385


•
یک بررسی‌کنندهٔ جدید Python برای هشدار دربارهٔ استفاده از عملگر + درون فراخوانی متدهای logging هنگامی که یکی از عملوندها یک رشتهٔ لفظی (literal string) باشد اضافه شد:
import logging
var = "123"
logging.log(logging.INFO, "Var: " + var)

در عوض از رشتهٔ قالب‌بندی‌شده و آرگومان‌های مکانی استفاده کنید:

import logging
var = "123"
logging.log(logging.INFO, "Var: %s", var)
•
یک بررسی‌کنندهٔ جدید Python برای هشدار دربارهٔ inconsistent-return-statements اضافه شد. یک تابع یا متد در صورتی دارای عبارت‌های بازگشتی ناسازگار است که مقادیر صریح و ضمنی را هم‌زمان بازگرداند:
def mix_implicit_explicit_returns(arg):
    if arg < 10:
        return True
    elif arg < 20:
        return

طبق PEP8 https://peps.python.org/pep-0008، اگر هر عبارت بازگشتی مقداری را بازگرداند، تمام عبارت‌های بازگشتی دیگری که هیچ مقداری بازنمی‌گردانند باید صراحتاً به صورت return None قید شوند، و یک عبارت بازگشتی صریح باید در انتهای تابع (در صورت دسترسی‌پذیر بودن) موجود باشد. بنابراین، تابع قبلی باید به این شکل نوشته شود:

def mix_implicit_explicit_returns(arg):
    if arg < 10:
        return True
    elif arg < 20:
        return None

Closes #1267


  • اصلاح رشته‌ی u'' در پیام superfluous-parens / C0325 <#superfluous-parens>.
  • گزینه‌های پیکربندی بررسی‌کننده‌ی نام نامعتبر به طور چشمگیری بازطراحی شده‌اند. قواعد از پیش تعریف‌شده‌ای برای شیوه‌های نام‌گذاری رایج معرفی شد. برای راه‌اندازی‌های معمول، می‌توان گزینه‌های کاربرپسندی مانند --function-naming-style=camelCase را به جای عبارات منظم دست‌نویس به کار برد. پیکربندی پیش‌فرض linter شیوه‌ی نام‌گذاری سازگار با PEP8 را اعمال می‌کند. برای جزئیات به مستندات مراجعه کنید.
  • ایجاد (raise) استثنای معنادار در صورت انتخاب کلاس reporter (قالب خروجی) نامعتبر.
  • افزونه‌ی docparams اکنون اجازه می‌دهد docstring یک ویژگی (property)، هم خود ویژگی و هم setter را مستند کند. بنابراین setterها نیز می‌توانند بدون docstring باشند.
  • افزونه‌ی docparams اکنون نحو نوع ویژگی (property type syntax) را درک می‌کند.
class Foo(object):
    @property
    def foo(self):
        """My Sphinx style docstring description.
        :type: int
        """
        return 10
class Foo(object):
    @property
    def foo(self):
        """int: My Numpy and Google docstring style description."""
        return 10
  • در صورت استفاده از --output-format=json، دیکشنری بازگردانده‌شده شامل یک جفت کلید-مقدار جدید است. کلید message-id و مقدار آن شناسه پیام است.
  • بررسی‌کننده‌ی املا دارای پارامتر پیکربندی جدید max-spelling-suggestions است که بر حداکثر تعداد پیشنهادهای گنجانده‌شده در پیام ارسالی تأثیر می‌گذارد.
  • بررسی :ref:`invalid-name` شامل نام قالبی است که باعث بروز خطا شده است.

    برای کد مشخص‌شده، pylint پیش از این invalid-name را به صورت Invalid constant name var صادر می‌کرد، بدون اینکه مشخص کند چرا var نام مناسبی نیست.

    با این تغییر، اکنون مشخص‌تر است که برای پذیرفته‌شدن یک نام بر اساس قالب متناظر آن، چه چیزی باید اصلاح شود.

  • پرچم پیکربندی جدیدی با نام suggestion-mode معرفی شد. با فعال بودن آن، pylint تلاش می‌کند به جای خطاهای بی‌مورد در برخی سناریوهای شناخته‌شده مثبت کاذب، پیشنهادهای کاربرپسند ارائه دهد. این پرچم به طور پیش‌فرض فعال است.
  • پیام superfluous-parens دیگر به اشتباه برای گزاره‌های منطقی شامل عملگر in صادر نمی‌شود (برای نمونه‌ای از آنچه قبلاً مثبت کاذب بود، مثال زیر را ببینید).
foo = None
if 'bar' in (foo or {}):
  pass
  • تعریف مجدد تابع dummy اکنون ممکن است. در صورت بازتعریف توابع dummy، پیام function-redefined دیگر صادر نخواهد شد.
  • هنگامی که Args و Keyword Args در Google docstring ترکیب شده باشند، پیام‌های missing-param-doc و missing-type-doc دیگر صادر نمی‌شوند.
  • رفع مثبت کاذب پیام useless-super-delegation هنگامی که مقادیر پیش‌فرض پارامترها با مقادیر استفاده‌شده در کلاس پایه متفاوت است.
  • رفع مثبت کاذب پیام useless-else-on-loop هنگامی که دستورات break به صورت عمیق در حلقه تودرتو شده‌اند.
  • بررسی‌کننده‌ی مهاجرت به Python 3 دیگر به ازای هر فایل چندین پیام no-absolute-import صادر نمی‌کند.
  • بررسی‌کننده‌ی مهاجرت به Python 3 بررسی‌کننده‌های غیرفعال‌شده در فایل پیکربندی را رعایت می‌کند.
  • ماژول‌ها، کلاس‌ها، یا متدهایی که شامل دستورهای مرکب فراتر از docstring-min-length هستند، اکنون به درستی پیام missing-docstring را صادر می‌کنند.
  • رفع عدم صدور پیام wrong-import-order هنگام ترتیب‌بندی کتابخانه‌های داخلی (first party) و شخص ثالث (third party). با این اصلاح، pylint ماژول‌های داخلی و شخص ثالث را هنگام بررسی ترتیب import تفکیک می‌کند.
  • رفع نادیده گرفته‌شدن دستورالعمل‌های pylint disable=fixme برای کامنت‌های پس از آخرین دستور در یک فایل.
  • رفع غیرفعال‌شدن پیام line-too-long توسط دستورالعمل نادرست disable. دستورالعمل disable=fixme دیگر صدور پیام line-too-long را برای خطوط کامنت طولانی غیرفعال نمی‌کند.
  • اگر rcfile مشخص‌شده در خط فرمان وجود نداشته باشد، یک استثنای IOError ایجاد (raise) می‌شود.
  • اصلاح محدوده‌ی نادرست دستورالعمل disable= پس از یک خط کامنت‌شده. به عنوان مثال، هنگامی که یک دستورالعمل disable=line-too-long در پایان یک خط کامنت طولانی قرار دارد، دیگر صدور پیام line-too-long را برای خطوط پس از آن غیرفعال نمی‌کند.

تاریخ انتشار: 2017-12-15

•
شماره نسخه نادرست در __pkginfo__.

تاریخ انتشار: 2017-12-15

  • رعایت disable=... در فایل پیکربندی هنگام اجرا با --py3k.
  • هشدار جدید shallow-copy-environ افزوده شد

    کپی سطحی (Shallow copy) از os.environ آن‌طور که افراد انتظار دارند کار نمی‌کند. os.environ یک شیء dict نیست بلکه یک شیء پراکسی است، بنابراین هر تغییری که روی نسخهٔ کپی‌شده ایجاد شود ممکن است اثرات غیرمنتظره‌ای روی os.environ بگذارد.

    به جای متد copy.copy(os.environ) باید از os.environ.copy() استفاده شود.

    برای جزئیات https://bugs.python.org/issue15373 را ببینید.

    بستن #1301

  • عدم نمایش چندبارهٔ هشدار no-absolute-import برای هر فایل.
بررسی بازآرایی trailing-comma-tuple اکنون به انتساب‌هایی با
بیش از یک عنصر (مانند لیست‌ها) تعمیم داده شده است

بستن #1713

  • اصلاح رشتهٔ u'' در پیام superfluous-parens / C0325 <#superfluous-parens>

    بستن #1420

  • پیام abstract-class-instantiated اکنون برای همهٔ مسیرهای استنتاج صادر می‌شود.

    بستن #1673

  • افزودن مجموعه‌ای از شیوه‌های نام‌گذاری پیش‌تعریف‌شده برای تسهیل پیکربندی بررسی قراردادهای نام‌گذاری.

    بستن #1013

  • افزودن یک بررسی جدید، keyword-arg-before-vararg

    این پیام برای تعریف توابعی صادر می‌شود که در آن‌ها آرگومان‌های کلیدواژه‌ای پیش از آرگومان‌های موقعیتی متغیر (*args) قرار گرفته‌اند.

    این امر ممکن است در صورتی که مقدار آرگومان کلیدواژه‌ای در فراخوانی تابع مشخص نشود، با این فرض که مقدار پیش‌فرض ارائه‌شده در تعریف را خواهد گرفت، به تغییر فهرست args منجر شود.

  • بررسی invalid-name شامل نام الگویی است که باعث بروز خطا شده است

    بستن #1176

  • استفاده از پرچم -j فرآیندهای لینتر فرزند بیشتری از حد نیاز را اجرا نخواهد کرد.

    بستن #1614

  • رفع یک مورد مثبت کاذب در bad-python3-import برای واردسازی‌های نسبی

    بستن #1608

  • افزودن یک بررسی جدید برای پایتون ۳، non-ascii-bytes-literals

    بستن #1545

  • افزودن چند بررسی جدید در پایتون ۳ برای دسترسی به متدهای dict در بسترهای غیرقابل‌پیمایش (non-iterable)
  • بررسی‌های پروتکل (not-a-mapping / E1134 <#not-a-mapping>، not-an-iterable / E1133 <#not-an-iterable> و موارد مشابه) برای کلاس‌های دارای getattr پویا صادر نمی‌شوند
  • افزودن یک هشدار جدید، bad-thread-instantiation / W1506 <#bad-thread-instantiation>'

    این پیام زمانی صادر می‌شود که کلاس threading.Thread آرگومان target را دریافت نکند، اما فقط یک آرگومان دریافت کند که به طور پیش‌فرض پارامتر group است.

    بستن #1327

  • در حالت غیرساکت (non-quiet)، مسیر مطلق فایل پیکربندی استفاده‌شده در خطای استاندارد ثبت می‌شود.

    بستن #1519

  • ایجاد استثنای معنادار در صورت انتخاب کلاس گزارش‌گر (reporter) نامعتبر

    هنگامی که یک کلاس گزارش‌گر ناشناخته به عنوان گزارش‌گر Pylint انتخاب شود، پیام خطای معناداری به جای یک ImportError یا AttributeError خامِ مربوط به پیدا نشدن ماژول یا کلاس گزارش‌گر ایجاد می‌شود.

    بستن #1388

  • افزودن یک بررسی جدید در پایتون ۳ برای دسترسی به توابع حذف‌شده از itertools مانند izip یا ifilterfalse
  • افزودن یک بررسی جدید در پایتون ۳ برای دسترسی به فیلدهای حذف‌شده از ماژول types مانند UnicodeType یا XRangeType
  • افزودن یک بررسی جدید در پایتون ۳ برای اعلان متد next که در پایتون ۲ به عنوان یک iterator در نظر گرفته می‌شد اما در پایتون ۳ یک تابع عادی است.
  • افزودن یک جفت کلید-مقدار جدید در خروجی json. کلید message-id و مقدار آن شناسهٔ پیام است.

    بستن #1512

  • افزودن یک بررسی جدید در پایتون 3.0 برای بالا انداختن StopIteration درون یک generator. بررسی بالا انداختن StopIteration درون مولد همچنین در صورتی که استثنای ایجادشده از StopIteration ارث‌بری کرده باشد معتبر است.

    بستن #1385

  • افزودن هشدار جدید، raising-format-tuple، برای تشخیص ساخت استثنا با چند آرگومان به جای قالب‌بندی رشتهٔ پیام.
  • افزودن یک بررسی جدید برای متدهایی از ماژول logging که رشته‌ها را با عملگر + متصل می‌کنند

    بستن #1479

  • افزودن پارامتری برای محدود کردن تعداد پیشنهادات در بررسی‌کننده‌های غلط‌یاب املایی
  • رفع یک حالت خاص در بررسی‌کنندهٔ consider-using-ternary.

    هنگامی که شیء A مورد استفاده در X and A or B در بستر بولی دارای مقدار نادرست (falsy) بود، Pylint به اشتباه یک پیشنهاد بر پایه عملگر سه‌گانه صادر می‌کرد که معادل آن نبود. پس از این تغییر، پیام به درستی برای این حالت صادر نمی‌شود.

    بستن #1559

  • افزودن پرچم پیکربندی suggestion-mode. هنگامی که این پرچم فعال باشد، به جای پیام خطای نامفهوم برای ویژگی‌های فراخوانی‌شده در c-extensions، پیام اطلاعاتی صادر می‌شود.

    بستن #1466

  • رفع پیام مثبت کاذب useless-super-delegation هنگامی که مقادیر پیش‌فرض پارامترها با مقادیر استفاده‌شده در کلاس پایه متفاوت باشند.

    بستن #1085

  • غیرفعال‌سازی wrong-import-order / C0411 <#wrong-import-order>'، wrong-import-position / C0413 <#wrong-import-position>' یا ungrouped-imports / C0412 <#ungrouped-imports>' برای یک خط مشخص، اکنون از ایجاد تخلف توسط آن خط در خطوط بعدی جلوگیری می‌کند.

    بستن #1336

  • افزودن یک بررسی جدید پایتون برای دستورهای بازگشت (return) ناسازگار درون متد یا تابع.

    بستن #1267

  • رفع مثبت کاذب superfluous-parens مربوط به مدیریت عبارت‌های منطقی شامل عملگر in.

    بستن #574

  • پیام function-redefined دیگر برای توابع و متدهایی که نام آن‌ها با عبارت باقاعدهٔ نام متغیر ساختگی (dummy) مطابقت دارد، صادر نمی‌شود.

    بستن #1369

  • رفع مثبت‌های کاذب در missing-param-doc و missing-type-doc هنگام ترکیب Args و Keyword Args در docstring به سبک Google.

    بستن #1409

•
رفع منفی‌های کاذب (false negatives) در missing-docstring هنگامی که ماژول‌ها، کلاس‌ها، یا متدها شامل دستورهای مرکبی هستند که از docstring-min-length فراتر می‌روند
رفع مثبت‌های کاذب useless-else-on-loop هنگامی که دستورهای break به‌صورت عمیق درون حلقه تو در تو شده‌اند.

بسته شد #1661

  • رفع عدم صدور پیام wrong-import-order در ترتیب کتابخانه‌های داخلی (first party) و شخص ثالث (third party). با این اصلاح، pylint هنگام بررسی ترتیب وارد کردن (import)، ماژول‌های شخص ثالث و داخلی را متمایز می‌کند.

    بسته شد #1702

  • رفع نادیده گرفته شدن دستورالعمل‌های pylint disable=fixme برای کامنت‌های پس از آخرین عبارت در یک فایل.

    بسته شد #1681

  • رفع غیرفعال‌سازی پیام line-too-long توسط دستورالعمل غیرفعال‌سازی اشتباه. دستورالعمل disable=fixme دیگر صدور پیام line-too-long را برای خطوط طولانی کامنت‌شده غیرفعال نمی‌کند.

    بسته شد #1741

  • اگر rcfile مشخص‌شده در خط فرمان وجود نداشته باشد، یک استثنای IOError ایجاد می‌شود.

    بسته شد #1747

  • رفع حوزه اثر (scope) نادرست دستورالعمل disable= پس از یک خط کامنت‌شده. برای نمونه هنگامی که یک دستورالعمل disable=line-too-long در انتهای یک خط کامنت‌شده طولانی قرار دارد، دیگر صدور پیام line-too-long را برای خطوط پس از آن غیرفعال نمی‌کند.

    بسته شد #1742

از ابتدای pylint تا نسخه 2.14.0 (شامل آن)، یک گزارش تغییرات (changelog) داشتیم که دربردارنده تمام تغییرات مهم Pylint بود، از جمله تغییراتی که مربوط به کاربر نهایی نبود؛ یعنی تغییراتی که ممکن است تنها در صورتی برای شما جالب باشد که توسعه‌دهنده‌ای باشید که روی pylint یا افزونه‌های pylint کار می‌کند یا یک تاریخ‌نگار منبع‌باز باشید.

از pylint 1.6.0 تا 2.14.0، علاوه بر گزارش تغییرات کامل، خلاصه‌ای از تغییرات (عمدتاً مربوط به کاربر) نیز وجود داشت.

  • بررسی single-string-used-for-slots اضافه شد، که هرگاه کلاسی از یک رشته منفرد به عنوان مقدار slot استفاده کند به کار می‌رود. اگرچه این مورد از نظر فنی فی‌نفسه مشکلی ندارد، اما ممکن است کاربران را هنگام دستکاری مقدار slots به عنوان یک شیء پیمایش‌پذیر (iterable) به اشتباه بیندازد، که این امر به نوبه خود منجر به پیمایش روی نویسه‌های مقدار slot می‌شود. برای سرراست‌تر بودن، همواره سعی کنید از یک نگه‌دارنده (container) مانند یک list یا یک tuple برای تعریف مقادیر slot استفاده کنید.
  • ما یک بررسی جدید اضافه کردیم، literal-comparison، که هرگاه pylint بتواند مقایسه با یک لیترال (literal) را تشخیص دهد به کار می‌رود. این معمولاً چیزی نیست که می‌خواهیم و به‌طور بالقوه خطازاست. برای نمونه، در مثال ارائه‌شده، اولین مقایسه رشته مقدار true برمی‌گرداند، زیرا رشته‌های کوچک‌تر توسط مفسر اینترن (intern) می‌شوند، در حالی که برای رشته‌های بزرگ‌تر مقدار False برمی‌گرداند:
mystring = "ok"
if mystring is "ok": # Returns true
   ...
mystring = "a" * 1000
if mystring is ("a" * 1000): # This will return False
   ...

به جای استفاده از عملگر is، باید از عملگر == برای این مورد استفاده کنید.

•
ما یک پیام بازآرایی (refactoring) جدید اضافه کردیم، consider-merging-isinstance، که هرگاه تشخیص دهیم فراخوانی‌های پیاپی isinstance را می‌توان با یکدیگر ادغام کرد صادر می‌شود. برای نمونه، در این مثال می‌توانیم دو فراخوانی اول isinstance را ادغام کنیم:
# $ cat a.py
if isinstance(x, int) or isinstance(x, float):
    pass
if isinstance(x, (int, float)) or isinstance(x, str):
    pass
# $ pylint a.py
# R:  1, 0: Consider merging these isinstance calls to isinstance(x, (float, int)) (consider-merging-isinstance)
# R:  3, 0: Consider merging these isinstance calls to isinstance(x, (int, float, str)) (consider-merging-isinstance)
•
یک بررسی خطای جدید اضافه شد، invalid-metaclass، که هرگاه pylint تشخیص دهد کلاسی معین از یک فراکلاس (metaclass) استفاده می‌کند که برای هدف آن کلاس نامعتبر است، به کار می‌رود. این موضوع معمولاً می‌تواند نشان‌دهنده مشکلی در کد باشد، تا کاری که عمداً انجام شده باشد.
# Needs to inherit from *type* in order to be valid
class SomeClass(object):
    ...
class MyClass(metaclass=SomeClass):
    pass
•
یک هشدار جدید اضافه شد، useless-super-delegation، که هرگاه تشخیص دهیم یک متد بازنویسی‌شده (overridden) بی‌استفاده است و با اتکا به واگذاری super() دقیقاً همان کار متد دیگری از MRO را انجام می‌دهد، به کار می‌رود.

برای نمونه، در این مثال دو متد اول بی‌استفاده هستند، زیرا دقیقاً همان کار متدهای کلاس‌های پایه را انجام می‌دهند، در حالی که دو متد بعدی این‌گونه نیستند، چون عملیات بیشتری را با آرگومان‌های ارائه‌شده انجام می‌دهند.

class Impl(Base):
    def __init__(self, param1, param2):
        super(Impl, self).__init__(param1, param2)
    def useless(self, first, second):
        return super(Impl, self).useless(first, second)
    def not_useless(self, first, **kwargs):
        debug = kwargs.pop('debug', False)
        if debug:
            ...
        return super(Impl, self).not_useless(first, **kwargs)
    def not_useless_1(self, first, *args):
        return super(Impl, self).not_useless_1(first + some_value, *args)
•
یک هشدار جدید اضافه شد، len-as-condition، که هرگاه تشخیص دهیم یک شرط به نادرستی از len(SEQUENCE) استفاده می‌کند، به کار می‌رود. به جای آن می‌توان از if SEQUENCE یا if not SEQUENCE استفاده کرد.

برای نمونه، همه مثال‌های زیر:

if len(S):
  pass
if not len(S):
  pass
if len(S) > 0:
  pass
if len(S) != 0:
  pass
if len(S) == 0:
  pass

می‌توانند به روشی طبیعی‌تر نوشته شوند:

if S:
  pass
if not S:
  pass
برای اطلاعات بیشتر به https://peps.python.org/pep-0008/#programming-recommendations مراجعه کنید.
•
افزونه‌ی جدیدی به نام emptystring.py اضافه شده است که مقایسه با ثابت‌های رشته‌ی خالی را تشخیص می‌دهد. این افزونه به صورت پیش‌فرض غیرفعال است. برای نمونه، مثال‌های زیر:
if S != "":
  pass
if S == '':
  pass

می‌توانند به شیوه‌ای طبیعی‌تر نوشته شوند:

if S:
  pass
if not S:
  pass

یک استثنا برای این مورد زمانی است که رشته‌ی خالی مقداری مجاز باشد که معنای آن متفاوت با None در نظر گرفته می‌شود. به عنوان مثال، معنای آن می‌تواند این باشد که کاربر هیچ گزینه‌ی اضافی انتخاب نکرده است در مقابل اینکه کاربر هنوز انتخابی انجام نداده است!

می‌توانید این بررسی‌کننده را با افزودن خط زیر:

load-plugins=pylint.extensions.emptystring

به بخش MAIN در فایل .pylintrc خود، یا با استفاده از دستور زیر فعال کنید:

$ pylint a.py --load-plugins=pylint.extensions.emptystring
•
افزونه‌ی جدیدی به نام comparetozero.py اضافه شده است که مقایسه‌ی اعداد صحیح با صفر را تشخیص می‌دهد. این افزونه به صورت پیش‌فرض غیرفعال است. برای نمونه، مثال‌های زیر:
if X != 0:
  pass
if X == 0:
  pass

می‌توانند به شیوه‌ای طبیعی‌تر نوشته شوند:

if X:
  pass
if not X:
  pass

یک استثنا برای این مورد زمانی است که صفر مقداری مجاز باشد که معنای آن متفاوت با None در نظر گرفته می‌شود. برای مثال، این معنا می‌تواند این باشد که None یعنی بدون محدودیت، در حالی که 0 به این معناست که محدودیت صفر است!

می‌توانید این بررسی‌کننده را با افزودن خط زیر:

load-plugins=pylint.extensions.comparetozero

به بخش MAIN در فایل .pylintrc خود، یا با استفاده از دستور زیر فعال کنید:

$ pylint a.py --load-plugins=pylint.extensions.comparetozero
•
شرایط خطای جدیدی برای bad-super-call اضافه کرده‌ایم که اکنون استفاده از الگوهای super(type(self), self) و super(self.__class__, self) را تشخیص می‌دهد. این موارد می‌توانند منجر به حلقه‌ی بازگشتی در کلاس‌های مشتق‌شده شوند. این مشکل تنها زمانی آشکار می‌شود که کلاسی را بازنویسی کنید که از این فراخوانی‌های نادرست super() استفاده می‌کند.

برای نمونه، Derived.__init__() به درستی Base.__init__ را فراخوانی می‌کند. در این نقطه، مقدار type(self) برابر با Derived خواهد بود و فراخوانی دوباره به سمت Base.__init__ رفته و وارد یک حلقه‌ی بازگشتی می‌شویم.

class Base(object):
    def __init__(self, param1, param2):
        super(type(self), self).__init__(param1, param2)
class Derived(Base):
    def __init__(self, param1, param2):
        super(Derived, self).__init__(param1, param2)
•
هشدارهای missing-returns-doc و missing-yields-doc هر کدام با دو هشدار جدید، یعنی missing-[return|yield]-doc و missing-[return|yield]-type-doc جایگزین شده‌اند. تفکیک این موارد به هشدارهای جداگانه به کاربر اجازه می‌دهد تا بسته به اینکه شیوه‌نامه‌ی مستندسازی‌اش به توضیحات متنی return/yield تابع، مشخص کردن نوع‌های return/yield، یا هر دو نیاز دارد، گزینه‌ی مناسب را برگزیند.
# This will raise missing-return-type-doc but not missing-return-doc
def my_sphinx_style_func(self):
    """This is a Sphinx-style docstring.
    :returns: Always False
    """
    return False
# This will raise missing-return-doc but not missing-return-type-doc
def my_google_style_func(self):
    """This is a Google-style docstring.
    Returns:
        bool:
    """
    return False
•
یک بررسی بازسازی کد جدید به نام redefined-argument-from-local اضافه شده است؛ این اخطار زمانی صادر می‌شود که pylint تشخیص دهد در برخی موارد مستعد خطا، یک آرگومان تابع به صورت محلی بازتعریف شده است. برای نمونه در قطعه‌کد زیر یک باگ وجود دارد، زیرا با توجه به مقایسه‌ی یک شیء با ویژگی‌های خودش، این بررسی هرگز مقدار True را برنمی‌گرداند.
def test(resource):
    for resource in resources:
        # The ``for`` is reusing ``resource``, which means that the following
        # ``resource`` is not what we wanted to check against.
        if resource.resource_type == resource:
           call_resource(resource)
جاهای دیگری که این بررسی زیر نظر می‌گیرد عبارتند از مقیدسازی‌های نام در دستور with و مقیدسازی نام گردانندهٔ except.
•
یک بررسی بازآفرینی کد (refactoring) جدید اضافه شد، no-else-return، که زمانی که pylint با یک else پس از زنجیره‌ای از شرط‌های if مواجه شود که همگی حاوی عبارت return هستند، صادر می‌شود.
def foo1(x, y, z):
    if x:
        return y
    else:  # This is unnecessary here.
        return z

می‌توان این مورد را با حذف عبارت else اصلاح کرد.

def foo1(x, y, z):
    if x:
        return y
    return z
•
یک بررسی جدید برای Python 3 اضافه شد، eq-without-hash، که کلاس‌هایی را که __eq__ را پیاده‌سازی می‌کنند ملزم می‌سازد همچنین __hash__ را پیاده‌سازی کنند. رفتار کلاس‌هایی که __eq__ را پیاده‌سازی می‌کنند اما فاقد __hash__ هستند در Python 3 تغییر یافته است؛ در Python 2 چنین کلاس‌هایی object.__hash__ را به‌عنوان پیاده‌سازی پیش‌فرض دریافت می‌کردند. در Python 3، کلاس‌های مذکور None را به‌عنوان پیاده‌سازی خود دریافت می‌کنند که باعث می‌شود قابلیت هش‌شدن را از دست بدهند (unhashable شوند).
class JustEq(object):
   def __init__(self, x):
     self.x = x
   def __eq__(self, other):
     return self.x == other.x
class Neither(object):
  def __init__(self, x):
    self.x = x
class HashAndEq(object):
   def __init__(self, x):
     self.x = x
   def __eq__(self, other):
     return self.x == other.x
   def __hash__(self):
     return hash(self.x)
{Neither(1), Neither(2)}  # OK in Python 2 and Python 3
{HashAndEq(1), HashAndEq(2)}  # OK in Python 2 and Python 3
{JustEq(1), JustEq(2)}  # Works in Python 2, throws in Python 3

به‌طور کلی، این یک شیوهٔ نامناسب است که انگیزهٔ این تغییر رفتار شد.

as_set = {JustEq(1), JustEq(2)}
print(JustEq(1) in as_set)  # prints False
print(JustEq(1) in list(as_set))  # prints True

به منظور رفع این خطا و پرهیز از تفاوت‌های رفتاری میان Python 2 و Python 3، کلاس‌ها یا باید صریحاً __hash__ را روی None تنظیم کنند یا یک تابع هش‌گذاری پیاده‌سازی نمایند.

class JustEq(object):
   def __init__(self, x):
     self.x = x
   def __eq__(self, other):
     return self.x == other.x
   __hash__ = None
{JustEq(1), JustEq(2)}  # Now throws an exception in both Python 2 and Python 3.
•
۳ بررسی‌کنندهٔ جدید برای Python 3 اضافه شد: div-method، idiv-method و rdiv-method. متدهای جادویی __div__ و __idiv__ در Python 3 به نفع __truediv__ منسوخ و کنار گذاشته شده‌اند. کلاس‌هایی که __div__ را پیاده‌سازی می‌کنند و هنوز باید از طریق کدهای Python 2 که از from __future__ import division استفاده نمی‌کنند به کار گرفته شوند، باید __truediv__ را پیاده‌سازی کرده و __div__ را به عنوان نام مستعار (alias) آن پیاده‌سازی تنظیم کنند.
from __future__ import division
class DivisibleThing(object):
   def __init__(self, x):
     self.x = x
   def __truediv__(self, other):
     return DivisibleThing(self.x / other.x)
   __div__ = __truediv__
•
یک بررسی‌کنندهٔ جدید برای Python 3 اضافه شد تا دربارهٔ دسترسی به مشخصهٔ message در Exceptions هشدار دهد. مشخصهٔ message در Python 2.7 منسوخ شد و در Python 3 حذف گردید. برای اطلاعات بیشتر https://peps.python.org/pep-0352/#retracted-ideas را ببینید.
try:
  raise Exception("Oh No!!")
except Exception as e:
  print(e.message)

به جای اتکا به مشخصهٔ message، باید به‌طور صریح استثنا را به یک رشته تبدیل کنید:

try:
  raise Exception("Oh No!!")
except Exception as e:
  print(str(e))
•
یک بررسی‌کنندهٔ جدید برای Python 3 اضافه شد تا دربارهٔ استفاده از encode یا decode روی رشته‌ها با کدک‌های غیرمتنی هشدار دهد. این بررسی همچنین فراخوانی‌های open با آرگومان کلیدواژه‌ای encoding را نیز بررسی می‌کند. برای اطلاعات بیشتر https://docs.python.org/3/whatsnew/3.4.html#improvements-to-codec-handling را ببینید.
'hello world'.encode('hex')

به جای استفاده از متد encode برای کدک‌های غیرمتنی، از ماژول codecs استفاده کنید.

import codecs
codecs.encode('hello world', 'hex')
•
یک هشدار جدید اضافه شد، overlapping-except، که زمانی صادر می‌شود که یک گردانندهٔ except دو استثنا را مدیریت کند که با یکدیگر هم‌پوشانی دارند. این بدان معناست که یکی از استثناها والد (کلاس پایهٔ) استثنای دیگر است یا صرفاً یک نام مستعار برای آن است..sp به‌عنوان مثال، در Python 3.3+‎، نام IOError یک نام مستعار برای OSError است. علاوه بر این، socket.error نیز نام مستعاری برای OSError است. هدف، یافتن مواردی شبیه به نمونه زیر است:
import socket
try:
    pass
except (ConnectionError, IOError, OSError, socket.error):
    pass
•
یک بررسی‌کننده جدید Python 3 برای هشدار درباره دسترسی به sys.maxint اضافه شد. این مشخصه در Python 3 به نفع sys.maxsize حذف شد.
import sys
print(sys.maxint)

به جای استفاده از sys.maxint، از sys.maxsize استفاده کنید

import sys
print(sys.maxsize)
•
یک بررسی‌کننده جدید Python 3 اضافه شد تا درباره وارد کردن (import) ماژول‌هایی که جابه‌جا شده یا از کتابخانه استاندارد حذف شده‌اند هشدار دهد.

یکی از اقدامات عمده در Python 3، سازمان‌دهی مجدد کتابخانه استاندارد برای حذف ماژول‌های قدیمی یا منسوخ‌شده و بازسازمان‌دهی برخی از ماژول‌های موجود بود. در نتیجه، تقریباً ۱۰۰ ماژول که در Python 2 وجود داشتند، دیگر در Python 3 وجود ندارند. برای اطلاعات بیشتر به https://peps.python.org/pep-3108 و https://peps.python.org/pep-0004 مراجعه کنید. پیشنهادهایی درباره نحوه مدیریت این موضوع در pythonhosted.org/six/#module-six.moves (پیوند نامعتبر) یا python3porting.com/stdlib.html (پیوند نامعتبر) ارائه شده بود.

from cStringIO import StringIO

به جای وارد کردن مستقیم ماژول منسوخ‌شده، از six.moves یا یک import شرطی استفاده کنید.

from six.moves import cStringIO as StringIO
if sys.version_info[0] >= 3:
    from io import StringIO
else:
    from cStringIO import StringIO

این بررسی‌کننده فرض می‌کند هر وارد کردنی که درون یک شرط یا یک بلوک try/except انجام شود، معتبر است.

•
یک بررسی‌کننده جدید Python 3 اضافه شد تا درباره دسترسی به توابع منسوخ‌شده در ماژول string هشدار دهد. در Python 3 توابعی که از کلاس توکار (builtin) str تکرار شده بودند حذف شدند. برای اطلاعات بیشتر به https://docs.python.org/2/library/string.html#deprecated-string-functions مراجعه کنید.
import string
print(string.upper('hello world!'))

به جای استفاده از string.upper، متد upper را مستقیماً روی شیء رشته فراخوانی کنید.

"hello world!".upper()
•
یک بررسی‌کننده جدید Python 3 اضافه شد تا درباره فراخوانی str.translate با پارامتر حذف‌شده deletechars هشدار دهد. تابع str.translate معمولاً به عنوان راهکاری برای حذف کاراکترها از یک رشته استفاده می‌شود.
'hello world'.translate(None, 'low')

متأسفانه، روش استانداردی برای نوشتن این فراخوانی به گونه‌ای که با هر دو نسخه ۲ و ۳ سازگار باشد وجود ندارد. اگر این کد در مسیر حیاتی (critical path) برنامه شما قرار ندارد و استفاده از translate یک بهینه‌سازی زودهنگام بوده است، استفاده از re.sub را به عنوان جایگزین در نظر بگیرید:

import re
chars_to_remove = re.compile('[low]')
chars_to_remove.sub('', 'hello world')

اگر این کد در مسیر حیاتی برنامه شما قرار دارد و باید تا حد امکان سریع باشد، تعریف یک متد کمکی وابسته به نسخه Python را در نظر بگیرید.

if six.PY3:
    def _remove_characters(text, deletechars):
        return text.translate({ord(x): None for x in deletechars})
else:
    def _remove_characters(text, deletechars):
        return text.translate(None, deletechars)
•
یک بررسی بازآرایی کد (refactoring) جدید به نام consider-using-ternary اضافه شد؛ این هشدار زمانی صادر می‌شود که pylint ساختارهایی را شناسایی کند که پیش از معرفی عبارت سه‌تایی در Python 2.5، برای شبیه‌سازی آن استفاده می‌شدند.
value = condition and truth_value or false_value

این هشدار را می‌توان با استفاده از ساختار استاندارد سه‌تایی برطرف کرد:

value = truth_value if condition else false_value
•
یک بررسی بازآرایی کد جدید به نام trailing-comma-tuple اضافه شد؛ این هشدار زمانی صادر می‌شود که pylint یک تاپل تک‌عنصری را پیدا کند که در اثر یک ویرگول اضافی و سرگردان ایجاد شده است. این مورد می‌تواند نشان‌دهنده یک مشکل احتمالی در کد باشد و توصیه می‌شود به جای تکیه بر خود ویرگول، از پرانتز برای تأکید بر ساخت تاپل استفاده شود.

هشدار برای چنین ساختاری صادر می‌شود:

a = 1,

این هشدار را می‌توان با افزودن پرانتز برطرف کرد:

a = (1, )
•
دو بررسی جدید برای تشخیص عملیات پشتیبانی‌نشده روی یک نمونه اضافه شد: unsupported-assignment-operation و unsupported-delete-operation. مورد اول زمانی صادر می‌شود که یک شیء از انتساب آیتم پشتیبانی نکند، در حالی که مورد دوم زمانی صادر می‌شود که شیء از حذف آیتم پشتیبانی نکند:
class A:
    pass
instance = A()
instance[4] = 4 # unsupported-assignment-operation
del instance[4] # unsupported-delete-operation
  • یک بررسی جدید اضافه شد، relative-beyond-top-level، که زمانی صادر می‌شود که یک واردسازی نسبی تلاش کند به سطوحی فراتر از بالاترین سطح بستهٔ جاری دسترسی یابد.
  • یک بررسی جدید اضافه شد، trailing-newlines، که زمانی صادر می‌شود که یک فایل دارای خطوط جدید اضافی در انتها باشد.
  • بررسی invalid-length-returned اضافه شد، که وقتی پیاده‌سازی __len__ یک عدد صحیح غیرمنفی برنگرداند صادر می‌شود.
  • یک افزونه جدید به نام pylint.extensions.mccabe وجود دارد که می‌تواند برای محاسبهٔ پیچیدگی مک‌کیب (McCabe) کلاس‌ها و توابع استفاده شود.

    می‌توانید این افزونه را از طریق --load-plugins=pylint.extensions.mccabe فعال کنید.

  • یک بررسی جدید اضافه شد، used-prior-global-declaration. این بررسی زمانی صادر می‌شود که یک نام پیش از اعلان سراسری (global) استفاده شده باشد، که در Python 3.6 منجر به SyntaxError می‌شود.
  • یک پیام جدید اضافه شد، assign-to-new-keyword. این پیام زمانی صادر می‌شود که نام استفاده‌شده در انتشار آیندهٔ Python تبدیل به یک کلمهٔ کلیدی شود. انتساب به کلمات کلیدی پس از تغییر به نسخهٔ جدیدتر مفسر منجر به SyntaxError خواهد شد.
# While it's correct in Python 2.x, it raises a SyntaxError in Python 3.x
True = 1
False = 0
# Same as above, but it'll be a SyntaxError starting from Python 3.7
async = "async"
await = "await"

  • اگر اشیاء استنتاج مبهم (opaque inference) در نتایج استنتاج وجود داشته باشند، به‌طور پیش‌فرض no-member صادر نمی‌شود

    این رفتار توسط پرچم جدید --ignore-on-opaque-inference کنترل می‌شود که به‌طور پیش‌فرض True است. استنتاج می‌تواند در حین ارزیابی یک شیء Python چندین نتیجهٔ بالقوه برگرداند، اما ممکن است برخی شاخه‌ها ارزیابی نشوند که منجر به استنتاج ناقص می‌شود. در این حالت، ممکن است همچنان صادر کردن no-member / E1101 <#no-member> و سایر بررسی‌ها برای بقیهٔ اشیاء استنتاج‌شده مفید باشد.

  • بسته‌های فضای نام (Namespace packages) اکنون توسط pylint پشتیبانی می‌شوند. این شامل هر دو نوع بسته‌های فضای نام صریح و بسته‌های فضای نام ضمنی است که در Python 3 از طریق PEP 420 پشتیبانی می‌شوند.
  • گزینهٔ جدیدی اضافه شد: --analyse-fallback-block.

    این گزینه می‌تواند برای پشتیبانی از کدهای بلوک واردسازی سازگار با هر دو نسخهٔ Python 2 و 3 استفاده شود؛ بدین معنی که بلوک واردسازی ممکن است کدی داشته باشد که فقط در یکی از مفسرها وجود دارد و هنگام تحلیل منجر به مثبت کاذب (false positive) می‌شود. به‌طور پیش‌فرض، مقدار این گزینه false است؛ می‌توانید تحلیل هر دو شاخه را با استفاده از این پرچم فعال کنید.

  • گزینهٔ ignored-argument-names اکنون برای نادیده گرفتن آرگومان‌ها در بررسی unused-variable / W0612 <#unused-variable> استفاده می‌شود.

    این گزینه قبلاً برای نادیده گرفتن آرگومان‌ها هنگام محاسبهٔ تعداد صحیح آرگومان‌هایی که یک تابع باید داشته باشد استفاده می‌شد، اما برای مدیریت آرگومان‌ها با توجه به بررسی unused-variable / W0612 <#unused-variable>، به جای آن از dummy-variables-rgx استفاده می‌شد. اکنون، ignored-argument-names علاوه بر کاربرد اصلی خود، برای نادیده گرفتن آرگومان‌های منطبق با الگو برای بررسی unused-variable / W0612 <#unused-variable> نیز استفاده می‌شود. این قابلیت کنترل بهتری بر روی اینکه چه مواردی باید نادیده گرفته شوند و چگونه، ارائه می‌دهد. همچنین، همین گزینه از بررسی‌کنندهٔ design به بررسی‌کنندهٔ variables منتقل شد، که بدان معنی است که گزینه اکنون زیر بخش [VARIABLES] در فایل پیکربندی قرار می‌گیرد.

  • گزینهٔ جدیدی اضافه شد، redefining-builtins-modules، برای کنترل ماژول‌هایی که می‌توانند توابع و مقادیر درونی (builtins) را بازتعریف کنند، مانند six.moves و future.builtins.
  • گزینهٔ جدیدی اضافه شد، ignore-patterns، که برای ایجاد یک فهرست نادیده‌گیری از دایرکتوری‌ها و فایل‌های منطبق بر الگوهای regex استفاده می‌شود، مشابه گزینهٔ ignore.
  • گزارش‌ها (reports) اکنون به‌طور پیش‌فرض غیرفعال هستند، همچنین هشدارهای دسته‌بندی اطلاعاتی (information category).
  • بررسی arguments-differ بازنویسی شد تا پارامترهای فقط-کلیدواژه‌ای (keyword-only) و متغیرها (variadics) را در نظر بگیرد.

    اکنون این بررسی در مورد حذف یا افزودن قابلیت‌ها به یک متد، از طریق معرفی متغیرهای موضعی یا کلیدواژه‌ای نیز هشدار می‌دهد. به عنوان مثال، pylint اکنون در این موارد هشدار می‌دهد:

class Parent(object):
    def foo(self, first, second):
        ...
    def bar(self, **kwargs):
        ...
    def baz(self, *, first):
        ...
class Child(Parent):
    # Why subclassing in the first place?
    def foo(self, *args, **kwargs):
        # mutate args or kwargs.
        super(Child, self).foo(*args, **kwargs)
    def bar(self, first=None, second=None, **kwargs):
        ...
        # The overridden method adds two new parameters,
        # which can also be passed as positional arguments,
        # breaking the contract of the parent's method.
    def baz(self, first):
        ...
        # Not keyword-only
•
بررسی redefined-outer-name اکنون در صورتی که متغیر هدفِ یک حلقهٔ تودرتو با حلقهٔ بیرونی یکسان باشد نیز صادر می‌شود.
for i, j in [(1, 2), (3, 4)]:
    for j in range(i):
        print(j)
  • محدودیت تعداد نویسه‌ها برای نام‌های متد و توابعی که با _ شروع می‌شوند کاهش یافت. این موضوع اجازه می‌دهد تا افراد بتوانند نام‌های توصیفی طولانی‌تری برای متدها و توابعی با حوزهٔ اثر (scope) کوتاه‌تر (که خصوصی تلقی می‌شوند) استفاده کنند. همین ایده برای نام‌های متغیرها نیز با یک قاعدهٔ معکوس اعمال می‌شود: شما نام‌های توصیفی طولانی را برای متغیرهایی با حوزهٔ اثر بزرگ‌تر، مانند متغیرهای سراسری (globals) می‌خواهید.
  • افزودن کلاس استثنای InvalidMessageError و جایگزینی assert در pylint.utils با raise InvalidMessageError.
  • کلاس‌های UnknownMessageError (قبلاً UnknownMessage) و EmptyReportError (قبلاً EmptyReport) اکنون توسط زیرماژول جدید pylint.exceptions به جای pylint.utils ارائه می‌شوند.
  • اکنون از یادداشت‌های درون‌خطی (inline comments) برای مقادیر جدا شده با کاما در پیکربندی‌ها پشتیبانی می‌کنیم

    به عنوان مثال، اکنون می‌توانید از علامت # برای درج یادداشت در مقادیر جدا شده با کاما استفاده کنید، همان‌طور که در زیر مشاهده می‌شود:

disable=no-member, # Don't care about it for now
        bad-indentation, # No need for this
        import-error
البته، ترکیب توضیحات با مقادیر نیز کار می‌کند:
disable=no-member,
        # Don't care about it for now
        bad-indentation # No need for this

این قابلیت با تنظیم مناسب پیشوندهای توضیحات درون‌خطی https://docs.python.org/3/library/configparser.html#customizing-parser-behaviour کار می‌کند.

  • افزودن پشتیبانی از docstring با فرمت epytext به افزونه docparams.
  • پشتیبانی از ارائه راهنمایی در صورت نیافتن عضو ناموجود اضافه شد.

    برای مثال، با توجه به کد زیر، باید مشخص باشد که برنامه‌نویس قصد استفاده از صفت mail را داشته است، نه email.

class Contribution:
    def __init__(self, name, email, date):
        self.name = name
        self.mail = mail
        self.date = date
for c in contributions:
    print(c.email) # Oups

اکنون pylint هشدار خواهد داد که احتمال وجود یک خطای نگارشی وجود دارد و نام‌های جدیدی را پیشنهاد می‌دهد که می‌توان به جای آن استفاده کرد.

$ pylint a.py
E: 8,10: Instance of 'Contribution' has no 'email' member; maybe 'mail'?

این رفتار از طریق گزینه --missing-member-hint کنترل می‌شود. گزینه‌های دیگری که همراه با این تغییر اضافه شده‌اند عبارتند از --missing-member-max-choices برای انتخاب تعداد کل گزینه‌هایی که باید در این وضعیت ارائه شوند و --missing-member-hint-distance که معیاری را برای محاسبه فاصله بین نام‌ها مشخص می‌کند (این معیار بر اساس فاصله لون‌اشتاین (Levenshtein) است، به این معنی که هرچه عدد کمتر باشد، الگوریتم سخت‌گیرتر خواهد بود).

•
متد PyLinter.should_analyze_file دارای یک پارامتر جدید به نام is_argument است که مشخص می‌کند آیا مسیر داده‌شده یک آرگومان pylint است یا خیر.

متد should_analyze_file هر زمان که pylint بخواهد تعیین کند آیا یک فایل باید تحلیل شود یا خیر فراخوانی می‌شود که به طور پیش‌فرض روی فایل‌های با پسوند .py تنظیم است، اما این تابع تنها زمانی فراخوانی می‌شود که فایل مذکور به عنوان آرگومان خط فرمان به pylint ارسال نشده باشد. این معمولاً بدان معناست که pylint یک فایل را حتی اگر پسوند متفاوتی داشته باشد، تا زمانی که فایل به طور صریح در خط فرمان مشخص شده باشد تحلیل می‌کند. از آنجا که نمی‌توان should_analyze_file را برای مدیریت تمام حالت‌ها بازنویسی کرد، بررسی منشأ فایل‌ها به درون should_analyze_file منتقل شد. این یعنی اکنون می‌توانیم کدی مشابه این مثال بنویسیم تا هر فایلی را که دارای ویژگی مورد نظر است، بدون در نظر گرفتن منشأ فایل (چه فایلی باشد که به عنوان آرگومان خط فرمان ارسال شده و چه بخشی از یک بسته باشد)، نادیده بگیریم.

from pylint.lint import Run, PyLinter
class CustomPyLinter(PyLinter):
     def should_analyze_file(self, modname, path, is_argument=False):
         if respect_condition(path):
             return False
         return super().should_analyze_file(modname, path, is_argument=is_argument)
class CustomRun(Run):
     LinterClass = CustomPyLinter
CustomRun(sys.argv[1:])
  • وارد کردن‌هایی که با زیرخط نام مستعار گرفته‌اند، هنگام بررسی برای موارد استفاده‌نشده نادیده گرفته می‌شوند.
  • موارد bad-builtin و redefined-variable-type اکنون به افزونه تبدیل شده‌اند و به طور پیش‌فرض غیرفعال هستند. آنها را می‌توان از طریق زیر فعال کرد: --load-plugins=pylint.extensions.redefined_variable_type,pylint.extensions.bad_builtin
•
بررسی‌کننده وارد کردن‌ها از سوییچ جدید allow-wildcard-with-all پشتیبانی می‌کند که هنگام تعریف متغیر __all__ در ماژول واردشده، هشدار مربوط به وارد کردن همگانی (wildcard import) را غیرفعال می‌کند.
•
اکنون differing-param-doc برای بخش مغایر از missing-param-doc قدیمی، و differing-type-doc برای بخش مغایر از missing-type-doc قدیمی استفاده می‌شود.
  • رفع یک مورد مثبت کاذب در redundant-returns-doc، که زمانی رخ می‌داد که تابع مستندشده به‌جای return از yield استفاده می‌کرد.
  • رفع یک مورد مثبت کاذب در missing-param-doc و missing-type-doc، که زمانی رخ می‌داد که docstring یک کلاس از رشته جادویی For the parameters, see استفاده می‌کرد اما docstring متد __init__ کلاس استفاده نمی‌کرد، یا برعکس.
  • استنتاج مناسب نوع استثنا برای missing-raises-doc افزوده شد. اکنون:
def my_func():
    """"My function."""
    ex = ValueError('foo')
    raise ex

در میان سناریوهای دیگر، اکنون به‌جای :raises ex: به‌درستی برای نبود مستندسازیِ :raises ValueError: پرچم‌گذاری می‌شود.

  • رفع موارد مثبت کاذب در missing-[raises|params|type]-doc به دلیل عدم شناسایی مترادف‌های کلیدواژه‌ای معتبری که توسط Sphinx پشتیبانی می‌شوند.
  • اعتبارسنجی دقیق‌تر در MessagesStore.register_messages() جهت تشخیص تداخل میان یک پیام جدید و هرگونه شناسه پیام (message id)، نماد (symbol) یا old_names موجود.
  • اکنون از داشتن پلاگین‌هایی که نام یکسانی به اشتراک می‌گذارند و هر یک گزینه‌هایی ارائه می‌دهند، پشتیبانی می‌شود.

    یک پلاگین می‌تواند از نظر منطقی به چندین کلاس تقسیم شود، به‌طوری که هر کلاس قابلیت‌های مشخصی ارائه دهد و همگی تحت یک نام یکپارچه شوند. اما هنگامی که دو یا چند مورد از این کلاس‌ها گزینه‌هایی نیز اضافه می‌کردند، pylint دچار فروپاشی (crash) می‌شد، زیرا بخش اولیه‌ای را که با آن مواجه شده بود از قبل اضافه کرده بود. اکنون این موارد باید مطابق انتظار کار کنند.

from pylint.checkers import BaseChecker
class DummyPlugin1(BaseChecker):
    name = 'dummy_plugin'
    msgs = {'I9061': ('Dummy short desc 01', 'dummy-message-01', 'Dummy long desc')}
    options = (
        ('dummy_option_1', {
            'type': 'string',
            'metavar': '<string>',
            'help': 'Dummy option 1',
        }),
    )
class DummyPlugin2(BaseChecker):
    name = 'dummy_plugin'
    msgs = {'I9060': ('Dummy short desc 02', 'dummy-message-02', 'Dummy long desc')}
    options = (
        ('dummy_option_2', {
            'type': 'string',
            'metavar': '<string>',
            'help': 'Dummy option 2',
        }),
    )
def register(linter):
    linter.register_checker(DummyPlugin1(linter))
    linter.register_checker(DummyPlugin2(linter))
•
برای پیاده‌سازی‌های singledispatch اخطار unused-argument صادر نمی‌شود و برای چندین پیاده‌سازی با نام یکسان نیز هشداری درباره function-redefined داده نمی‌شود.
from functools import singledispatch
@singledispatch
def f(x):
    return 2*x
@f.register(str)
def _(x):
    return -1
@f.register(int)
@f.register(float)
def _(x):
    return -x
  • بررسی‌کننده unused-variable قابلیت جدیدی برای هشدار درباره متغیرهای بلااستفاده در فضای نام سراسری ماژول دارد. از آنجا که متغیرهای سراسری در فضای نام ماژول ممکن است بخشی از API عمومی باشند، این بررسی به‌طور پیش‌فرض غیرفعال است. برای فعال کردن آن، گزینه allow-global-unused-variables را روی false تنظیم کنید.
  • رفع یک پیام مثبت کاذب در logging-format-interpolation، هنگامی که مشخصات قالب‌بندی در رشته قالب‌بندی‌شده استفاده می‌شوند. به‌طور کلی، این عملیات همیشه به قالب‌بندی سبک قدیمیِ مورد استفاده در ماژول logging قابل تبدیل نیستند.
  • کلید جدید single-line-class-stmt برای مجاز کردن تعریف تک‌خطی بدنه خالی کلاس‌ها (همان‌طور که در مثال زیر دیده می‌شود) افزوده شد. با فعال بودن این گزینه، pylint پیام multiple-statements صادر نخواهد کرد.
class MyError(Exception): pass
•
هنگامی که از عبارات ستاره‌دار در تاپل سمت راست (RHS tuple) استفاده می‌شود، خطاهای too-many-format-args و too-few-format-args به‌درستی صادر می‌شوند (یا در صورتی که تعداد دقیق عناصر در RHS قابل استنتاج نباشد، اصلاً صادر نمی‌شوند). برای مثال، بلوک کدی که در زیر نشان داده شده است به‌درستی تشخیص می‌دهد که تاپل استفاده‌شده در واقع دارای سه عنصر است، نه دو عنصر.
meat = ['spam', 'ham']
print('%s%s%s' % ('eggs', *meat))
•
بررسی‌کننده cyclic-import از دستورهای محلی غیرفعال‌سازی پشتیبانی می‌کند. هنگامی که یکی از واردسازی‌های حلقه‌ای در دامنه‌ای انجام شده باشد که دستور غیرفعال‌سازی در آن فعال بوده است، این چرخه به‌عنوان تخلف گزارش نمی‌شود.
  • ابزار pylint-gui حذف شد، زیرا برای گنجانده شدن در pylint نامناسب تشخیص داده شد. این ابزار دارای چند باگ و ویژگی نامطلوب بود، کارایی و سهولت استفاده از آن پایین‌تر از حد استاندارد بود و از آنجا که توسعهٔ آن نادیده گرفته شده بود، تصمیم بر این شد که بدون آن ادامه دهیم.
  • گزارش‌گر HTML به‌همراه گزینهٔ --output-format=html حذف شد. این بخش اخیراً در Pylint به حاشیه رفته بود و عمدتاً نادیده گرفته می‌شد. از آنجا که اکنون گزارش‌گر JSON را داریم، می‌توان از آن به‌عنوان پایه‌ای برای ایجاد گزارش‌های HTML زیباتر از آنچه Pylint در حال حاضر تولید می‌کند، استفاده کرد. این مورد بخشی از تلاش‌ها برای پالایش کدهای زائد Pylint از طریق حذف ویژگی‌های کمتر استفاده‌شده است.
  • گزینهٔ --files-output حذف شد. اگرچه نمی‌توان عملکرد مشابه را به‌سادگی بازسازی کرد، اما برای مثال می‌توان از گزارش‌گر JSON به‌عنوان پایه‌ای برای تولید پیام‌ها به ازای هر فایل استفاده کرد.
  • گزینهٔ --required-attributes حذف شد.
  • گزینهٔ --ignore-iface-methods حذف شد.
  • پرچم --optimize-ast حذف شد.

    این گزینه در ابتدا برای مدیریت حالت‌های حاد (pathological cases) اضافه شده بود، مانند الحاق بیش از حد رشته‌ها با استفاده از عملگر جمع، که باعث می‌شد pylint هنگام تلاش برای تشخیص محتوای رشته دچار خطای بازگشتی (recursion error) شود. متأسفانه تصمیم گرفتیم این مشکل را نادیده بگیریم، چرا که این حالت حاد هنگام تجزیهٔ کد توسط پایتون نیز، پیش از رسیدن به مرحلهٔ زمان اجرا، رخ می‌داد و بنابراین تصمیم گرفتیم این خطا را به‌طور کامل حذف کنیم.

  • پارامتر script در epylint.py_run حذف شد.

    اکنون epylint.py_run همیشه از متد پایه‌ای epylint.lint از مفسر فعلی استفاده می‌کند. این کار از برخی مشکلات در زمان نصب بودن چندین نمونه از pylint جلوگیری می‌کند، که باعث می‌شد epylint.py_run اسکریپت متفاوتی از epylint را نسبت به آنچه مد نظر بود اجرا کند.

تاریخ انتشار: 2017-04-17

  • رفع یک مورد مثبت کاذب (false positive) که هنگام بازبرانگیختن یک استثنا رخ می‌داد.

    بسته شدن #1419

  • رفع یک مورد مثبت کاذب در disallow-trailing-tuple

    این بررسی با راستی‌آزمایی خط‌های جدیدِ غیرپایان‌بخش (non-terminating newlines) بهبود یافت که باید فراخوانی‌های تابع و تعاریف تابع را از این بررسی معاف کند.

    بسته شدن #1424

تاریخ انتشار: 2017-04-13

  • عدم صدور پیام‌های missing-final-newline / C0304 <#missing-final-newline> یا trailing-whitespace / C0303 <#trailing-whitespace> برای نویسه‌های انتقال صفحه (formfeed / page break).

    بسته شدن #1218 و #1219

  • عدم صدور پیش‌فرض پیام no-member / E1101 <#no-member> در صورتی که شیءهای استنتاجیِ کدر (opaque inference objects) در نتایج استنتاج وجود داشته باشند.

    این رفتار توسط پرچم جدید ignore-on-opaque-inference کنترل می‌شود که به‌طور پیش‌فرض True است. فرایند استنتاج می‌تواند هنگام ارزیابی یک شیء پایتون چندین نتیجهٔ بالقوه برگرداند، اما ممکن است برخی شاخه‌ها ارزیابی نشوند که منجر به استنتاج جزئی می‌شود. در چنین حالتی، ممکن است همچنان صدور no-member / E1101 <#no-member> و سایر بررسی‌ها برای بقیهٔ شیءهای استنتاج‌شده سودمند باشد.

  • افزودن پیام جدید assign-to-new-keyword برای هشدار در مورد انتساب به نام‌هایی که در نگارش‌های آیندهٔ پایتون به کلمهٔ کلیدی تبدیل خواهند شد.

    بسته شدن #1351

  • تفکیک بخش‌های 'missing or differing' در مستندسازی پارامترها به خطاهای جداگانه. پیام differing-param-doc / W9017 <#differing-param-doc> بخش مغایرت را از پیام قدیمی missing-param-doc / W9015 <#missing-param-doc>' پوشش می‌دهد، و differing-type-doc / W9018 <#differing-type-doc>' بخش مغایرت نوع را از پیام قدیمی missing-type-doc / W9016 <#missing-type-doc>' پوشش می‌دهد.

    بسته شدن #1342

  • افزودن خطای جدید used-prior-global-declaration / E0118 <#used-prior-global-declaration>' که هنگام استفاده از یک نام پیش از اعلان global در یک تابع صادر می‌شود. این مورد در Python 3.6 باعث SyntaxError می‌شود.

    بسته شدن #1257

  • بررسی‌های پروتکل (protocol checks) اکنون زمانی که یک متد خاص برابر با None تنظیم شده باشد پیام‌های خود را صادر می‌کنند.

    بسته شدن #1263

  • تشخیص صحیح این موضوع که آیا نام واردشده (imported name) به همان نام در یک حوزهٔ دید (scope) دیگر انتساب داده شده است یا خیر.

    بسته شدن #636، #848، #851 و #900

  • الزام قرار دادن یک فاصله برای حاشیه‌نویسی‌ها با راهنمای نوع (type hints)، مطابق با PEP 8.
  • بررسی trailing-comma-tuple / R1707 <#trailing-comma-tuple>' اضافه شد.

    این پیام هنگامی صادر می‌شود که pylint یک چندتایی (tuple) تک‌عنصری را پیدا کند که با یک کامای سرگردان ایجاد شده است. این موضوع می‌تواند نشان‌دهندهٔ یک مشکل بالقوه در کد باشد و توصیه می‌شود برای تأکید بر ساخت تاپل، به جای تکیه بر خودِ کاما از پرانتز استفاده شود.

  • عدم صدور not-callable / E1102 <#not-callable> برای نمونه‌هایی با کلاس‌های پایهٔ ناشناخته (unknown bases).

    بسته شدن #1213

  • رفتار یکسان با آرگومان‌های فقط کلیدواژه‌ای (keyword-only) مشابه آرگومان‌های مکانی (positional) در بررسی unused-argument / W0613 <#unused-argument>.
  • عدم تلاش برای دسترسی به متغیرهای تعریف‌شده در یک حوزهٔ دید جداگانه هنگام بررسی protected-access.
  • افزودن بررسی جدید برای تشخیص استفادهٔ نادرست از len(SEQUENCE) در شرط‌های ارزیابی.
  • افزودن افزونهٔ جدید برای تشخیص مقایسه‌ها با مقادیر ثابت رشته‌ای خالی.
  • افزودن افزونهٔ جدید برای تشخیص مقایسهٔ اعداد صحیح با صفر.
  • افزودن شرایط خطای جدید برای bad-super-call / E1003 <#bad-super-call>'

    اکنون مواردی نظیر super(type(self), self) و super(self.__class__, self) را که می‌توانند منجر به حلقهٔ بازگشتی در کلاس‌های مشتق‌شده شوند تشخیص می‌دهد.

  • متد PyLinter.should_analyze_file یک پارامتر اختیاری جدید به نام is_argument دارد.

    بسته شدن #1079

  • افزودن راهنماهای ویژگی (attribute hints) برای اعضای ناموجود.

    بسته شدن #1035

  • افزودن یک هشدار جدید، redefined-argument-from-local / R1704 <#redefined-argument-from-local>'

    بسته شدن #649

  • پشتیبانی از یادداشت‌های درون‌خطی (inline comments) برای مقادیر جداشده با کاما در فایل پیکربندی.

    بسته شدن #1024

  • پارامتر script در epylint.py_run حذف شد.
  • ابزار epylint.py_run اکنون از shell=False برای اجرای فرایند زیرین استفاده می‌کند.

    بسته شدن #441

  • افزودن یک هشدار جدید، useless-super-delegation / W0235 <#useless-super-delegation>'

    بسته شدن 839.

  • افزودن خطای جدید invalid-metaclass / E1139 <#invalid-metaclass>'، که زمانی صادر می‌شود که تشخیص داده شود یک کلاس از یک متارده (metaclass) نامناسب استفاده می‌کند.

    بسته شدن #579

  • افزودن یک پیام بازآرایی (refactoring) جدید، literal-comparison / R0123 <#literal-comparison>'.

    بسته شدن #786

  • بررسی arguments-differ / W0221 <#arguments-differ> اکنون kwonlyargs و آرگومان‌های متغیر (variadics) را در نظر می‌گیرد.

    بسته شدن #983

  • حذف --optimized-ast

    رفع بخشی از #975

  • حذف گزینهٔ --files-output

    رفع بخشی از #975

  • حذف pylint-gui از بسته.
  • حذف گزارش‌گر HTML

    رفع بخشی از #975.IP • 2 گزینه ignored-argument-names اکنون برای نادیده گرفتن آرگومان‌ها در بررسی unused-variable / W0612 <#unused-variable> استفاده می‌شود.

    این گزینه پیش‌تر برای نادیده گرفتن آرگومان‌ها هنگام محاسبه تعداد صحیح آرگومان‌هایی که یک تابع باید داشته باشد به کار می‌رفت، اما برای مدیریت آرگومان‌ها در رابطه با بررسی unused-variable / W0612 <#unused-variable>، به جای آن از dummy-variables-rgx استفاده می‌شد. اکنون، ignored-argument-names هم برای هدف اصلی خود و هم برای نادیده گرفتن آرگومان‌های منطبق در بررسی unused-variable / W0612 <#unused-variable> استفاده می‌شود. این قابلیت، کنترل بهتری را بر آنچه باید نادیده گرفته شود و نحوه آن فراهم می‌کند. همچنین، همین گزینه از بررسی‌کننده طرح (design) به بررسی‌کننده متغیرها (variables) منتقل شد، بدان معنا که این گزینه اکنون زیر بخش [VARIABLES] در فایل پیکربندی ظاهر می‌شود.

    بسته شدن #862.

  • رفع یک مثبت کاذب برای آرگومان‌های متغیر کلیدواژه‌ای در رابطه با آرگومان‌های فقط‌کلیدواژه‌ای.

    اگر یک آرگومان فقط‌کلیدواژه‌ای برای یک تابع ضروری بود، اما آن تابع با آرگومان‌های متغیر کلیدواژه‌ای (**kwargs) فراخوانی می‌شد، یک هشدار مثبت کاذب missing-kwoa / E1125 <#missing-kwoa> صادر می‌شد که اکنون برطرف شده است.

    بسته شدن #934.

  • رفع برخی موارد مثبت کاذب در آرگومان‌های متغیر با اندازه نامشخص.

    بسته شدن #878.

  • افزودن یک افزونه جدید، check_docstring، برای بررسی شیوه‌نامه‌های PEP 257.

    بسته شدن #868.

  • فایل‌های پیکربندی با نشانگرهای BOM اکنون قابل خواندن هستند.

    بسته شدن #864.

  • تابع epylint.py_run با استفاده از .communicate() به جای .wait() بر روی فایل‌های بزرگ دچار فروپاشی نمی‌شود.

    بسته شدن #599.

  • غیرفعال‌سازی پیش‌فرض گزارش‌ها و نمایش امتیاز ارزیابی به‌طور پیش‌فرض

    گزارش‌ها به‌طور پیش‌فرض غیرفعال شدند تا تعامل میان ابزار و کاربران ساده‌تر شود. امتیاز همچنان به‌طور پیش‌فرض نمایش داده می‌شود، به عنوان راهی برای سنجش دقیق زمان افزایش یا کاهش آن بر اثر تغییرات اعمال‌شده در کد.

    ارجاع به #746.

  • غیرفعال‌سازی پیام‌های دسته‌بندی اطلاعات به‌طور پیش‌فرض. این گامی در جهت معقول‌تر کردن pylint است.

    ارجاع به #746.

  • شناسایی موارد بیشتری به عنوان تکرارپذیرهای نامناسب برای __slots__ با توجه به الگوی invalid-slots / E0238 <#invalid-slots>.

    بسته شدن #775.

  • رشته‌های تورفتگی خالی رد می‌شوند.
  • افزودن خطای جدید relative-beyond-top-level / E0402 <#relative-beyond-top-level>'، که هنگام تلاش برای درون‌ریزی نسبی فراتر از بسته سطح بالا صادر می‌شود.

    بسته شدن #588.

  • افزودن هشدار جدید unsupported-assignment-operation / E1137 <#unsupported-assignment-operation>'، که هنگام تلاش برای انتساب عنصر روی شیئی که فاقد این قابلیت است صادر می‌شود.

    بسته شدن #591.

  • افزودن هشدار جدید unsupported-delete-operation / E1138 <#unsupported-delete-operation>'، که هنگام تلاش برای حذف عنصر روی شیئی که فاقد این قابلیت است صادر می‌شود.

    بسته شدن #592.

  • رفع مثبت کاذب redundant-returns-doc / W9008 <#redundant-returns-doc>'، که زمانی رخ می‌داد که تابع مستندشده به جای return از yield استفاده می‌کرد.

    بسته شدن #984.

  • رفع موارد مثبت کاذب 'missing-[raises|params|type]-doc' به دلیل عدم شناسایی مترادف‌های کلیدواژه‌ای پشتیبانی‌شده توسط Sphinx.
  • افزودن پیام بازآفرینی جدید، consider-merging-isinstance / R1701 <#consider-merging-isinstance>'، که هرگاه تشخیص داده شود فراخوانی‌های متوالی isinstance می‌توانند در یکدیگر ادغام شوند صادر می‌شود.

    بسته شدن #968.

  • رفع مثبت کاذب missing-param-doc / W9015 <#missing-param-doc>' و missing-type-doc / W9016 <#missing-type-doc>'، که زمانی رخ می‌داد که رشته مستندات یک کلاس از رشته جادویی 'For the parameters, see' استفاده می‌کرد اما رشته مستندات __init__ کلاس از آن استفاده نمی‌کرد، یا برعکس.
  • پیام redefined-outer-name اکنون در صورتی که متغیر هدف یک حلقه تودرتو همانند متغیر هدف در یک حلقه بیرونی باشد نیز صادر می‌شود.

    بسته شدن #911.

  • افزودن استنتاج مناسب نوع استثنا برای missing-raises-doc / W9006 <#missing-raises-doc>'.
  • افزودن کلاس استثنای InvalidMessageError برای جایگزینی assertها در pylint.utils.
  • اعتبارسنجی دقیق‌تر در MessagesStore.register_messages() به منظور جلوگیری از بازنویسی تصادفی یک پیام توسط پیامی دیگر.
  • استثناهای InvalidMessageError، UnknownMessage و EmptyReport به زیرپیمانه جدید pylint.exceptions منتقل شدند.
  • نام‌های UnknownMessage و EmptyReport به UnknownMessageError و EmptyReportError تغییر یافتند.
  • هشدارهای 'missing-returns-type-doc' و 'missing-yields-type-doc' هرکدام به دو هشدار تفکیک شدند - 'missing-[return|yield]-doc' و 'missing-[return|yield]-type-doc'.
  • افزودن پشتیبانی از epytext به افزونه docparams.

    بسته شدن #1029.

  • پشتیبانی از داشتن افزایه‌هایی با نام یکسان و با گزینه‌های تعریف‌شده

    بسته شدن #1018.

  • مرتب‌سازی گزینه‌های پیکربندی درون یک بخش

    بسته شدن #1087.

  • افزودن هشدار جدید پایتون ۳ پیرامون پیاده‌سازی '__div__'، '__idiv__'، یا '__rdiv__' زیرا این متدها در پایتون ۳ منسوخ شده‌اند.
  • افزودن هشدار جدید، overlapping-except / W0714 <#overlapping-except>'، که هنگامی صادر می‌شود که دو استثنا در یک بند except یکسان نام مستعار یکدیگر باشند یا یکی از استثناها والد دیگری باشد.
  • جلوگیری از فروپاشی در رشته‌های بدقالب هنگام بررسی خطاهای قالب‌بندی رشته.
  • افزودن هشدار جدید پایتون ۳ برای فراخوانی 'str.encode' یا 'str.decode' با کدگذاری غیرمتنی.
  • افزودن پیام جدید شیوه‌نامه کدنویسی، single-string-used-for-slots / C0205 <#single-string-used-for-slots>'.

    بسته شدن #1166.

  • افزودن بررسی جدید پایتون ۳ برای دسترسی به 'sys.maxint' که در پایتون ۳ به نفع 'sys.maxsize' حذف شده بود.
  • افزودن بررسی جدید پایتون ۳ برای درون‌ریزی‌های نامعتبر.
  • افزودن بررسی جدید پایتون ۳ برای دسترسی به توابع منسوخ‌شده رشته.
  • عدم هشدار درباره آرگومان‌های استفاده‌نشده یا بازتعریف شدن تابع در پیاده‌سازی‌های ثبت‌شده singledispatch.

    بسته شدن #1032 و #1034.

  • افزودن پیام بازآفرینی no-else-return / R1705 <#no-else-return>'.
  • بهبود بررسی‌کننده unused-variable / W0612 <#unused-variable> برای هشدار دادن درباره متغیرهای استفاده‌نشده در حوزه پیمانه.

    بسته شدن #919.

  • صرف‌نظر کردن از پیمانه‌های درون‌ریزی‌شده با نام _ هنگام بررسی درون‌ریزی‌های استفاده‌نشده.

    بسته شدن #1190.

  • بهبود رسیدگی به کلاس‌های پایتون ۳ با فراکلاس‌های تعریف‌شده در حوزه‌های تودرتو.

    بسته شدن #1177.

  • افزودن پیام بازآفرینی consider-using-ternary / R1706 <#consider-using-ternary>'.

    بسته شدن #1204.

  • رفع اشکال برای مثبت کاذب logging-format-interpolation` هنگامی که مشخصات قالب در رشته قالب‌بندی‌شده استفاده شده باشند.

    بسته شدن #572..IP • 2 کلید جدید single-line-class-stmt برای مجاز کردن اعلان تک‌خطی بدنه‌های خالی کلاس اضافه شد.

    بسته‌شدن #738

  • دسترسی به مشخصه‌های محافظت‌شده در قالب type(self)._attribute اکنون مجاز است.

    بسته‌شدن #1031

  • امکان ویرایش msg-template توسط کاربر هنگام فراخوانی Pylint از طریق یک اسکریپت Python فراهم شد.

    بسته‌شدن #1269

  • بررسی‌کننده واردات (Imports checker) از کلید جدید allow-wildcard-with-all پشتیبانی می‌کند که در صورت تعریف متغیر __all__ در ماژول واردشده، هشدار واردسازی عمومی (wildcard import) را غیرفعال می‌سازد.

    بسته‌شدن #831

  • هشدارهای too-many-format-args و too-few-format-args هنگامی که از عبارات ستاره‌دار در تاپل سمت راست (RHS) استفاده می‌شود، به درستی صادر می‌شوند.

    بسته‌شدن #957

  • بررسی‌کننده cyclic-import از بندهای غیرفعال‌سازی محلی پشتیبانی می‌کند. هنگامی که یکی از واردات‌های چرخه‌ای در محدوده‌ای انجام شده باشد که بند غیرفعال‌سازی در آن فعال بوده است، چرخه به عنوان تخلف گزارش نمی‌شود.

    بسته‌شدن #59

از آغاز pylint تا pylint 2.14.0 (شامل این نسخه)، ما گزارش تغییراتی داشتیم که شامل تمام تغییرات غیرجزئی در Pylint بود؛ از جمله تغییراتی که برای کاربر ملموس نبودند، یعنی تغییراتی که تنها در صورتی ممکن بود برایتان جالب باشند که توسعه‌دهنده‌ای شاغل روی pylint یا افزونه‌های pylint، یا یک تاریخ‌نگار نرم‌افزار متن‌باز باشید.

از pylint 1.6.0 تا 2.14.0، علاوه بر گزارش تغییرات کامل، خلاصه‌ای از تغییرات (عمدتاً کاربرمحور) نیز وجود داشت.

شماره‌های تیکت می‌توانند مربوط به سیستم داخلی logilab بوده یا از bitbucket آمده باشند.

مورد مهمی وجود ندارد.

•
یک بررسی توصیه‌ای جدید با نام consider-iterating-dictionary اضافه کردیم که هنگام پیمایش یک دیکشنری با استفاده از .keys() صادر می‌شود.

برای نمونه، کد زیر این هشدار را صادر می‌کند، زیرا کلیدهای دیکشنری را می‌توان بدون فراخوانی صریح این متد پیمایش کرد.

for key in dictionary.keys():
    ...
# Can be refactored to:
for key in dictionary:
    ...
  • بررسی trailing-newlines اضافه شد، که هنگام وجود خطوط خالی انتهایی در یک فایل صادر می‌شود.
  • بررسی invalid-length-returned اضافه شد، که هنگامی صادر می‌شود که متد ویژه __len__ مقداری غیر از یک عدد نامنفی بازگرداند. برای نمونه، این مثال آن را فعال می‌کند:
class Container(object):
    def __len__(self):
        return self._items # Oups, forgot to call len() over it.
  • افزودن یک بررسی جدید به افزونه check_docs برای جستجوی پارامترهای تکراری سازنده (constructor) در docstring سازنده کلاس یا در docstring کلاس.

    بررسی multiple-constructor-doc زمانی صادر می‌شود که پارامتر در هر دو مکان مستندسازی شده باشد.

  • ما یک پلاگین افزونه جدید به نام pylint.extensions.mccabe اضافه کردیم که می‌تواند برای هشدار دادن درباره پیچیدگی در کد مورد استفاده قرار گیرد.

    می‌توانید آن را به این صورت فعال کنید:

$ pylint module_or_project --load-plugins=pylint.extensions.mccabe

اطلاعات بیشتر را در بررسی‌کننده Design ببینید: <#pylint-extensions-mccabe>

•
اکنون generated-members از نام‌های واجد شرایط (qualified names) از طریق عبارات باقاعده پشتیبانی می‌کند.

برای نمونه، جهت نادیده‌گرفتن تمامی خطاهای تولیدشده توسط مشخصه‌های numpy.core، اکنون می‌توانیم بنویسیم:

$ pylint a.py --generated-members=numpy.*
•
افزوده شدن امکان نادیده‌گرفتن فایل‌ها بر اساس تطابق regex، با گزینه جدید --ignore-patterns.

به جای دستکاری گزینه موجود ignore، تصمیم گرفتیم یک گزینه جداگانه برای آن داشته باشیم. برای نمونه، جهت نادیده‌گرفتن تمامی فایل‌های آزمون، اکنون می‌توانیم استفاده کنیم از:

$ pylint myproject --ignore-patterns=test.*?py
•
ما یک گزینه جدید به نام redefining-builtins-modules اضافه کردیم که برای تعیین ماژول‌هایی به کار می‌رود که مجاز به بازتعریف عناصر توکار (builtins) هستند. دستور pylint در صورت بازتعریف یک شناسه توکار، مانند تعریف متغیری به نام next، خطا صادر خواهد کرد. اما در برخی موارد، عناصر توکار ممکن است در صورتی که از جاهایی غیر از ماژول builtins وارد شوند بازتعریف گردند، مانند ماژول six.moves که شامل توابع سازگار با نسخه‌های جدیدتر است:
$ cat a.py
# Oups, now pylint emits a redefined-builtin message.
from six.moves import open
$ pylint a.py --redefining-builtins-modules=six.moves

مقادیر پیش‌فرض: six.moves,future.builtins

  • رفع باگی که در آن بالاترین نام یک واردسازی واجد شرایط (qualified import) به عنوان متغیر استفاده‌نشده شناسایی می‌شد.
  • اگر شیء نمایه‌گذاری‌شده دارای کلاس‌های پایه ناشناخته‌ای باشد که Pylint نتواند آن‌ها را استنتاج کند، دیگر هشدار invalid-sequence-index صادر نمی‌شود.

  • بررسی bad-builtin به یک افزونه منتقل شد.

    این بررسی به توابع توکارِ استفاده‌شده‌ای که نباید استفاده می‌شدند ایراد می‌گرفت. برای مثال، map و filter در این دسته قرار می‌گرفتند، زیرا جایگزین‌های بهتری مانند ساخت لیست (list comprehension) قابل استفاده هستند. اما این بررسی آزاردهنده بود، چرا که استفاده از map یا filter می‌تواند موارد کاربرد خاص خود را داشته باشد؛ از این رو تصمیم گرفتیم آن را به عنوان یک بررسی در قالب افزونه منتقل کنیم. اکنون می‌توان آن را از طریق --load-plugins=pylint.extensions.bad_builtin فعال کرد.

  • ما به صورت داخلی از بک‌پورت configparser برای Python 2 استفاده می‌کنیم.

    این کار امکان قرار دادن کامنت درون مقادیر فهرستی در فایل پیکربندی را فراهم می‌سازد، مانند:

disable=no-member,
        # Don't like this check
        bad-indentation
  • ما اکنون به صورت داخلی از بسته isort در https://pypi.org/project/isort استفاده می‌کنیم.

    این کار بررسی `wrong-import-order را بهبود می‌بخشد، بنابراین اکنون خطاهای مثبت کاذب کمتری در رابطه با ترتیب واردسازی‌ها خواهیم داشت.

  • به طور پیش‌فرض، برای بلوک‌های واردسازی جایگزین (fallback import blocks) دیگر خطاهای import-error یا no-name-in-module صادر نمی‌شود.

    یک بلوک واردسازی جایگزین را می‌توان یک بلوک TryExcept دانست که در هر دو شاخه آن دستورات import وجود دارد، مانند:

try:
    import urllib.request as request
except ImportError:
    import urllib2 as request

در حالتی که pylint نتواند یک import را از شاخه except پیدا کند، خطای import-error صادر می‌کند؛ اما این موضوع هنگام تلاش برای نوشتن کدی سازگار با هر دو نسخه Python خسته‌کننده می‌شود. به همین دلیل، ما به طور پیش‌فرض این بلوک‌ها را بررسی نمی‌کنیم، اما می‌توان این تحلیل را با استفاده از پرچم جدید --analyse-fallback-block اجباری کرد.

•
پیام reimported هنگامی صادر می‌شود که یک نام یکسان از ماژول دیگری مجدداً وارد شود، مانند:
from collections import deque, OrderedDict, deque
  • پشتیبانی از HTML منسوخ شد و در نهایت در Pylint 1.7.0 حذف خواهد شد.

    این قابلیت اخیراً در Pylint به یک ویژگی درجه‌دو تبدیل شده بود که اغلب نادیده گرفته می‌شد و چندین باگ داشت. از آنجا که اکنون گزارش‌گر JSON را در اختیار داریم، می‌توان از آن به عنوان پایه‌ای برای خروجی‌های HTML زیباتر از آنچه Pylint در حال حاضر ارائه می‌دهد استفاده کرد.

  • گزینهٔ --files-output منسوخ شده است و در نهایت در Pylint 1.7.0 حذف خواهد شد.
  • گزینهٔ --optimize-ast منسوخ شده است و در نهایت در Pylint 1.7.0 حذف خواهد شد.

    این گزینه در ابتدا برای رسیدگی به موارد حاد (pathological cases) اضافه شده بود، مانند الحاق بیش از حد رشته‌ها با استفاده از عملگر جمع، که باعث می‌شد pylint هنگام تلاش برای تحلیل اینکه رشته چه بوده است با خطای بازگشتی (recursion error) مواجه شود. متأسفانه تصمیم گرفتیم از این موضوع صرف‌نظر کنیم، زیرا این مورد حاد هنگام تجزیه (parse) کد توسط خود پایتون نیز، بدون اینکه واقعاً به مرحلهٔ زمان اجرا برسد، رخ می‌داد؛ از این رو در آینده این گزینه را حذف خواهیم کرد.

  • افزونهٔ check_docs اکنون منسوخ شده است. این افزونه همچنان تحت نام docparams در دسترس است، بنابراین دستور زیر کار خواهد کرد:
$ pylint module_or_package --load-extensions=pylint.extensions.docparams

نام قدیمی همچنان برای سازگاری با گذشته حفظ شده است، اما در نهایت حذف خواهد شد.

•
هنوز موردی وجود ندارد

تاریخ انتشار: 2016-07-18

•
عدم فروپاشی (crash) هنگام استنتاج انواع استثناهای غیرقابل‌استنتاج برای افزونهٔ docparams

بسته شد #998

تاریخ انتشار: 2016-07-15

  • عدم فروپاشی هنگام چاپ راهنمای گزینه‌هایی با عبارات باقاعدهٔ پیش‌فرض

    بسته شد #990

  • نسخه‌های تفکیک‌شده‌تر و دقیق‌تر برای ماژول‌های منسوخ‌شده.

    بسته شد #991

تاریخ انتشار: 2016-07-07

•
استفاده از نشانگرهای محیطی (environment markers) برای پشتیبانی از وابستگی‌های شرطی.

تاریخ انتشار: 2016-07-03

  • افزودن یک افزونهٔ جدید، pylint.extensions.mccabe، برای هشدار در مورد پیچیدگی کد.
  • منسوخ شدن پشتیبانی از --optimize-ast

    برطرف‌سازی بخشی از #975

  • منسوخ شدن پشتیبانی از خروجی HTML

    برطرف‌سازی بخشی از #975

  • منسوخ شدن پشتیبانی از --output-files

    برطرف‌سازی بخشی از #975

  • رفع خطای مستندات در افزونهٔ check_docs.

    بسته شد #735

  • امکان پیکربندی فهرست دکوراتورهای تعریف‌کنندهٔ property.
  • رفع باگی که در آن نام سطح بالایی یک واردسازی واجد شرایط (qualified import) به عنوان متغیر استفاده‌نشده شناسایی می‌شد.

    بسته شد #923

  • بررسی bad-builtin / W0141 <#bad-builtin> اکنون به یک افزونه تبدیل شده است.
  • پشتیبانی generated-members از نام‌های واجد شرایط از طریق عبارات باقاعده.

    برای نمونه، می‌توان یک عبارت باقاعده مانند --generated-members=astroid.node_classes.* را برای نادیده گرفتن تمام خطاهای no-member / E1101 <#no-member> که مانند astroid.node_classes.missing.object فراخوانی می‌شوند تعیین کرد.

  • افزودن امکان نادیده گرفتن فایل‌ها بر اساس تطابق با عبارات باقاعده از طریق گزینهٔ جدید --ignore-patterns. امکان مشخص کردن چندین الگوی نادیده‌گیری فراهم شده است. به جای دستکاری گزینهٔ موجود ignore، گزینهٔ جدیدی به نام ignore-patterns اضافه شد.

    بسته شد #156

  • افزودن خطای جدید trailing-newlines / C0305 <#trailing-newlines>، که هنگام وجود خطوط خالی اضافه در انتهای فایل صادر می‌شود.

    بسته شد #682

  • افزودن یک گزینهٔ جدید، 'redefining-builtins-modules'، برای کنترل ماژول‌هایی که مجاز به بازتعریف شناسه‌های داخلی (builtins) هستند، مانند six.moves و future.builtins.

    بسته شد #464

  • خطای 'reimported' زمانی صادر می‌شود که یک نام یکسان از ماژول متفاوتی وارد (import) شود.

    بسته شد #162

  • افزودن یک بررسی‌کنندهٔ توصیه‌ای جدید، consider-iterating-dictionary / C0201 <#consider-iterating-dictionary>، که هنگام پیمایش دیکشنری از طریق .keys() صادر می‌شود.

    بسته شد #699

  • استفاده از نسخهٔ backport شدهٔ configparser برای Python 2

    این تغییر مشکلی را که با کامنت‌های داخل مقادیر وجود داشت حل می‌کند؛ این مشکل در configparser مربوط به Python 3 برطرف شده است.

    بسته شد #828

  • افزودن یک خطای جدید، invalid-length-returned / E0303 <#invalid-length-returned>، هنگامی که متد خاص __len__ مقداری به جز یک عدد نامنفی بازگرداند.

    بسته شد #557

  • تغییر سازوکار داخلی به استفاده از isort برای wrong-import-order / C0411 <#wrong-import-order>.

    بسته شد #879

  • افزونهٔ check_docs می‌تواند پارامترهای سازنده را در __init__ پیدا کند.

    بسته شد #887

  • عدم هشدار دربارهٔ invalid-sequence-index / E1126 <#invalid-sequence-index> در صورتی که شیء شاخص‌گذاری‌شده کلاس‌های پایهٔ ناشناخته داشته باشد.

    بسته شد #867

  • عدم فروپاشی هنگام بررسی super-init-not-called / W0231 <#super-init-not-called> برای متدی که درون یک بلوک if تعریف شده است.
  • عدم صدور خطاهای import-error / E0401 <#import-error> یا no-name-in-module / E0611 <#no-name-in-module> برای بلوک‌های واردسازی جایگزین (fallback import blocks) به صورت پیش‌فرض.

    تا پیش از این، در صورت یافتن یک بلوک واردسازی جایگزین (یک بلوک TryExcept که شامل واردسازی‌های مربوط به Python 2 و 3 بود) این هشدارها صادر می‌شدند، اما این موضوع هنگام نوشتن کدهای سازگار با هر دو نسخه دست‌وپاگیر است. به همین دلیل، ما به طور پیش‌فرض این بلوک‌ها را بررسی نمی‌کنیم، اما می‌توان با استفاده از پرچم جدید --analyse-fallback-block تحلیل آن‌ها را الزامی کرد.

    بسته شد #769.

شماره‌های تیکت معمولاً می‌توانند داخلیِ Logilab یا مربوط به Bitbucket باشند. در آخرین نسخه، این شماره‌ها شامل ایشوهای GitHub نیز می‌شوند..SS تازه‌های Pylint 1.5

تاریخ انتشار: 2016-03-21

  • اجازه فراخوانی visit_importfrom از بررسی‌کننده مهاجرت به Python 3 هنگامی که همه چیز غیرفعال است داده شد.

    به دلیل اینکه متد visit الگوهایی را که انتظار می‌رفت فعال باشند فیلتر می‌کرد، هنگامی که همه چیز به جز یک الگو غیرفعال بود اجرا نمی‌شد، که منجر به هشدارهای مثبت کاذب نابجا می‌گردید.

    حل مشکل #852

  • عدم صدور هشدار unsubscriptable-value برای کلاس‌هایی با کلاس‌های پایه ناشناخته.

    حل مشکل #776.

  • استفاده از یک OrderedDict برای ذخیره عناصر پیکربندی

    این کار مشکلی مربوط به ترتیب غیرقابل پیش‌بینی عناصر disable / enable در فایل پیکربندی را برطرف می‌کند. در موارد خاصی، عبارت disable پیش از enable قرار می‌گرفت که باعث می‌شد دسته‌هایی از خطاها فعال شوند، حتی اگر هدف غیرفعال کردن آن‌ها بود. بهترین مثال برای این وضعیت، هنگام اجرای چندین فرآیند رخ می‌داد که هر یک از آن‌ها تنظیمات فعال‌سازی / غیرفعال‌سازی متفاوتی داشتند و بر خروجی اثر می‌گذاشتند.

    حل مشکل #815

  • عدم در نظر گرفتن مدیریت‌کننده‌های except خالی (bare) و عمومی (broad) به عنوان نادیده‌گیرنده NameError، AttributeError و استثناهای مشابه، در زمینه بررسی‌کننده‌های مربوط به این موارد.

    حل مشکل #826

تاریخ انتشار: 2016-01-15

  • ادغام StringMethodChecker با StringFormatChecker. این کار نقصی را رفع می‌کند که در آن غیرفعال کردن تمام پیام‌ها و تنها فعال کردن شمار اندکی از پیام‌های StringFormatChecker منجر به عدم نمایش هیچ پیامی می‌شد.
  • عدم اعمال unneeded-not / C0113 <#unneeded-not> روی مجموعه‌ها (sets).

تاریخ انتشار: 2016-01-11

  • مدیریت الگوی import fallback با توجه به wrong-import-order / C0411 <#wrong-import-order>.

    حل مشکل #750

  • تفکیک نمایش گزارش‌ها از نمایش پیام‌ها

    برخی گزارش‌دهنده‌ها (reporters) به جای نمایش پیام‌ها به محض در دسترس بودن، آن‌ها را تجمیع می‌کنند. نمایش واقعی پیام‌ها در generate_reports تداخل یافته بود. متأسفانه این رفتار ناپایدار بود و در مورد گزارش‌دهنده JSON، اگر یک فایل دارای خطای نحوی (syntax) بود یا یافت نمی‌شد، پیام‌ها اصلاً نمایش داده نمی‌شدند. برای برطرف کردن این موضوع، پیام‌های تجمیع‌شده اکنون می‌توانند با Reporter.display_message نمایش داده شوند، در حالی که گزارش‌ها با display_reports نمایش می‌یابند.

    حل مشکل #766 حل مشکل #765

  • نادیده گرفتن فراخوانی‌های تابع با آرگومان‌های متغیر (variadic) بدون زمینه (context).

    استنتاج آرگومان‌های مکانی متغیر و آرگومان‌های کلیدواژه‌ای منجر به تولید Tuples و Dicts خالی می‌شود، که می‌تواند در برخی موارد به هشدارهای مثبت کاذب در رابطه با no-value-for-parameter / E1120 <#no-value-for-parameter> بیانجامد. برای جلوگیری از این امر، تا زمانی که پشتیبانی از انتشار زمینه فراخوانی (call context propagation) فراهم شود، در صورت شناسایی چنین مواردی آن‌ها را نادیده می‌گیریم.

    حل مشکل #722

  • رفتار با گره‌های AsyncFunctionDef مشابه گره‌های FunctionDef، از طریق پیاده‌سازی visit_asyncfunctiondef بر مبنای visit_functiondef.

    حل مشکل #767

  • در نظر گرفتن kwonlyargs هنگام بررسی تعریف شدن آرگومان‌ها توسط افزونه check_docs.

    حل مشکل #745

  • توقف گزارش‌دهی unneeded-not / C0113 <#unneeded-not> درون متدهای __ne__

    حل مشکل #749

    تاریخ انتشار: 2015-12-21

  • عدم توقف غیرمنتظره (crash) در صورت نصب نبودن graphviz، و در عوض صدور یک هشدار برای آگاه کردن کاربر.

    بسته شدن #168

  • پذیرش صرفاً توابع و متدها برای بررسی‌کننده deprecated-method / W4902 <#deprecated-method>.

    این امر از توقف غیرمنتظره‌ای که ممکن است هنگام نداشتن متد .qname() توسط یک شیء پس از استنتاج رخ دهد، جلوگیری می‌کند.

  • عدم صدور super-on-old-class روی کلاس‌هایی با کلاس‌های پایه ناشناخته.

    بسته شدن #721

  • مجاز بودن دستورها در بلوک‌های if یا try حاوی واردسازی‌ها (imports).

    بسته شدن #714

تاریخ انتشار: 2015-12-02

  • رفع توقف غیرمنتظره‌ای که هنگام مواجهه با متدهای قدیمی visit در ماژول‌های افزایه (plugin) رخ می‌داد.

    بسته شدن #711

  • افزودن wrong-import-position / C0413 <#wrong-import-position> به آرگومان‌های دکوراتور check_messages برای ImportChecker.leave_module این تغییر یک باگ نامتعارف را برطرف می‌کند که هنگام غیرفعال بودن ungrouped-imports / C0412 <#ungrouped-imports> و wrong-import-order / C0411 <#wrong-import-order> در زمان اجرای pylint روی چندین فایل رخ می‌داد. آنچه رخ می‌دهد این است که بدون وجود wrong-import-position / C0413 <#wrong-import-position> در check_messages، متد leave_module هرگز فراخوانی نمی‌شود؛ این بدان معناست که نخستین گرهٔ غیر-import از فایل‌های دیگر ممکن است به فایل جاری نشت کند و منجر به صدور نادرست wrong-import-position / C0413 <#wrong-import-position> توسط pylint شود.
  • رفع توقف غیرمنتظره‌ای که هنگام مواجهه با متدهای قدیمی visit در ماژول‌های افزایه رخ می‌داد.

    بسته شدن #711

  • عدم صدور import-self / W0406 <#import-self> و cyclic-import / R0401 <#cyclic-import> برای واردسازی‌های نسبی ماژول‌هایی با نام یکسان با خود بسته.

    بسته شدن #708 بسته شدن #706.

تاریخ انتشار: 2015-11-29

  • افزودن چندین هشدار مربوط به واردسازی‌ها. هشدار wrong-import-order / C0411 <#wrong-import-order> زمانی صادر می‌شود که توصیه‌های PEP 8 در رابطه با واردسازی‌ها رعایت نشوند (بدین صورت که واردسازی‌های استاندارد باید ابتدا بیایند و سپس واردسازی‌های شخص ثالث و در انتها واردسازی‌های محلی). هشدار ungrouped-imports / C0412 <#ungrouped-imports> زمانی صادر می‌شود که واردسازی‌های مربوط به یک بسته یا ماژول یکسان در کنار یکدیگر قرار نگرفته و در کد پراکنده باشند. هشدار wrong-import-position / C0413 <#wrong-import-position> زمانی صادر می‌شود که کد با واردسازی‌ها ترکیب شده باشد؛ توصیه می‌شود که واردسازی‌ها در بالای فایل قرار گیرند تا خوانندهٔ انسانی راحت‌تر متوجه وابستگی‌های یک ماژول شود.

    بسته شدن #692

  • افزودن هشدار بازآرایی (refactoring) جدید، unneeded-not / C0113 <#unneeded-not>، که زمانی صادر می‌شود که یک عبارت با عملگر not قابل ساده‌سازی باشد.

    بسته شدن #670

  • افزودن هشدار بازآرایی جدید، simplifiable-if-statement / R1703 <#simplifiable-if-statement>، که زمانی استفاده می‌شود که بتوان یک دستور if را به ارزیابی بولی شرط آن تقلیل داد.

    بسته شدن #698

  • افزودن هشدار بازآرایی جدید، too-many-boolean-expressions / R0916 <#too-many-boolean-expressions>، که زمانی استفاده می‌شود که یک دستور if شامل تعداد بیش از حدی از عبارات بولی باشد که نگه‌داری کد را تضعیف کرده و درک آن را دشوارتر می‌سازد.

    بسته شدن #677

  • متدهای ویژگی (property methods) در نمودارهای کلاس pyreverse به‌جای تابع به‌صورت صفت (attribute) نمایش داده می‌شوند.

    بسته شدن #284

  • افزودن خطای بازآرایی جدید، too-many-nested-blocks / R1702 <#too-many-nested-blocks>، که زمانی صادر می‌شود که یک تابع یا متد دارای تعداد بیش از حدی از بلوک‌های تودرتو باشد که خوانایی کد را کاهش داده و فهم آن را دشوارتر می‌سازد.

    بسته شدن #668

  • افزودن خطای جدید، unsubscriptable-object / E1136 <#unsubscriptable-object>، که زمانی صادر می‌شود که مقدار استفاده‌شده در عبارت اندیس‌گذاری (subscription) از قابلیت اندیس‌گذاری پشتیبانی نکند (یعنی متد __getitem__ را تعریف نکرده باشد).
  • عدم هشدار دربارهٔ کلاس‌های انتزاعی که نمونه‌سازی آن‌ها درون بدنهٔ خودشان انجام گرفته است.

    بسته شدن #627

  • گزینه‌های منسوخ‌شده به‌طور پیش‌فرض در فایل پیکربندی تولیدشده قرار نمی‌گیرند.

    بسته شدن #632

  • بررسی‌کننده non-iterator-returned / E0301 <#non-iterator-returned> می‌تواند کلاس‌هایی با فراماده‌های تکرارکننده (iterator-metaclasses) را تشخیص دهد.

    بسته شدن #679

  • افزودن خطای جدید، unsupported-membership-test / E1135 <#unsupported-membership-test>، که زمانی صادر می‌شود که مقدار سمت راست عملگر 'in' از پروتکل آزمون عضویت پشتیبانی نکند (یعنی __contains__/__iter__/__getitem__ را تعریف نکرده باشد).
  • افزودن خطاهای جدید: not-an-iterable / E1133 <#not-an-iterable> که زمانی صادر می‌شود که یک مقدار غیرقابل‌پیمایش در زمینه‌ای نیازمند پیمایش (مانند starargs، دستور for، عبارات جامع (comprehensions) و غیره) استفاده شود، و not-a-mapping / E1134 <#not-a-mapping> که زمانی صادر می‌شود که یک مقدار غیرنگاشت در یک زمینهٔ نگاشتی به کار رود.

    بسته شدن #563

  • عدم صدور هشدار توسط بررسی‌کننده no-self-use / R6301 <#no-self-use> در صورتی که فراخوانی 'super()' درون متد وجود داشته باشد.

    بسته شدن #667

  • افزودن بررسی‌کننده جهت شناسایی چندین واردسازی در یک خط.

    بسته شدن #598

  • رفع مثبت کاذب (false positive) برای unused-argument / W0613 <#unused-argument> هنگامی که از عملگر "+=" استفاده می‌شود.

    بسته شدن #518

  • عدم صدور import-error / E0401 <#import-error> برای ماژول‌های نادیده‌گرفته‌شده. PyLint برای هر واردسازی که خود یک ماژول در فهرست ignored-modules بوده یا زیربسته‌ای از آن باشد، خطای واردسازی صادر نخواهد کرد.

    بسته شدن #223

  • رفع مثبت کاذب unused-import / W0611 <#unused-import> هنگامی که واردسازی در یک انتساب کلاس استفاده شده باشد.

    بسته شدن #475

  • افزودن خطای جدید، not-context-manager / E1129 <#not-context-manager>، که زمانی صادر می‌شود که چیزی که متدهای __enter__ و __exit__ را پیاده‌سازی نکرده است در یک دستور with به کار رود.
  • افزودن هشدار جدید، confusing-with-statement / W0124 <#confusing-with-statement>، صادرشده توسط بررسی‌کننده پایه، زمانی که یک دستور with با ظاهر مبهم به کار رود. برای مثال with open() as first, second که شبیه یک انتساب تاپل به نظر می‌رسد اما در واقع ۲ مدیر زمینه (context manager) است.
  • افزودن هشدار جدید، duplicate-except / W0705 <#duplicate-except>، که زمانی صادر می‌شود که یک مدیریت‌کنندهٔ استثنا، نوعی از استثنا را مدیریت کند که پیش‌تر مدیریت شده است.

    بسته شدن #485

  • چندین هشدار به خطا ارتقا یافتند، چرا که می‌توانستند اشکالات بالقوه در کد را آشکار سازند. این هشدارها عبارتند از: assignment-from-none / E1128 <#assignment-from-none>، unbalanced-tuple-unpacking / W0632 <#unbalanced-tuple-unpacking>، unpacking-non-sequence / E0633 <#unpacking-non-sequence>، non-iterator-returned / E0301 <#non-iterator-returned>.

    بسته شدن #388

  • امکان پایان دادن به کنترل pragma با یک نقطه‌ویرگول. به این ترتیب، کاربران می‌توانند کنترل pragma را با ذکر دلیلی برای چرایی استفاده از آن ادامه دهند، مانند # pylint: disable=old-style-class;reason=....

    بسته شدن #449

  • اکنون می‌توان --jobs را به همراه --load-plugins استفاده کرد.

    بسته شدن #456 بهبود عملکرد --jobs هنگام کار صرفاً با نام یک بسته.

    بسته شدن #479

  • عدم صدور unused-wildcard-import / W0614 <#unused-wildcard-import> هنگامی که نام واردشده از پودمان دیگری می‌آید و در واقع یک نام __future__ است.
  • گزارش‌گر رنگی اکنون روی Windows کار می‌کند.

    بسته شدن #96.

  • حذف هشدار pointless-except. این هشدار پیش‌تر به‌طور پیش‌فرض غیرفعال بود و چندان کاربردی نداشت.

    بسته شدن #506.

  • رفع یک فروپاشی در Python 3 مربوط به بازبین رشته، که هنگام مواجهه با یک رشتهٔ bytes همراه با فراخوانی متد .format متوقف می‌شد.
  • عدم هشدار دربارهٔ no-self-use / R6301 <#no-self-use> برای ویژگی‌های توکار (builtin).
  • رفع مثبت کاذب برای bad-reversed-sequence / E0111 <#bad-reversed-sequence>، هنگامی که یک زیرکلاس از dict متد __reversed__ را ارائه می‌دهد.
  • تغییر مقدار پیش‌فرض no-docstring-rgx به‌طوری که missing-docstring / C0111 <#missing-docstring> برای توابع خصوصی صادر نشود.
  • عدم صدور redefined-outer-name / W0621 <#redefined-outer-name> برای دستورالعمل‌های __future__.

    بسته شدن #520.

  • ارائهٔ چند راهنمایی برای پیام bad-builtin / W0141 <#bad-builtin>.

    بسته شدن #522.

  • هنگام بررسی آرگومان‌های نامعتبر برای یک شیء قابل‌فراخوانی در typecheck.py، در صورتی که __new__ یافت‌شده از توکارها (builtins) باشد، متد __init__ جستجو می‌شود.

    از آنجا که __new__ از توکارها می‌آید، اطلاعاتی دربارهٔ پارامترهای مورد انتظار خود ضمیمه نخواهد داشت، بنابراین این بررسی بی‌فایده خواهد بود. بازیابی __init__ در این حالت دست‌کم چند منفی کاذب را تشخیص خواهد داد.

    بسته شدن #429.

  • عدم صدور no-member / E1101 <#no-member> برای کلاس‌هایی با پایه‌های ناشناخته.

    از آنجا که مشخص نیست آن پایه‌ها چه مواردی را ممکن است اضافه کنند، به‌سادگی در این حالت از خطا چشم‌پوشی می‌شود.

  • جستجو در فراکلاس ضمنی هنگام بررسی no-member / E1101 <#no-member>، در صورتی که کلاس مورد نظر دارای فراکلاس ضمنی باشد؛ که این امر برای کلاس‌های سبک جدید (new style classes) برقرار است.

    بسته شدن #438.

  • افزودن دو هشدار جدید، duplicate-bases / E0241 <#duplicate-bases> و inconsistent-mro / E0240 <#inconsistent-mro>.

    هشدار duplicate-bases / E0241 <#duplicate-bases> زمانی صادر می‌شود که یک کلاس پایه‌های یکسانی را بیش از یک بار در تعریف پایه‌های خود آورده باشد، در حالی که inconsistent-mro / E0240 <#inconsistent-mro> زمانی صادر می‌شود که هیچ سلسله‌مراتب mro معقولی قابل تعیین نباشد.

    بسته شدن #526.

  • حذف هشدار interface-not-implemented.

    بسته شدن #532.

  • حذف سایر بررسی‌های واسط: interface-is-not-class،‏ missing-interface-method و unresolved-interface. دلیل این امر آن است که بهتر است به‌جای دوران قدیمی واسط‌های Zope، استفاده از ABCها توصیه شود. یکی از اثرات جانبی این تغییر این است که ignore-iface-methods به یک عملیات بی‌اثر (noop) تبدیل شده، منسوخ گردیده و در آینده حذف خواهد شد.
  • صدور هشدار منسوخ‌شدگی مناسب برای reporters.BaseReporter.add_message.

    روش جایگزین، استفاده از handle_message است. متد add_message در Pylint 1.6 حذف خواهد شد.

  • افزودن پودمان جدید 'extensions' برای بازبین‌های اختیاری به‌همراه دایرکتوری آزمون 'test/extensions' و فایل مستندات 'doc/extensions.rst'.
  • افزودن بازبین جدید 'extensions.check_docs' که مستندسازی پارامترها را در سبک‌های Sphinx،‏ Google و Numpy بررسی می‌کند.
  • تشخیص موارد متغیر تعریف‌نشده، در جایی که "تعریف" متغیر تعریف‌نشده در یک عبارت del بوده است. اکنون به‌جای صدور used-before-assignment / E0601 <#used-before-assignment> که کاملاً گمراه‌کننده است، undefined-variable / E0602 <#undefined-variable> صادر می‌شود.

    بسته شدن #528.

  • عدم صدور attribute-defined-outside-init / W0201 <#attribute-defined-outside-init> و access-member-before-definition / E0203 <#access-member-before-definition> برای کلاس‌های mixin. خطاهای واقعی می‌توانند در کلاس‌های mixin رخ دهند، اما این موضوع توسط گزینهٔ ignore-mixin-members کنترل می‌شود.

    بسته شدن #412.

  • بهبود تشخیص متغیرهای تعریف‌نشده و متغیرهای استفاده‌شده پیش از انتساب، برای متغیرهایی که به‌عنوان آرگومان‌های پیش‌فرض تابع به کار رفته‌اند، در حالی که متغیر نخستین بار در حوزهٔ کلاس تعریف شده است.

    بسته شدن #342 و شمارهٔ #404.

  • افزودن یک هشدار جدید، unexpected-special-method-signature / E0302 <#unexpected-special-method-signature>، که زمانی صادر می‌شود که یک متد خاص (dunder method) امضای مورد انتظار را نداشته باشد، که این موضوع می‌تواند منجر به خطاهای واقعی در کد برنامه شود.

    بسته شدن #253.

  • حذف bad-context-manager / E0235 <#bad-context-manager> به دلیل گنجانده شدن unexpected-special-method-signature / E0302 <#unexpected-special-method-signature>.
  • عدم صدور no-name-in-module / E0611 <#no-name-in-module> در صورتی که وارد کردن توسط یک بند ImportError،‏ Exception یا یک عبارت except خالی محافظت شده باشد.
  • عدم صدور no-member / E1101 <#no-member> اگر گره دسترسی به ویژگی توسط یک گردانندهٔ except که AttributeError یا Exception را مدیریت می‌کند یا یک except خالی است، محافظت شده باشد.
  • عدم صدور import-error / E0401 <#import-error> در صورتی که وارد کردن توسط یک بند ImportError،‏ Exception یا یک عبارت except خالی محافظت شده باشد.
  • عدم صدور undefined-variable / E0602 <#undefined-variable> اگر گره توسط یک بند NameError،‏ Exception یا عبارت except خالی محافظت شده باشد.
  • افزودن هشدار جدید، using-constant-test / W0125 <#using-constant-test>، که زمانی صادر می‌شود که یک عبارت شرطی (If, IfExp) از شرطی استفاده کند که همواره ثابت است؛ مانند اعداد، کلاس‌ها، توابع و غیره. این مورد به احتمال زیاد خطایی از جانب کاربر است.

    بسته شدن #524.

  • عدم صدور raising-non-exception / E0710 <#raising-non-exception> زمانی که استثنا دارای پایه‌های ناشناخته است. پایه‌های واقعی آن مشخص نیستند و بهتر است فرض شود کاربر می‌داند چه می‌کند، تا اینکه پیامی صادر شود که ممکن است مثبت کاذب تلقی گردد.
  • جستجو برای فایل پیکربندی .pylintrc در پوشهٔ جاری در صورتی که pylintrc یافت نشود. برخلاف pylintrc، فایل‌های نقطه‌دار pylintrc در پوشه‌های والد پوشهٔ جاری جستجو نخواهند شد.
  • افزودن خطای جدید 'invalid-unary-type-operand'، که زمانی صادر می‌شود که یک عملوند یکانی روی چیزی به کار رود که از آن عملیات پشتیبانی نمی‌کند (به‌عنوان مثال، استفاده از عملگر وارون‌سازی بیتی یکانی روی نمونه‌ای که __invert__ را پیاده‌سازی نکرده است).
  • در نظر گرفتن تفاوت‌های میان آرگومان‌های انواع مختلف توابع (classmethods،‏ staticmethods و properties) هنگام بررسی arguments-differ.

    بسته شدن #548.

  • بخش astroid.inspector به pylint.pyreverse منتقل شد، چرا که به آنجا تعلق دارد و نیازی به حضور آن در astroid نیست.
  • بخش astroid.utils.LocalsVisitor به pylint.pyreverse.LocalsVisitor منتقل شد.
  • تابع pylint.checkers.utils.excepts_import_error حذف شد. به‌جای آن از pylint.checkers.utils.error_of_type استفاده کنید.
  • عدم صدور undefined-all-variables برای گره‌هایی که قابل استنتاج نیستند (گره‌های YES).
  • پیام yield-outside-func برای yield from نیز صادر می‌شود.
  • افزودن خطای جدید، too-many-star-expressions / E0112 <#too-many-star-expressions>، که زمانی صادر می‌شود که بیش از یک عبارت ستاره‌دار (*x) در یک انتساب وجود داشته باشد. این هشدار تنها در Python 3 صادر می‌شود.
  • افزودن خطای جدید، invalid-star-assignment-target / E0113 <#invalid-star-assignment-target>، که زمانی صادر می‌شود که یک عبارت ستاره‌دار (*x) به‌عنوان سمت چپ یک انتساب استفاده شود؛ مانند *x = [1, 2]. هرچند این مورد در Python 3 یک SyntaxError نیست.
  • تشخیص چند شیء که نمی‌توانند کلاس پایه باشند (bool،‏ slice،‏ range و memoryview که تا پیش از این تشخیص داده نمی‌شدند).
  • افزودن یک خطای جدید برای بازبین مهاجرت به Python 3، به نام import-star-module-level، که زمانی استفاده می‌شود که یک وارد کردن ستاره‌ای در حوزه‌ای غیر از سطح پودمان تشخیص داده شود؛ موردی که در Python 3 خطا محسوب می‌شود. استفاده از این حالت در Python 2 یک SyntaxWarning صادر خواهد کرد..IP • 2 افزودن خطای جدید star-needs-assignment-target / E0114 <#star-needs-assignment-target>، که در Python 3 هنگامی صادر می‌شود که یک عبارت ستاره‌دار (*x) در مقصد انتساب استفاده نشده باشد. این خطا هنگام تجزیهٔ AST در Python 3 تشخیص داده نمی‌شود، بنابراین نیازمند یک بررسی جداگانه است.
  • افزودن خطای جدید unsupported-binary-operation / E1131 <#unsupported-binary-operation>، که هنگامی صادر می‌شود که یک عملیات محاسباتی دودویی بین دو شیء که از آن پشتیبانی نمی‌کنند اجرا شود (برای مثال جمع یک عدد با یک رشته). این خطا در حال حاضر غیرفعال است، چرا که موارد مثبت کاذب بسیار زیادی تولید می‌کند، اما در اسرع وقت دوباره فعال خواهد شد.
  • قابلیت‌های جدید وارد شده از astroid به pyreverse: pyreverse.inspector.Project،‏ pyreverse.inspector.project_from_files و pyreverse.inspector.interfaces.

    این موارد به دلیل عدم تعلق به astroid منتقل شدند.

  • فعال‌سازی misplaced-future / W0410 <#misplaced-future> برای Python 3.

    بسته شدن #580.

  • افزودن خطای جدید nonlocal-and-global / E0115 <#nonlocal-and-global>، که هنگامی صادر می‌شود که یک نام در یک حوزهٔ یکسان، هم nonlocal و هم global تعریف شده باشد.

    بسته شدن #581.

  • گزینهٔ ignored-classes می‌تواند با نام‌های واجد شرایط (qualified names) کار کند (ignored-classes=optparse.Values)

    بسته شدن #297

  • گزینهٔ ignored-modules علاوه بر تطبیق الگوی یونیکس برای نادیده‌گرفتن بازگشتی، می‌تواند با نام‌های واجد شرایط نیز کار کند.

    بسته شدن #244

  • بهبود تشخیص درون‌ریزی‌های نسبی در غیربسته‌ها (non-packages)، و همچنین درون‌ریزی ماژول‌های ناموجود با یک درون‌ریزی نسبی از یک بسته.
  • اگر تمام کلاس‌های پایهٔ یک کلاس مشخص نباشند، no-init صادر نشود.

    بسته شدن #604.

  • گزینهٔ --no-space-check مقدار empty-line را به عنوان یک گزینهٔ ممکن می‌پذیرد.

    بسته شدن #541.

  • گزینهٔ --generate-rcfile به‌طور پیش‌فرض نمادهای خوانا برای انسان را برای گزینهٔ --disable تولید می‌کند.

    بسته شدن #608.

  • بهبود بررسی‌کنندهٔ not-in-loop / E0103 <#not-in-loop> برای تشخیص صحیح موارد بیشتر.
  • افزودن خطای جدید continue-in-finally / W0136 <#continue-in-finally>، که هنگامی صادر می‌شود که کلیدواژهٔ continue درون عبارت finally یافت شود، که یک SyntaxError است.
  • پرچم --zope منسوخ شده و برای حذف در Pylint 1.6 برنامه‌ریزی شده است.

    دلیل این حذف این است که این یک پرچم تخصصی بوده و برای مشکل اصلی راه‌حل‌هایی وجود دارد: استفاده از --generated-members همراه با اعضایی که هنگام استفاده از Zope مشکل‌ساز می‌شوند، یا افزودن تبدیلات AST متناسب با پروژهٔ zope.

    هم‌زمان، --include-ids و --symbols نیز در Pylint 1.6 حذف خواهند شد.

    بسته شدن #570.

  • پیام missing-module-attribute حذف شد و گزینهٔ خط فرمانی متناظر با آن یعنی required-attributes، برای حذف در Pylint 1.6 برنامه‌ریزی شده است.
  • پیام missing-reversed-argument حذف شد.

    دلیل این امر آن است که این نوع خطاها باید توسط بررسی‌کنندهٔ نوع برای همهٔ توابع توکار (builtins) تشخیص داده شوند، نه به عنوان یک مورد خاص برای تابع توکار reversed. این قابلیت به‌زودی در آینده فراهم خواهد شد.

  • پرچم --comment منسوخ است و در Pylint 1.6 حذف خواهد شد.
  • پرچم --profile منسوخ است و در Pylint 1.6 حذف خواهد شد.
  • افزودن خطای جدید misplaced-bare-raise / E0704 <#misplaced-bare-raise>.

    این خطا هنگامی صادر می‌شود که یک raise خالی (bare raise) بیرون از یک عبارت except استفاده شده باشد. این کار در صورتی که استثنای فعالی برای بالا انداختن مجدد وجود نداشته باشد، می‌تواند در Python منجر به RuntimeError شود. اگرچه این کار در Python 2 به دلیل نشت استثنا به خارج از بلوک except کار می‌کند، اما رفتاری است که کاربر نباید به آن وابسته باشد؛ چرا که برای خوانندهٔ کد مشخص نیست چه استثنایی رخ خواهد داد و به هر حال با Python 3 نیز سازگار نخواهد بود.

    بسته شدن #633.

  • انتقال ureports از logilab-common به pylint.reporters.

    با این تغییر، وابستگی به logilab-common برطرف شد و تمام مؤلفه‌هایی که از logilab-common استفاده می‌شدند در Pylint قرار گرفتند. این API باید به عنوان یک جزئیات پیاده‌سازی تلقی شود و ممکن است در آینده تغییر کند.

    بسته شدن #621.

  • پیام reimported برای اشیایی که در همان خط دوباره درون‌ریزی شوند صادر می‌شود.

    بسته شدن #639.

  • کوته‌نوشت‌ها و مخفف‌های گزینه‌های خط فرمان دیگر پشتیبانی نمی‌شوند.

    استفاده از اختصارات برای گزینه‌های CLI هیچ‌گاه یک قابلیت برای pylint محسوب نمی‌شد و تنها یک اثر جانبی ناشی از استفاده از optparse بود. با توجه به این موضوع، استفاده از --load-plugin یا اختصارات دیگر به جای --load-plugins عملاً هرگز کار نمی‌کرد، در حالی که خطایی نیز صادر نمی‌کرد.

    بسته شدن #424.

  • افزودن خطای جدید nonlocal-without-binding / E0117 <#nonlocal-without-binding>

    این خطا در Python 3 زمانی صادر می‌شود که یک نام nonlocal به هیچ متغیری در حوزه‌های والد پیوند نیافته باشد.

    بسته شدن #582.

بسته شدن #362.

  • اگر اعضای یک کلاس به‌درستی قابل استنتاج نباشند، نباید آن کلاس انتزاعی (abstract) در نظر گرفته شود.

    این تغییر، یک مورد مثبت کاذب مربوط به abstract-class-instantiated / E0110 <#abstract-class-instantiated> را برطرف می‌کند.

    بسته شدن #648.

  • افزودن یک بررسی‌کنندهٔ جدید برای قابلیت‌های async که توسط PEP 492 اضافه شدند.
  • افزودن خطای جدید yield-inside-async-function / E1700 <#yield-inside-async-function>، که در Python 3.5 به بالا هنگامی صادر می‌شود که دستور yield درون یک تابع هم‌روال جدید (coroutine function براساس PEP 492) یافت شود.
  • افزودن خطای جدید not-async-context-manager / E1701 <#not-async-context-manager>، که هنگامی صادر می‌شود که یک بلوک مدیر زمینهٔ غیرهمگام با شیئی استفاده شود که از این پروتکل پشتیبانی نمی‌کند (PEP 492).
  • افزودن هشدار قراردادی جدید singleton-comparison / C0121 <#singleton-comparison>، که هنگام مقایسه با True،‏ False یا None صادر می‌شود.
  • عدم صدور assigning-non-slot / E0237 <#assigning-non-slot> برای توصیف‌کننده‌ها (descriptors).

    بسته شدن #652.

  • افزودن خطای جدید repeated-keyword / E1132 <#repeated-keyword>، هنگامی که یک آرگومان کلیدواژه‌ای چندین بار در یک فراخوانی تابع ارسال شود.

    این مورد شبیه به redundant-keyword-arg / E1124 <#redundant-keyword-arg> است، اما اندکی تفاوت دارد و نیاز است یک خطای جداگانه باشد.

  • گزینهٔ --enable=all اکنون قابل استفاده است.

    بسته شدن #142.

  • افزودن پیام قراردادی جدید misplaced-comparison-constant / C2201 <#misplaced-comparison-constant>، که هنگامی صادر می‌شود که یک مقدار ثابت در سمت چپ یک مقایسه قرار گیرد، مانند '5 == func()'. این مورد «شرط یودا» (Yoda condition) نیز نامیده می‌شود، چرا که روال کد یادآور شخصیت سبز جنگ ستارگان است؛ شرایطی که معمولاً در زبان‌هایی با قابلیت انتساب متغیر در عبارات شرطی دیده می‌شود.
  • افزودن پیام قراردادی جدید consider-using-enumerate / C0200 <#consider-using-enumerate>، که هنگام مواجهه با کدی صادر می‌شود که از range و len برای پیمایش استفاده می‌کند.

    بسته شدن #684.

  • افزودن دو پیام بازآرایی جدید، no-classmethod-decorator / R0202 <#no-classmethod-decorator> و no-staticmethod-decorator / R0203 <#no-staticmethod-decorator>، که هنگامی صادر می‌شوند که یک متد ایستا یا یک متد کلاس بدون استفاده از نحو دکوراتورها اعلان شده باشد..sp بستن #675.

تاریخ انتشار: 2015-03-14

  • حذف سه هشدار: star-args، abstract-class-little-used، abstract-class-not-used. این هشدارها ارزش واقعی چندانی اضافه نمی‌کنند و بر وجود خطا یا مشکلی در کد دلالت ندارند.
  • افزودن یک گزینهٔ جدید برای کنترل بهینه‌ساز peephole در astroid. گزینهٔ --optimize-ast بهینه‌ساز peephole را کنترل خواهد کرد، که برای بهینه‌سازی چند زیردرخت AST به کار می‌رود. مشکل فعلی حل‌شده توسط بهینه‌ساز peephole زمانی رخ می‌دهد که چندین رشتهٔ متصل‌شده با عملگر جمع (+) وجود داشته باشند. اگر تعداد چنین رشته‌هایی به اندازهٔ کافی زیاد باشد، Pylint به دلیل معماری visitor خود با خطای حداکثر عمق بازگشت (maximum recursion depth exceeded) مواجه خواهد شد. بهینه‌ساز peephole در صورت امکان چنین فراخوانی‌هایی را به رشتهٔ حاصل نهایی تبدیل می‌کند و این مسئله مشکلی را به وجود می‌آورد، زیرا متد visit_binop دیگر فراخوانی نمی‌شود (در AST بهینه‌شده، این یک گره Const خواهد بود).

تاریخ انتشار: 2015-03-11

  • عدم الزام docstring برای ماژول‌های خالی.

    بستن #261

  • رفع یک مثبت کاذب در هشدار رشته‌ای too-few-format-args، صادرشده زمانی که قالب رشته شامل یک آرگومان ترتیبی عادی ('{0}') ترکیب‌شده با یک آرگومان ترتیبی دارای دسترسی به ویژگی ('{0.__class__}') بود.

    بستن #463

  • در نظر گرفتن تمام متدهای نیاکان (ancestors) هنگام بررسی too-few-public-methods / R0903 <#too-few-public-methods>.

    بستن #471

  • گرفتن خطاهای enchant و صدور invalid-characters-in-docstring / C0403 <#invalid-characters-in-docstring> هنگام بررسی خطاهای املایی.

    بستن #469

  • استفاده از تمام گزاره‌های استنباط‌شده برای بررسی super-init-not-called / W0231 <#super-init-not-called>.

    بستن #389

  • افزودن یک هشدار جدید، 'unichr-builtin'، صادرشده توسط بررسی‌کنندهٔ مهاجرت به Python 3 هنگام یافتن تابع توکار unichr.

    بستن #472

  • افزودن یک هشدار جدید، 'intern-builtin'، صادرشده توسط بررسی‌کنندهٔ مهاجرت به Python 3 هنگام یافتن تابع توکار intern.

    بستن #473

  • افزودن پشتیبانی از نصب‌های قابل‌ویرایش (editable installations).
  • خروجی HTML گزینهٔ --msg-template را می‌پذیرد. وصله توسط Dan Goldsmith.
  • افزودن 'map-builtin-not-iterating' (جایگزین 'implicit-map-evaluation')، 'zip-builtin-not-iterating'، 'range-builtin-not-iterating' و 'filter-builtin-not-iterating' که هنگام عدم استفاده از تابع توکار مربوطه در یک بافت پیمایشی توسط --py3k صادر می‌شوند (معناشناسی برگرفته از 2to3).
  • افزودن یک هشدار جدید، unidiomatic-typecheck / C0123 <#unidiomatic-typecheck>، صادرشده زمانی که یک بررسی صریح نوع به جای isinstance() از type() استفاده می‌کند. به عنوان مثال، type(x) == Y به جای isinstance(x, Y). وصله توسط Chris Rebert.

    بستن #299

  • افزودن پشتیبانی از ترکیب حالت بررسی‌کنندهٔ Python 3 با پرچم --jobs (--py3k و --jobs).

    بستن #467

  • افزودن یک هشدار جدید برای بررسی‌کنندهٔ مهاجرت به Python 3 به نام 'using-cmp-argument'، صادرشده هنگام مواجهه با آرگومان cmp برای list.sort یا sorted builtin.
  • جابجایی‌پذیر کردن پرچم --py3k با پرچم -E. همچنین این وصله نشت پیام‌های خطای بررسی‌کنندهٔ Python 3 را هنگام فعال بودن حالت خطاها برطرف می‌کند.

    بستن #437

    تاریخ انتشار: 2015-01-16

  • جست‌وجو تنها در حوزهٔ تابع جاری برای bad-super-call / E1003 <#bad-super-call>.

    بسته شدن #403

  • بررسی مقدار بازگشتی ویژگی‌ها هنگام بررسی not-callable / E1102 <#not-callable>.

    بسته شدن #406

  • هشدار دربارهٔ استفاده از توابع توکار input() یا round() برای Python 3.

    بسته شدن #411

  • جست‌وجوی مناسب متدهای انتزاعی هنگام بررسی abstract-class-instantiated / E0110 <#abstract-class-instantiated>.

    بسته شدن #401

  • استفاده از پیمایش mro برای یافتن متدهای انتزاعی.

    بسته شدن #415

  • رفع مثبت کاذب در catching-non-exception / E0712 <#catching-non-exception> و تاپل‌های استثناها.
  • رفع منفی کاذب در raising-non-exception / E0710 <#raising-non-exception>، هنگامی که عبارت raise از زمینهٔ استثنایی غیرقابل استنتاج استفاده می‌کرد.
  • رفع مثبت کاذب در Python 2 برای raising-bad-type / E0702 <#raising-bad-type> هنگام raise کردن تاپل‌ها به صورت 'raise (ZeroDivisionError, None)'.
  • رفع مثبت کاذب در invalid-slots-objects، هنگامی که مدخل slot یک رشتهٔ یونیکد در Python 2 بود.

    بسته شدن #421

  • افزودن هشدار جدید، redundant-unittest-assert / W1503 <#redundant-unittest-assert>، که هنگام استفاده از متدهای assertTrue و assertFalse در unittest با مقدار ثابت به عنوان آرگومان صادر می‌شود. وصله توسط Vlad Temian.
  • افزودن یک گزارش‌گر JSON جدید، قابل استفاده از طریق پرچم -f.
  • افزودن نام‌های متد برای هشدارهای signature-differs / W0222 <#signature-differs> و 'argument-differs'.

    بسته شدن #433

  • عدم کامپایل فایل‌های آزمون هنگام نصب.
  • رفع خرابی که هنگام استفاده از چندین پردازش (jobs) و در صورتی که فایل‌های داده‌شده به عنوان آرگومان اصلاً وجود نداشتند، رخ می‌داد.

تاریخ انتشار: 2014-11-23

  • افزودن گزینه‌های جدید برای کنترل بارگذاری افزونه‌های C. به‌طور پیش‌فرض، تنها افزونه‌های C موجود در stdlib برای بازرسی در مفسر فعال Python بارگذاری می‌شوند، چرا که می‌توانند در زمان وارد کردن (import)، کدهای دلخواه را اجرا کنند. گزینهٔ --extension-pkg-whitelist می‌تواند برای مشخص کردن ماژول‌ها یا بسته‌هایی که بارگذاری آن‌ها ایمن است، استفاده شود.
  • تغییر مقدار پیش‌فرض max-line-length به ۱۰۰ به جای ۸۰.
  • حذف کلاس BaseRawChecker که مدتی بود تنها برای سازگاری با نسخه‌های پیشین باقی مانده بود.
  • عدم تلاش برای تحلیل قالب‌بندی رشته با اشیایی که از آرگومان‌های تابع می‌آیند.

    بسته شدن #373

  • انتقال کد منبع به گونه‌ای که با Python 2/3 سازگار باشد. این کار نیاز به 2to3 را از بین می‌برد، اما پشتیبانی از Python 2.5 را متوقف می‌کند.
  • اکنون هر پیام با یک سطح اطمینان همراه است و می‌تواند بر اساس این سطح فیلتر شود. این قابلیت امکان فیلتر کردن تمام پیام‌هایی را فراهم می‌کند که حتی در صورت بروز شکست در استنتاج حین بررسی صادر شده بودند.
  • بهبود در نمایش پیام unused-import / W0611 <#unused-import>.

    بسته شدن #293

  • افزودن بررسی‌کنندهٔ جدید برای یافتن خطاهای املایی. پیام‌های جدید: wrong-spelling-in-comment / C0401 <#wrong-spelling-in-comment>، wrong-spelling-in-docstring / C0402 <#wrong-spelling-in-docstring>. گزینه‌های جدید: spelling-dict، spelling-ignore-words.
  • افزودن گزینهٔ جدید '-j' برای اجرای بررسی‌ها در زیرپردازش‌ها.
  • افزودن بررسی‌های جدید برای پایانه‌های خط در صورت مخلوط بودن (LF در برابر CRLF) یا در صورتی که مطابق انتظار نباشند. پیام‌های جدید: mixed-line-endings / C0327 <#mixed-line-endings>، unexpected-line-ending-format / C0328 <#unexpected-line-ending-format>. گزینهٔ جدید: expected-line-ending-format.
  • هشدار dangerous-default-value / W0102 <#dangerous-default-value> دیگر مقدار آرگومان‌ها را ارزیابی نمی‌کند، که می‌توانست منجر به پیام‌های خطای طولانی یا افشای داده‌های حساس شود.

    بسته شدن #282

  • رفع مثبت کاذب در بررسی‌کنندهٔ قالب‌بندی رشته، هنگام مواجهه با رشته‌ای که تنها از آرگومان‌های مبتنی بر موقعیت استفاده می‌کند.

    بسته شدن #285

  • رفع مثبت کاذب در بررسی‌کنندهٔ قالب‌بندی رشته، هنگام استفاده از بسته‌بندی آرگومان‌های کلیدواژه‌ای.

    بسته شدن #288

  • مدیریت مناسب حوزهٔ سطح کلاس برای توابع لامبدا.
  • مدیریت too-few-format-args / E1306 <#too-few-format-args> یا too-many-format-args / E1305 <#too-many-format-args> برای رشته‌های قالب‌بندی دارای هر دو فیلد نام‌دار و موقعیتی.

    بسته شدن #286

  • تحلیل تنها رشته‌ها توسط بررسی‌کنندهٔ قالب رشته.

    بسته شدن #287

  • مدیریت مناسب فیلدهای تودرتوی رشتهٔ قالب.

    بسته شدن #294

  • عدم صدور attribute-defined-outside-init / W0201 <#attribute-defined-outside-init> در صورتی که مشخصه با فراخوانی یک تابع در یک متد تعریف‌کننده مقداردهی شده باشد.

    بسته شدن #192

  • مدیریت مناسب رشته‌های قالب یونیکد برای Python 2.

    بسته شدن #296

  • عدم صدور import-error / E0401 <#import-error> در صورتی که یک import توسط یک try-except که ImportError را مدیریت می‌کرد، محافظت شده باشد.
  • رفع مثبت کاذب unused-import / W0611 <#unused-import>، هنگامی که خطا برای تمام اعضای واردشده با قالب 'from import' صادر می‌شد.

    بسته شدن #304

  • عدم صدور invalid-name / C0103 <#invalid-name> هنگام انتساب یک نام در مدیریت‌کنندهٔ ImportError.

    بسته شدن #302

  • عدم شمارش شاخه‌ها از توابع تودرتو.
  • رفع مثبت کاذب در too-few-format-args / E1306 <#too-few-format-args>، هنگامی که رشته‌های قالب حاوی آرگومان‌های موقعیتی دستی تکراری بودند.

    بسته شدن #310

  • مدیریت کامنت‌های بدون فاصله پس از علامت هش توسط عبارت باقاعدهٔ fixme.

    بسته شدن #311

  • عدم صدور unused-import / W0611 <#unused-import> هنگامی که یک شیء خاص وارد می‌شود (__all__، __doc__ و غیره).

    بسته شدن #309

  • جست‌وجو در فراکلاس (metaclass)، در صورت تعریف، برای اعضایی که در کلاس جاری پیدا نشده‌اند.

    بسته شدن #306

  • عدم صدور protected-access / W0212 <#protected-access> در صورتی که به مشخصه با استفاده از یک ویژگی (property) تعریف‌شده در سطح کلاس دسترسی پیدا شود.
  • تشخیص فراخوانی‌های __init__ والد از طریق یک فراخوانی مقیدشدهٔ super().
  • بررسی اینکه یک کلاس پیش از صدور 'old-style-class' برای Python 2، دارای فراکلاس صریحاً تعریف‌شده باشد.
  • صدور catching-non-exception / E0712 <#catching-non-exception> برای گره‌های غیرکلاسی. بسته شدن #303
  • ترتیب گزارش‌دهی یکدست و سازگار است.
  • افزودن هشدار جدید، boolean-datetime / W1502 <#boolean-datetime>، که هنگام استفاده از نمونه‌ای از 'datetime.time' در یک زمینه بولی صادر می‌شود.

    بسته شدن #239

  • رفع یک از کار افتادگی (crash) که هنگام بررسی method-hidden / E0202 <#method-hidden>، زمانی که فریم والد چیزی غیر از یک تابع بود، رخ می‌داد.
  • تولید خروجی html برای فایل‌های مفقود.

    بسته شدن #320

  • رفع مثبت کاذب در too-many-format-args / E1305 <#too-many-format-args>، زمانی که رشته قالب‌بندی حاوی ترکیبی از آرگومان‌های دسترسی به ویژگی و فیلدهای دستی است.

    بسته شدن #322

  • گسترش مواردی که در آن‌ها undefined-variable / E0602 <#undefined-variable> و used-before-assignment / E0601 <#used-before-assignment> قابل تشخیص هستند.

    بسته شدن #291

  • افزودن پشتیبانی از سفارشی‌سازی شناسه‌های callback با افزودن گزینه خط فرمان جدید '--callbacks'.

    بسته شدن #326

  • افزودن هشدار جدید، logging-format-interpolation / W1202 <#logging-format-interpolation>، که هنگام استفاده از درون‌یابی رشته‌ای .format() درون فراخوانی توابع ثبت وقایع (logging) صادر می‌شود.
  • صادر نکردن unbalanced-tuple-unpacking / W0632 <#unbalanced-tuple-unpacking> هنگامی که سمت راست انتساب (rhs) یک آرگومان با طول متغیر باشد.

    بسته شدن #329

  • افزودن هشدار جدید، inherit-non-class / E0239 <#inherit-non-class>، که هنگام ارث‌بری یک کلاس از چیزی که یک کلاس نیست صادر می‌شود.

    بسته شدن #331

  • رفع مثبت کاذب دیگری در undefined-variable / E0602 <#undefined-variable>، در جایی که متغیر می‌تواند به عنوان یک انتساب کلاسی یافت شده و در حاشیه‌نویسی تابع (annotation) استفاده شود.

    بسته شدن #342

  • مدیریت انتساب متد format رشته به یک متغیر.

    بسته شدن #351

  • پشتیبانی از قالب بسته‌بندی wheel برای PyPi.

    بسته شدن #334

  • بررسی اینکه شناسه‌های توکار (built-ins) مختلفی که در Python 3 وجود ندارند استفاده نشوند: apply، basestring، buffer، cmp، coerce، execfile، file، long، raw_input، reduce، StandardError، unicode، reload و xrange.
  • هشدار برای متدهای جادویی که به هیچ وجه در Python 3 استفاده نمی‌شوند: __coerce__، __delslice__، __getslice__، __setslice__، __cmp__، __oct__، __nonzero__ و __hex__.
  • عدم صدور assigning-non-slot / E0237 <#assigning-non-slot> هنگامی که انتساب برای یک ویژگی (property) است.

    بسته شدن #359

  • رفع پس‌رفت: عبارت '{path}' دیگر در '--msg-template' پذیرفته نمی‌شد.
  • گزارش درصد تمامی پیام‌ها، نه فقط برای خطاها و هشدارها.

    بسته شدن #319

  • هشدار too-many-public-methods / R0904 <#too-many-public-methods> تنها برای متدهای تعریف‌شده در یک کلاس گزارش می‌شود، نه نیاکان آن.

    بسته شدن #248

  • پراگمای غیرفعال‌سازی too-many-lines / C0302 <#too-many-lines> می‌تواند در هر خطی قرار گیرد، نه فقط در خط اول.

    بسته شدن #321

  • هشدار در Python 2 هنگامی که یک دستور import بدون دستور متناظر from __future__ import absolute_import یافت شود.
  • هشدار در Python 2 هنگامی که یک عملیات تقسیم غیرکف (non-floor) بدون دستور متناظر from __future__ import division یافت شود.
  • افزودن گزینه جدید، 'exclude-protected'، برای مستثنی کردن اعضا از هشدار protected-access / W0212 <#protected-access>.

    بسته شدن #48

  • هشدار در Python 2 هنگام استفاده از dict.iter*() و dict.view*()؛ هیچ‌کدام از این متدها در Python 3 در دسترس نیستند.
  • هشدار در Python 2 هنگام فراخوانی متد next() یک شیء؛ Python 3 به جای آن از __next__() استفاده می‌کند.
  • هشدار هنگام انتساب به __metaclass__ در حوزه کلاس؛ در Python 3 متارده به عنوان آرگومانی برای دستور 'class' مشخص می‌شود.
  • هشدار هنگام باز کردن تاپل پارامترها (parameter tuple unpacking)؛ این عمل در Python 3 پشتیبانی نمی‌شود.
  • هشدار abstract-class-instantiated / E0110 <#abstract-class-instantiated> برای Python 2 نیز صادر می‌شود. این مورد پیش‌تر غیرفعال شده بود.
  • افزودن خطای 'long-suffix'، که هنگام مواجهه با پسوند long روی اعداد صادر می‌شود.
  • افزودن پشتیبانی برای غیرفعال کردن یک بازبین (checker)، با مشخص کردن ویژگی 'enabled' روی کلاس بازبین.
  • افزودن گزینه جدید خط فرمان، --py3k، برای فعال‌سازی حالت انتقال به Python 3. این حالت تمام بازبین‌های دیگر را غیرفعال کرده و برای ساختارهایی که در Python 3 نامعتبر بوده یا حذف شده‌اند هشدار و خطا صادر می‌کند.
  • افزودن 'old-octal-literal' به بازبین انتقال به Python 3، که هنگام مواجهه با اعداد هشت‌هشتی با نحو قدیمی صادر می‌شود.
  • افزودن 'implicit-map-evaluation' به بازبین انتقال به Python 3، که هنگام مواجهه با استفاده از تابع توکار map بدون ارزیابی صریح صادر می‌شود.

    تاریخ انتشار: 2014-07-26

  • اجازه دادن به دندانه‌گذاری ادامه‌دار معلق برای رشته‌های متصل‌شده به‌صورت ضمنی.

    بسته شدن شماره #232.

  • ابزار Pylint دوباره روی Python 2.5 کار می‌کند و آزمون‌های آن با موفقیت پاس می‌شوند.
  • رفع برخی موارد مثبت کاذب برای هشدارهای cellvar-from-loop.

    بسته شدن شماره #233.

  • بازگرداندن گره‌های کلاس astroid جدید زمانی که موتور استنتاج تشخیص دهد نتیجه فراخوانی یک تابع روی یک نوع (مانند type یا abc.ABCMeta) درخواست شده است.

    بسته شدن شماره #205.

  • صدور خطای undefined-variable / E0602 <#undefined-variable> برای نام‌های تعریف‌نشده هنگام استفاده از آرگومان metaclass= در Python 3.
  • بررسی‌کننده‌ها اکنون اولویت را رعایت می‌کنند.

    بسته شدن شماره #229

  • رفع یک مورد مثبت کاذب در رابطه با W0511.

    بسته شدن شماره #149.

  • رفع مثبت کاذب unused-import / W0611 <#unused-import> در metaclassهای Python 3.

    بسته شدن شماره #143

  • عدم صدور هشدار bad-format-character / E1300 <#bad-format-character> هنگام مواجهه با قالب 'a' در Python 3.
  • افزودن چندین بررسی برای قالب‌بندی پیشرفته رشته بر اساس PEP 3101: bad-format-string / W1302 <#bad-format-string>، missing-format-argument-key / W1303 <#missing-format-argument-key>، unused-format-string-argument / W1304 <#unused-format-string-argument>، format-combined-specification / W1305 <#format-combined-specification>، missing-format-attribute / W1306 <#missing-format-attribute> و invalid-format-index / W1307 <#invalid-format-index>.
  • صدور خطاهای broad-except / W0703 <#broad-except> و bare-except / W0702 <#bare-except> حتی اگر تعداد مدیریت‌کننده‌های except غیر از ۱ باشد.

    بسته شدن شماره #113

  • صدور خطای attribute-defined-outside-init / W0201 <#attribute-defined-outside-init> برای تمامی موارد، نه فقط برای آخرین انتساب.

    بسته شدن شماره #262

  • صدور خطای not-callable / E1102 <#not-callable> هنگام فراخوانی خصوصیات (properties).

    بسته شدن شماره #268.

  • رفع یک مورد مثبت کاذب در باز کردن نامتوازن مقادیر شیء پیمایش‌پذیر (iterable unpacking)، هنگام مواجهه با گره‌های ستاره‌دار.

    بسته شدن شماره #273.

  • افزودن بررسی‌های جدید invalid-slice-index / E1127 <#invalid-slice-index> و invalid-sequence-index / E1126 <#invalid-sequence-index> برای اندیس‌های نامعتبر دنباله و برش.
  • افزودن هشدار assigning-non-slot / E0237 <#assigning-non-slot>، که انتساب به ویژگی‌های تعریف‌نشده در slots را شناسایی می‌کند.
  • عدم صدور خطای no-name-in-module / E0611 <#no-name-in-module> برای ماژول‌های نادیده‌گرفته‌شده.

    بسته شدن شماره #223.

  • رفع یک مورد مثبت کاذب در unused-variable / W0612 <#unused-variable>، در مواردی که متغیر از طریق یک واردسازی (import) مقداردهی شده است.

    بسته شدن شماره #196.

  • ترتیب تعریف برای کلاس‌ها، آرگومان‌های تابع و حاشیه‌نویسی‌ها (annotations) لحاظ می‌شود.

    بسته شدن شماره #257.

  • عدم صدور unused-variable / W0612 <#unused-variable> هنگام انتساب به یک متغیر nonlocal.

    بسته شدن شماره #275.

  • جلوگیری از انتشار خطای ImportError از بررسی‌کننده import، که در برخی مواردِ مرتبط با بسته‌های فضای نام منجر به فروپاشی (crash) برنامه می‌شد.

    بسته شدن شماره #203.

  • عدم صدور pointless-string-statement / W0105 <#pointless-string-statement> برای رشته‌های مستندات (docstrings) ویژگی‌ها.

    بسته شدن شماره #193.

  • استفاده از حالت مناسب برای pickle هنگام باز کردن و نوشتن فایل آمار.

    بسته شدن شماره #148.

  • عدم صدور پیام hidden-method هنگامی که ویژگی دستکاری موقت (monkey-patched) شده است؛ با انجام این کار مسئولیت عواقب آن با خودتان است.
  • صدور attribute-defined-outside-init / W0201 <#attribute-defined-outside-init> فقط برای تعاریف درون همان ماژولِ کلاسِ مربوطه، برای جلوگیری از مخدوش شدن خروجی در برخی موارد.
  • عدم صدور unnecessary-lambda / W0108 <#unnecessary-lambda> در صورتی که بدنه فراخوانی lambda شامل زنجیره‌سازی فراخوانی باشد.

    بسته شدن شماره #243.

  • عدم صدور missing-docstring / C0111 <#missing-docstring> زمانی که رشته مستندات اصلی از .format استفاده می‌کند.

    بسته شدن شماره #281.

    تاریخ انتشار: 2014-04-30

  • بازگرداندن قابلیت تعیین گزینه init-hook از طریق فایل پیکربندی، که تصادفاً در نسخه 1.2.0 از کار افتاده بود.
  • افزودن یک هشدار جدید [bad-continuation] برای خطوط ادامه‌داری که تورفتگی نادرست دارند.
  • صدور هشدار assignment-from-none / E1128 <#assignment-from-none> زمانی که تابع حاوی دستورهای return خالی است.

    بسته شدن BitBucket #191

  • افزودن یک هشدار جدید برای بستار روی متغیرهایی که درون حلقه‌ها تعریف شده‌اند.

    بسته شدن BitBucket #176

  • عدم صدور هشدار درباره نویسه‌های گریز u در رشته‌های لفظی، هنگام استفاده از رشته‌های لفظی یونیکد در Python 2.*.

    بسته شدن BitBucket #151

  • گسترش بررسی‌های unbalanced-tuple-unpacking / W0632 <#unbalanced-tuple-unpacking> و unpacking-non-sequence / E0633 <#unpacking-non-sequence> به باز کردن ویژگی‌های نمونه نیز.
  • رفع بررسی صریح اسکریپت python (پسرفت در نسخه 1.2)

    بسته شدن #219

  • بازگردانی --init-hook، که در نسخه 1.2.0 به‌طور تصادفی به --init-hooks تغییر نام داده شده بود

    بسته شدن #211

  • افزودن هشدار 'indexing-exception'، که ایندکس کردن یک استثنا در Python 2 را تشخیص می‌دهد (رفتاری که در Python 3 حذف شده است).

تاریخ انتشار: 2014-04-18

  • ارسال مسیرهای جاری python به فرایند pylint هنگام فراخوانی از طریق epylint.

    بسته شدن BitBucket #133.

  • بازگرداندن -i / --include-ids و -s / --symbols به عنوان گزینه‌هایی که کاملاً نادیده گرفته می‌شوند.

    بسته شدن BitBucket #180.

  • افزایش مواردی که در آن‌ها فراخوانی‌های logging شناسایی می‌شوند.

    بسته شدن BitBucket #182.

  • بهبود پردازش pragma به منظور عدم شناسایی رشته‌های pylint:* در غیر از کامنت‌ها.

    بسته شدن BitBucket #79.

  • عدم کرش با خطای UnknownMessage در صورت ظاهر شدن شناسه یا نام پیام ناشناخته در disable یا enable در پیکربندی. وصله توسط Cole Robinson.

    بسته شدن BitBucket #170

  • افزودن هشدار جدید eval-used / W0123 <#eval-used> برای بررسی استفاده از تابع توکار eval.
  • امکان‌پذیر کردن نمایش راهنمای نام‌گذاری برای نام‌های نامعتبر با تنظیم include-naming-hint. همچنین راهنماهای نام‌گذاری قابل پیکربندی شدند.

    بسته شدن BitBucket #138

  • افزودن پشتیبانی از اعمال شیوه‌های نام‌گذاری چندگانه اما منسجم برای انواع مختلف نام در یک ماژول واحد؛ بر اساس وصله نوشته‌شده توسط <morbo@google.com>.
  • همچنین صدور هشدار در مورد docstringهای خالی در متدهای بازنویسی‌شده؛ با مشارکت <sebastianu@google.com>.
  • همچنین بازرسی آرگومان‌های فراخوانی متدهای سازنده، و صدور هشدارهای مربوطه؛ با مشارکت <sebastianu@google.com>.
  • افزودن گزینه پیکربندی جدید logging-modules برای قابل تنظیم کردن فهرست نام‌های ماژول‌هایی که می‌توانند برای logging-not-lazy / W1201 <#logging-not-lazy> و موارد مشابه بررسی شوند؛ با مشارکت <morbo@google.com>.
  • اطمینان از اینکه init-hooks پیش از سایر گزینه‌ها، به‌ویژه load-plugins ارزیابی می‌شود

    بسته شدن #166

  • پشتیبانی از Python 2.5 بازگردانده شد: رفع ایرادات جزئی که مانع از اجرای pylint روی python 2.5 می‌شدند.

    بسته شدن BitBucket #50 بسته شدن BitBucket #62

  • عدم کرش کردن pylint هنگام جستجو برای used-before-assignment / E0601 <#used-before-assignment> در انتساب‌های مدیر بافت (context manager).

    بسته شدن BitBucket #128

  • افزودن هشدار جدید، bad-reversed-sequence / E0111 <#bad-reversed-sequence>، برای بررسی اینکه تابع توکار reversed() یک توالی دریافت کند (پیاده‌سازی __getitem__ و __len__، بدون اینکه یک dict یا زیرکلاسی از dict باشد) یا نمونه‌ای که __reversed__ را پیاده‌سازی کرده است.
  • علامت‌گذاری file به عنوان تابع نامناسب هنگام استفاده از python2

    بسته شدن #8

  • افزودن هشدار جدید bad-exception-context / E0703 <#bad-exception-context>، برای بررسی اینکه raise ... from ... از یک بافت استثنای معتبر (None یا یک استثنا) استفاده کند.
  • بهبود بررسی used-before-assignment / E0601 <#used-before-assignment> برای شناسایی استفاده از 'nonlocal'.
  • صدور undefined-all-variable / E0603 <#undefined-all-variable> در صورتی که متغیر __all__ یک بسته حاوی یک زیرماژول ناموجود باشد.

    بسته شدن #126

  • افزودن یک هشدار جدید abstract-class-instantiated / E0110 <#abstract-class-instantiated> برای بررسی نمونه‌سازی از کلاس‌های انتزاعی ایجادشده با ماژول abc که دارای متدهای انتزاعی هستند.
  • عدم صدور هشدار درباره return-arg-in-generator / E0106 <#return-arg-in-generator> در Python 3.3+.
  • عدم صدور هشدار درباره abstract-method / W0223 <#abstract-method> زمانی که متد انتزاعی از طریق انتساب پیاده‌سازی شده است

    بسته شدن #155

  • بهبود شناسایی وارد کردن چرخه‌ای (cyclic import) در بسته‌ها، وصله توسط Buck Golemon
  • افزودن هشدارهای جدید برای بررسی صحت __slots__ کلاس‌ها: invalid-slots-object و invalid-slots.
  • جستجو برای فایل rc در مسیر ~/.config/pylintrc در صورتی که ~/.pylintrc وجود نداشته باشد

    بسته شدن #121

  • عدم ثبت بررسی‌کننده کلاس‌های سبک جدید (new style checker) با python >= 3
  • رفع مثبت کاذب unused-import / W0611 <#unused-import> در انتساب‌های افزوده

    بسته شدن #78

  • رفع منفی کاذب access-member-before-definition / E0203 <#access-member-before-definition> در رابطه با انتساب‌های افزوده

    بسته شدن #164

  • عدم تلاش برای تحلیل فایل‌های غیر پایتونی، مانند فایل‌های .so

    بسته شدن #122

    تاریخ انتشار: 2013-12-22

  • افزودن بررسی جدید برای استفاده از رهنمودهای deprecated-pragma / I0022 <#deprecated-pragma> شامل "pylint:disable-msg" یا "pylint:enable-msg" که پیش‌تر به عنوان یک warn() عادی صادر می‌شد.
  • جلوگیری از خطای کاذب used-before-assignment / E0601 <#used-before-assignment> برای شناسه تعریف‌شده در گرداننده except که در همان خط استفاده شده است.

    بستن #111

  • ترکیب 'no-space-after-operator'، 'no-space-after-comma' و 'no-space-before-operator' در یک هشدار جدید به نام 'bad-whitespace'.
  • افزودن هشدار جدید superfluous-parens / C0325 <#superfluous-parens> برای پرانتزهای غیرضروری پس از برخی کلیدواژه‌ها.
  • رفع یک کرش احتمالی در هشدار redefine-in-handler در صورتی که نام بازتعریف‌شده یک گره تودرتوی getattr باشد.
  • افزودن گزینه‌ای جدید برای هشدار multi-statement جهت مجاز دانستن دستورهای if تک‌خطی.
  • افزودن خطای bad-context-manager / E0235 <#bad-context-manager> جهت بررسی اینکه متد ویژه '__exit__' تعداد درستی از آرگومان‌ها را می‌پذیرد یا خیر.
  • اجرای pylint به عنوان یک ماژول پایتون با 'python -m pylint' (توسط Anatoly Techtonik).
  • بررسی کلاس‌های غیر از استثنا در داخل بند except.
  • پشتیبانی epylint از گزینه‌هایی که پس از فایل برای تحلیل به pylint داده می‌شوند و برخورداری از اعتبارسنجی اولیه ورودی؛ وصله‌ها توسط felipeochoa و Brian Lane ارائه شده‌اند.

    بستن BitBucket #53 بستن BitBucket #54

  • افزودن یک هشدار جدید، non-iterator-returned / E0301 <#non-iterator-returned>، برای مقادیر غیر تکرارکننده بازگردانده‌شده توسط '__iter__'.
  • افزودن بررسی‌های جدید برای باز کردن غیردنباله‌ها در انتساب‌ها (unpacking-non-sequence / E0633 <#unpacking-non-sequence>) و همچنین باز کردن نامتعادل تاپل (unbalanced-tuple-unpacking / W0632 <#unbalanced-tuple-unpacking>).
  • هشدار useless-else-on-loop / W0120 <#useless-else-on-loop> در صورتی که در بند else از حلقه داخلی دستور break وجود داشته باشد صادر نمی‌شود.

    بستن #117

  • عدم علامت‌گذاری input به عنوان تابع نامناسب هنگام استفاده از python3.

    بستن #110

  • هشدار badly-implemented-container در پیاده‌سازی فعلی خود مشکلات متعددی ایجاد کرد. غیرفعال‌سازی آن تا زمانی که راه‌حل بهتری داشته باشیم.

    ارجاع #112

  • استفاده از regexp صفت برای ویژگی‌ها در python3، مشابه python2
  • ایجاد دایرکتوری PYLINTHOME در صورت نیاز؛ این عملیات ممکن است با شکست مواجه شده و منجر به هشدارهای کاذب هنگام وارد کردن pylint.config شود.
  • اصلاح setup.py تا pylint هنگام استفاده از python3 روی Windows به درستی نصب شود
  • اصلاحات و بهبودهای گوناگون در مستندات
  • رفع یک مورد مثبت کاذب trailing-whitespace / C0303 <#trailing-whitespace> روی Windows

    بستن #55

تاریخ انتشار: 2013-08-06

  • افزودن بررسی برای استفاده از تابع 'exec'
  • گزینه جدید --msg-template برای کنترل خروجی، منسوخ کردن قالب‌های خروجی "msvc" و "parseable" و همچنین حذف گزینه‌های --include-ids و --symbols
  • عدم صادر کردن [fixme] برای تک‌تک خطوط، در صورتی که مقدار پیکربندی 'notes' خالی باشد اما [fixme] فعال باشد.
  • صادر کردن هشدار درباره خطوطی که از حد ستون فراتر می‌روند، هنگامی که آن خطوط درون docstringهای چندخطی هستند.
  • عدم بررسی دوباره نام پارامترها با عبارت باقاعده برای پارامترها و متغیرهای درون‌خطی.
  • افزودن هشدار جدید missing-final-newline / C0304 <#missing-final-newline> برای فایل‌هایی که فاقد خط پایانی جدید (newline) هستند.
  • متدهایی که به عنوان ویژگی (property) تزیین شده‌اند، اکنون برای اهداف بررسی نام به عنوان صفت (attribute) در نظر گرفته می‌شوند.
  • نام‌های اعضای کلاس نمونه مشتق‌شده دیگر بررسی نمی‌شوند.
  • نام‌ها در دستورات global اکنون در برابر عبارت باقاعده مربوط به ثابت‌ها بررسی می‌شوند.
  • برای انتساب نام در سطح بالا، در صورتی که pylint بتواند تشخیص دهد مقدار سمت راست یک کلاس است (مانند collections.namedtuple())، از عبارت باقاعده نام کلاس استفاده خواهد شد.
  • ساده‌سازی پیام invalid-name / C0103 <#invalid-name>
  • افزودن هشدار جدید invalid-encoded-data (W0512) برای فایل‌هایی که حاوی داده‌هایی هستند که نمی‌توان آنها را با کدگذاری مشخص‌شده یا پیش‌فرض رمزگشایی کرد.
  • هشدار جدید bad-open-mode / W1501 <#bad-open-mode> برای فراخوانی‌های open (یا file) که حالت‌های باز کردن نامعتبر را مشخص می‌کنند (پیاده‌سازی اولیه توسط Sasha Issayev).
  • هشدار جدید old-style-class (C1001) برای کلاس‌هایی که فاقد هرگونه کلاس پایه هستند.
  • افزودن نوع نام جدید 'class_attribute' برای صفت‌های تعریف‌شده در حوزه کلاس. به طور پیش‌فرض، هر دو نام ثابت و متغیر مجاز هستند.
  • هشدار جدید trailing-whitespace / C0303 <#trailing-whitespace> که درباره فاصله‌های خالی انتهایی هشدار می‌دهد.
  • افزودن هشدار جدید unpacking-in-except (W0712) درباره باز کردن استثناها در گرداننده‌ها، که در Python 3 پشتیبانی نمی‌شود.
  • افزودن یک گزینه پیکربندی برای missing-docstring / C0111 <#missing-docstring> جهت مستثنی کردن اختیاری توابع/متدها/کلاس‌های کوتاه از این بررسی.
  • افزودن نوع گره متخلف به missing-docstring / C0111 <#missing-docstring> و empty-docstring / C0112 <#empty-docstring>.
  • کلاس‌های ابزاری جدید برای آزمون‌های واحد مجزا به ازای هر بررسی‌کننده در testutils.py
  • عدم هشدار درباره بازتعریف متغیرهایی که با عبارت باقاعده ساختگی مطابقت دارند.
  • در نظر نگرفتن تمامی متغیرهای شروع‌شونده با _ به عنوان متغیرهای ساختگی، بلکه فقط خودِ _ .
  • امکان پیکربندی هشدار line-too-long / C0301 <#line-too-long> با افزودن یک عبارت باقاعده برای خطوطی که محدودیت طول نباید روی آنها اعمال شود
  • عدم هشدار درباره خط طولانی در صورتی که یک گزینه pylint disable باعث افزایش طول آن فراتر از حد مجاز شود
  • عدم علامت‌گذاری نام‌ها در دستورات تودرتوی with به عنوان تعریف‌نشده.
  • افزودن هشدار جدید 'old-raise-syntax' برای نحو منسوخ‌شده raise Exception, args
  • پشتیبانی از PEP 3102 و پیام جدید missing-kwoa / E1125 <#missing-kwoa> برای مفقود بودن آرگومان کلیدواژه‌ای اجباری

    بستن Logilab #107788

  • اصلاح املای گزینه max-branchs، که اکنون max-branches است
  • افزودن کلاس پایه و رابط جدید برای بررسی‌کننده‌هایی که به جای نحو روی توکن‌ها کار می‌کنند و فایل ورودی را فقط یک بار توکن‌بندی می‌نمایند.
  • پیروی از تغییر نام astng به astroid
  • بررسی برای باز کردن نامتعادل در انتساب‌ها

    بستن BitBucket #37

  • رفع مثبت کاذب incomplete-protocol برای نگه‌دارنده‌های فقط‌خواندنی مانند tuple

    بستن BitBucket #25

  • رفع مثبت کاذب E1003 در Python 3 برای super() بدون آرگومان

    بستن BitBucket #16.IP • 2 بازگرداندن مستندات به توزیع کد منبع

    بستن BitBucket #6

  • epylint دیگر هنگام وجود خروجی حجیم روی stderr مربوط به pylint قفل نخواهد کرد

    بستن BitBucket #15

  • رفع مشکل epylint با python3

    بستن BitBucket #7

  • حذف ماژول string از فهرست پیش‌فرض ماژول‌های منسوخ‌شده

    بستن BitBucket #3

از آغاز pylint تا pylint 2.14.0 (شامل آن)، تغییرنامه‌ای داشتیم که شامل تمام تغییرات غیرجزئی در Pylint بود، از جمله تغییراتی که برای کاربران ملموس نبودند؛ یعنی تغییراتی که تنها اگر توسعه‌دهنده‌ای باشید که روی pylint یا افزونه‌های pylint کار می‌کنید، یا تاریخ‌نگار متن‌باز هستید، برایتان جالب خواهد بود.

شماره تیکت‌ها تقریباً همیشه داخلی Logilab هستند و برخی از bitbucket می‌آیند.

تاریخ انتشار: 2013-04-25

  • bitbucket #1: رفع کرش "dictionary changed size during iteration"
  • #74013: پیام هشدار جدید E1310[bad-str-strip-call] هنگام فراخوانی متد {l,r,}strip با نویسه‌های تکراری (وصله از Torsten Marek)
  • #123233: پیام جدید E0108[duplicate-argument-name] برای گزارش نام‌های تکراری آرگومان
  • #81378: صدور W0120[useless-else-on-loop] برای حلقه‌های بدون break
  • #124660: وابستگی‌های داخلی نباید در گزارش وابستگی‌های خارجی ظاهر شوند
  • #124662: رفع خطای نام که هنگام گنجاندن نمادها در پیام‌های خروجی باعث کرش می‌شد
  • #123285: اعمال پراگماهای هشدارهای متصل به خطوط، روی خطوط فیزیکی کد منبع
  • #123259: عدم صدور E0105 برای عبارت‌های yield درون lambdaها
  • #123892: عدم وقوع کرش هنگام تلاش برای نمایش خطی از کد منبع که با تنظیمات محلی (locale) فعلی قابل انکود نیست
  • ساده‌سازی بررسی مقادیر پیش‌فرض خطرناک با یکپارچه‌سازی آزمون‌ها برای تمام لیترال‌های مرکب تغییرپذیر متفاوت.
  • بهبود توضیحات برای redundant-keyword-arg / E1124 <#redundant-keyword-arg>

تاریخ انتشار: 2013-02-26

  • #20693: جایگزینی pylint.el با نسخه Ian Eure (وصله از J.Kotta)
  • #105327: افزودن پشتیبانی از گزینه --disable=all و منسوخ‌سازی دستور درون‌خطی 'disable-all' به نفع 'skip-file' (وصله از A.Fayolle)
  • #110840: افزودن پیام‌های I0020 و I0021 برای گزارش پیام‌های سرکوب‌شده و پراگماهای سرکوب بلااستفاده. (وصله از Torsten Marek)
  • #112728: افزودن هشدار E0604 برای اشیاء غیررشته‌ای در __all__ (وصله از Torsten Marek)
  • #120657: افزودن هشدار W0110/deprecated-lambda هنگامی که یک map/filter روی lambda می‌تواند comprehension باشد (وصله از Martin Pool)
  • #113231: بررسی‌کننده logging اکنون علاوه بر ماژول پایه logging، نمونه‌های کلاس‌های Logger را نیز بررسی می‌کند. (وصله از Mike Bryant)
  • #111799: عدم هشدار درباره دنباله گریز هشت‌هشتی، اما هشدار درباره o که در پایتون هشت‌هشتی نیست (وصله از Martin Pool)
  • #110839: اختصاص کلید <F5> به دکمه Run در pylint-gui
  • #115580: رفع هشدار نادرست W0212 (دسترسی به عضو محافظت‌شده) هنگام فراخوانی super (وصله از Martin Pool)
  • #110853: رفع کرش هنگامی که متد __init__ در یک کلاس پایه به جای تعریف مستقیم تابع، از طریق انتساب ایجاد شده است (وصله از Torsten Marek)
  • #110838: رفع کرش pylint-gui هنگامی که include-ids فعال است (وصله از Omega Weapon)
  • #112667: رفع صدور هشدارهای reimport برای واردسازی‌های ترکیبی و گسترش مورد آزمون (وصله از Torsten Marek)
  • #112698: رفع کرش مرتبط با ویژگی‌های __all__ غیرقابل استنتاج و محتویات نامعتبر __all__ (وصله از Torsten Marek)
  • اصلاحات مربوط به Python 3:
#110213: رفع واردسازی بررسی‌کننده‌های خراب‌شده در python 3.3 که باعث
شکست "No such message id W0704" می‌شد
  • #120635: بازتعریف تابع cmp استفاده‌شده در pylint.reporters
  • گنجاندن شناسه کامل هشدار برای I0020 و I0021 و اطمینان از تخلیه (flush) هشدارها پس از هر ماژول، نه در انتهای اجرای pylint. (وصله از Torsten Marek)
  • تغییر عبارت منظم برای گزینه‌های درون‌خطی به‌طوری که حتماً باید قبل از آن یک # بیاید (وصله از Torsten Marek)
  • پیش‌بینی‌پذیر کردن خروجی dot برای نمودار واردسازی‌ها و عدم وابستگی آن به ترتیب رشته‌ها در درهم‌سازی‌ها (hashes). (وصله از Torsten Marek)
  • افزودن قلاب‌ها برای راه‌اندازی مسیر واردسازی و انتقال تغییرات sys.path مربوط به pylint به درون آن‌ها. (وصله از Torsten Marek)

    تاریخ انتشار: 2012-10-05

  • #106534: افزودن گزینه --ignore-imports به بررسی شباهت کد و ابزار خط فرمان 'symilar' (وصله توسط Ry4an Brase)
  • #104571: بررسی گریزهای غیرعادی بک‌اسلش، با معرفی پیام‌های جدید W1401 و W1402 (وصله توسط Martin Pool)
  • #100707: بررسی استفاده از boolop به عنوان کلاس استثنا، با معرفی پیام جدید W0711 (وصله توسط Tim Hatch)
  • #4014: بهبود بررسی اولین آرگومان‌های متدهای metaclass، با معرفی پیام جدید C0204 (وصله توسط <lothiraldan@gmail.com>، نهایی‌شده توسط sthenault)
  • #4685: بررسی سازگاری متغیر __all__ یک ماژول، با معرفی پیام جدید E0603
  • #105337: امکان استفاده از گزارشگر سفارشی در output-format (وصله توسط Kevin Jing Qiu)
  • #104420: بررسی کامل بودن پروتکل و جلوگیری از مثبت کاذب در R0903 (وصله توسط Peter Hammond)
  • #100654: رفع خطای دستوری برای پیام W0332 (استفاده از 'l' به عنوان شناسه long int)
  • #103656: رفع مثبت کاذب W0231 برای عدم فراخوانی object.__init__ (وصله توسط <lothiraldan@gmail.com>)
  • #63424: رفع مشکل غیرفعال‌سازی گزارش شباهت با تغییر نام صحیح آن به RP0801
  • #103949: ایجاد یک نقطه ورود console_scripts برای استفاده توسط easy_install،‏ buildout و pip
  • رفع مشکل تداخل بین مفسری (دسترسی ناسازگار به __builtins__)
  • عدم گنجاندن فایل‌های آزمون در بسته انتشار؛ این فایل‌ها هنگام نصب با python3 باعث فروپاشی می‌شدند (#72022، #82417، #76910)

تاریخ انتشار: 2012-07-17

  • #93591: صدور صحیح هشدارها درباره متغیرهای رونویسی‌شده هنگامی که یک گرداننده except به جای یک نام واحد، شامل چندتایی (tuple) از نام‌ها باشد (وصله توسط <tmarek@google.com>)
  • #7394: عدم صدور W0212 (دسترسی به عضو محافظت‌شده) در انتساب‌ها (وصله توسط <lothiraldan@gmail.com>)
  • #18772: عدم بررسی سازگاری پروتوتایپ برای متدهای مَنگل‌شده (mangled) (وصله توسط <lothiraldan@gmail.com>)
  • #92911: صدور W0102 هنگامی که مجموعه (set) به عنوان آرگومان پیش‌فرض در توابع استفاده می‌شود (وصله توسط <tmarek@google.com>)
  • #77982: عدم صدور E0602 برای متغیرهای حلقه در تعاریف فشرده (comprehensions) که به عنوان مقادیر آرگومان درون یک دکوراتور استفاده شده‌اند (وصله توسط <tmarek@google.com>)
  • #89092: عدم صدور E0202 (پنهان کردن یک متد توسط ویژگی) روی متدهای @property
  • #92584: رفع فروپاشی pylint-gui به دلیل تغییر در API داخلی
  • #87192: رفع فروپاشی هنگامی که دکوراتورها با بیش از یک نقطه مورد دسترسی قرار می‌گیرند (برای نمونه @a.b درست عمل می‌کند، اما @a.b.c دچار فروپاشی می‌شود)
  • #88914: رفع پردازش گزینه‌های --generated-members که هنگام استفاده از مجموعه‌ای از مقادیر regexp منجر به فروپاشی می‌شد
  • رفع فروپاشی‌های احتمالی ناشی از برانگیختن خطای InferenceError توسط utils.safe_infer

تاریخ انتشار: 2011-12-08

  • #81078: هشدار در صورتی که نام‌ها در گرداننده‌های استثنا، نام‌های موجود را رونویسی کنند (وصله توسط <tmarek@google.com>)
  • #81113: رفع مشکل نمایش پیام‌های W0702 با شماره خط نادرست (وصله توسط <tmarek@google.com>)
  • #50461، #52020، #51222: عدم صدور هشدار هنگام استفاده از قابلیت‌های property.setter/deleter پایتون 2.6 (وصله توسط <dneil@google.com>)
  • #9188، #4024: فعال نکردن W0631 در صورتی که یک متغیر حلقه در شاخه else از یک حلقه for مقداردهی شده باشد.

    تاریخ انتشار: 2011-10-7

  • #74742: پیکربندی‌پذیر کردن نام مجاز برای نخستین آرگومان متدهای کلاس (وصله توسط Google)
  • #74087: رسیدگی به حالتی که در آن استنتاج یک ماژول YES برمی‌گرداند؛ این کار از برخی موارد "TypeError: '_Yes' object does not support indexing" جلوگیری می‌کند (وصله توسط Google)
  • #74745: پیکربندی‌پذیر کردن نام استثناهای "بیش از حد کلی" (وصله توسط Google)
  • #74747: بروز فروپاشی هنگام جستجوی یک صفت ویژه در حوزهٔ کلاس (وصله توسط Google)
  • #76920: بروز فروپاشی در مواردی مانند "pylint --rcfile" (وصله توسط Torsten Marek)
  • #77237: هشدار E0202 ممکن است بسیار گمراه‌کننده باشد
  • #73941: جدول پیام‌های گزارش HTML به درستی رندر نمی‌شود

تاریخ انتشار: 2011-07-18

  • #69738: افزودن پشتیبانی از عبارت‌های باقاعده برای "generated-members"
  • شناسه‌های بررسی‌کننده‌های logging و string_format تغییر یافته است: logging: 65 -> 12، string_format: 99 -> 13 همچنین افزودن مستنداتی مبنی بر این‌که شناسه‌های بازهٔ 1-50 باید برای بررسی‌کننده‌های داخلی pylint رزرو شوند
  • #69993: بررسی‌های تکمیلی قالب رشته برای ماژول logging: بررسی آرگومان‌های مفقود، آرگومان‌های بیش از حد، یا قالب‌های رشته‌ای نامعتبر در ماژول بررسی‌کنندهٔ logging. مشارکت توسط Daniel Arena
  • #69220: افزودن آفست ستون به گزارش‌ها. اگر یک گزارشگر سفارشی دارید، این تغییر ممکن است عملکرد آن را مختل کند زیرا بخش مکان اکنون یک مورد جدید برای ارائهٔ آفست ستون دریافت کرده است.
  • #60828: رفع مورد مثبت کاذب در بررسی reimport
  • #70495: شکست وارد کردن‌های مطلق (absolute imports) بسته به مسیر ماژول (وصله توسط Jacek Konieczny)
  • #22273: اصلاح مستندات گزینهٔ --ignore جهت تطابق با واقعیت

تاریخ انتشار: 2011-01-11

  • به‌روزرسانی مستندات، افزودن صفحه‌های راهنما (man pages)
  • چندین بهبود در کارایی
  • نهایی‌سازی پشتیبانی از python3
  • هشدار جدید W0106 تحت عنوان 'Expression "%s" is assigned to nothing'
  • حذف پیام‌های E0501 و E0502 دربارهٔ کدگذاری نادرست منبع: دیگر کاربردی ندارد زیرا برای نسخهٔ python >= 2.5 یک خطای نگارشی محسوب می‌شود و اکنون ما تنها از این نسخهٔ پایتون و بالاتر پشتیبانی می‌کنیم.
  • عدم صدور W0221 یا W0222 هنگامی که متدها آرگومان‌های متغیر دارند (مانند *arg و/یا **args). وصله ارسال‌شده توسط Charles Duffy.

تاریخ انتشار: 2010-11-15

•
نسخه‌های پایتون: پشتیبانی کمینه از python3.x؛ کنار گذاشتن پشتیبانی از نسخه‌های python < 2.5

تاریخ انتشار: 2010-10-27

  • رفع #48066: فروپاشی pylint هنگام تغییر مسیر خروجیِ حاوی نویسه‌های غیر ASCII
  • رفع #19799: خروج با وضعیت 2 در اجرای "pylint -blah"
  • به‌روزرسانی مستندات

    تاریخ انتشار: 2010-09-28

•
بازگردانی سازگاری با python 2.3. به همراه logilab-astng 0.21.3 و logilab-common 0.52، این نسخه به احتمال بسیار زیاد آخرین انتشاری خواهد بود که از python < 2.5 پشتیبانی می‌کند.

تاریخ انتشار: 2010-08-26

  • رفع اشکال #36193: پرتاب استثنا توسط بررسی‌کنندهٔ import در واردکردن‌های چرخه‌ای
  • رفع اشکال #28796: پسرفت در --generated-members ایجاد شده در pylint 0.20
  • پاک‌سازی و مرتب‌سازی برخی مستندات

تاریخ انتشار: 2010-06-04

  • رفع اشکال #28962: فروپاشی pylint با گزینه‌های جدید، به دلیل نبود داده‌های آماری هنگام نوشتن گزارش Statistics by types
  • به‌روزرسانی صفحهٔ راهنما (man page) به شیوهٔ استفاده از خط فرمان 0.21 یا بالاتر (رفع اشکال دبیان #582494)

تاریخ انتشار: 2010-05-11

  • خط فرمان به‌روزرسانی شد (بسته شدن #9774، #9787، #9992، #22962):
  • تمامی گزینه‌های enable-* / disable-* در --enable / --disable ادغام شدند
  • تغییر ناسازگار با گذشته: نام کوتاه --errors-only به -E تبدیل شد، و -e به --enable اختصاص یافت
  • خروجی pylint --help بسیار ساده‌تر شد؛ برای دریافت خروجی کامل، گزینهٔ --long-help در دسترس است
  • بازنگری در gui، با تشکر از دانشجویان دانشگاه تورنتو (آن‌ها مشارکت‌کنندگان فوق‌العاده‌ای در این نسخه بودند!)
  • رفع اشکال #21591: در صورت تنظیم reports بر روی 'no'، گزارش‌دهندهٔ html هیچ خروجی‌ای تولید نمی‌کند
  • رفع اشکال #4581: عدم نمایش هشدار فقدان docstring (کد C0111) در صورت بازنویسی (override) یک متد
  • رفع اشکال #4683: شمارش دوبرابری نویسه‌های غیر ASCII در صورت کدگذاری utf8
  • رفع اشکال #9018: اهمیت یافتن ترتیب متدها هنگام استفاده از defining-attr-method
  • رفع اشکال #4595: عدم رخداد هشدار ویرگول بدون فاصلهٔ بعد از آن برای ویرگول انتهایی در تعریف list/tuple/dict
  • رفع اشکال #22585: [وصله] رفع هشدارهای man برای صفحهٔ راهنمای pyreverse.1
  • رفع اشکال #20067: بروز خطای AttributeError: 'NoneType' object has no attribute 'name' با دستور with

تاریخ انتشار: 2010-03-01

  • رفع اشکال #19498: رفع اشکال فایل دسته‌ای ویندوز (windows batch file)
  • رفع اشکال #19339: پروندهٔ pylint.el : متغیر ناموجود py-mod-map (بسته شدن گزارش باگ دبیان - #475939)
  • پیاده‌سازی #18860: پیام جدید W0199 برای عبارت assert (a, b)
  • پیاده‌سازی #9776: پیام 'W0150'، عبارات break یا return در بلوک finally ممکن است استثنا را ببلعند (پنهان کنند).
  • رفع اشکال #9263: متدهای __init__ و __new__ برای آرگومان‌های استفاده‌نشده بررسی می‌شوند
  • رفع اشکال #20991: نادیده گرفته شدن تعاریف دامنهٔ کلاس (class scope) در یک genexpr
  • رفع اشکال #5975: عدم شناسایی کلاس واسط انتزاعی (Abstract intermediate class) به‌عنوان یک کلاس انتزاعی
  • رفع اشکال #5977: عبارات yield و return شمارنده‌های جداگانه دارند؛ عدم نمایش مجدد R0911 (Too many return statements) هنگامی که یک تابع عبارات yield زیادی دارد
  • پیاده‌سازی #5564: نادیده گرفتن آرگومان‌های تابع / متد با پیشوند "_" در شمارش آرگومان‌ها / متغیرهای محلی.
  • پیاده‌سازی #9982: پیام خطای اختصاصی E0711 هنگام پرتاب NotImplemented
  • حذف گزینهٔ --cache-size

    تاریخ انتشار: 2009-12-18

  • پیاده‌سازی #18947 و #5561: بررسی‌کننده برای آرگومان‌های تابع
  • گنجاندن بررسی‌کننده قالب‌بندی رشته James Lingard
  • گنجاندن فهرست‌بندی ساده پیام‌ها (شناسه‌ها) توسط Vincent Ferotin (#9791)
  • گزینه --errors-only دیگر خطای مهلک را پنهان نمی‌کند
  • گنجاندن وصله‌های James Lingard برای ++/-- و کلید تکراری در دیکشنری‌ها
  • گنجاندن وصله‌های James Lingard برای بررسی‌کننده آرگومان‌های فراخوانی تابع
  • بهبود کد و مستندات Flymake ارائه‌شده توسط Derek Harland
  • بازطراحی ساختار و اصلاح بررسی‌کننده وارد کردن‌ها (imports)
  • اصلاح #18862: مثبت کاذب E0601 با توابع lambda
  • اصلاح #8764: مثبت کاذب وجود بیش از یک دستور در یک خط با try/except/finally
  • اصلاح #9215: خطای متغیر تعریف‌نشده کاذب در تابع lambda
  • اصلاح برای مثبت کاذب w0108 (توسط Nathaniel)
  • اصلاح test/fulltest.sh
  • #5821 افزودن تابع کمکی برای اجرای pylint در فرایندی دیگر (وصله ارائه‌شده توسط Vincent Ferotin)

تاریخ انتشار: 2009-03-25

  • تست‌ها با python 2.4، 2.5 و 2.6 موفق بودند؛ 2.3 تست نشده است
  • اصلاح #8687، مثبت کاذب W0613 در تابع درونی
  • اصلاح #8350، مثبت کاذب C0322 در رشته چندخطی
  • اصلاح #8332: تنظیم شماره خط E0501 به نخستین خطی که نویسه غیر ascii در آن یافت شده است
  • جلوگیری از برخی موارد منفی کاذب E0203 / E0602 از طریق تشخیص به‌ترتیب AttributeError / NameError
  • پیاده‌سازی #4037: عدم صدور W0142 (جادوی * یا **) هنگامی که صرفاً از آرگومان‌های /* ارسال شده‌اند
  • تکمیل #5573: فهرست کامل‌تری از متدهای خاص، همچنین نادیده گرفتن W0613 برای متدهای داخلی python
  • عدم نمایش پیش‌فرض پیام‌های اطلاعاتی
  • ادغام وصله‌های Yuen Ho Wong روی فایل‌های Emacs lisp

تاریخ انتشار: 2009-03-19

  • بررسی نقطه‌ویرگول: انتقال W0601 به W0301
  • حذف rpython: حذف تمام بررسی‌کننده‌ها، ماژول‌ها و تست‌های rpython
  • سازگاری با astng 0.18: پشتیبانی از رابط‌های تغییریافته ماژول _ast

تاریخ انتشار: 2009-01-28

  • تغییر گزینه‌های [en|dis]able-msg-cat: تنها پذیرش دسته‌بندی‌های پیام مشخص‌شده با حرف اولشان (مانند IRCWEF) بدون نیاز به کاما به عنوان جداکننده
  • افزودن اسکریپت epylint.bat برای رفع مشکل نصب در Windows
  • پشتیبانی از setuptools/easy_install
  • گنجاندن نسخه اصلاح‌شده وصله Maarten ter Huurne برای جلوگیری از هشدار W0613 روی آرگومان‌های متد بازنویسی‌شده
  • پیاده‌سازی #5575 (حذف پیام بیهوده W0704) با افزودن پیش‌فرض W0704 به پیام‌های نادیده‌گرفته‌شده
  • پیام جدید W0108، بررسی عبارات مشکوک lambda (ارائه‌شده توسط Nathaniel Manista)
  • اصلاح W0631، مثبت کاذب گزارش‌شده توسط Paul Hachmann
  • اصلاح #6951: مثبت کاذب با W0104
  • اصلاح #6949
  • وصله‌هایی از Mads Kiilerich:
  • پیاده‌سازی #4691، خروج pylint با وضعیت بازگشتی غیر صفر در صورت صدور هر پیامی غیر از Information
  • اصلاح #3711 و #5626 (باگ تحلیل نام با دکوراتور و اعضای کلاس)
  • اصلاح #6954

    تاریخ انتشار: 2008-10-13

  • رفع #5672: رفتار عجیب W0706 (حذف W0706)
  • رفع #5998: مستندات به نشانی اینترنتی نادرستی برای فهرست پستی اشاره می‌کرد
  • رفع #6022: عدم نمایش پیام خطا در صورت نام‌گذاری نادرست ماژول‌ها
  • رفع #6040: ابزار pytest فایل test/func_test.py را اجرا نمی‌کند

تاریخ انتشار: 2008-09-15

  • رفع #4910: مقادیر پیش‌فرض در صفحهٔ راهنما (manpage) وجود ندارند
  • رفع #5991: فایل‌های مفقود در بستهٔ tarball نگارش 0.15.0
  • رفع #5993: ابزار epylint باید با python 2.3 کار کند

تاریخ انتشار: 2008-09-10

  • گنجاندن بستهٔ pyreverse و قابلیت تولید نمودار کلاس
  • اعمال وصلهٔ Stefan Rank برای پشتیبانی از واردسازی نسبی (relative import) در نگارش 2.4
  • گنجاندن راهنمای آموزشی Robert Kirkpatrick و رفع اشتباهات نگارشی
  • رفع اشکال در فعال‌سازی مجدد پیام‌ها
  • رفع #2473: فراخوانی pylint بر روی __init__.py (امیدوارانه)
  • بررسی‌کنندهٔ typecheck: گزینهٔ acquired-members به نفع گزینهٔ عمومی‌تر generated-members کنار گذاشته شد. اگر گزینهٔ zope تنظیم شده باشد، رفتار برنامه اکنون افزودن برخی مقادیر پیش‌فرض به generated-members است.
  • یکپارچه‌سازی با Flymake: افزودن bin/epylint و elisp/pylint-flymake.el

تاریخ انتشار: 2008-01-14

  • رفع #3733: پیام‌ها بسته به ترتیب نام فایل‌ها ظاهر یا ناپدید می‌شوند
  • رفع #4026: فایل pylint.el باید compile را require کند
  • رفع اشکال در گزارشگر رنگی (colorized reporter)، گزارش‌شده توسط Dave Borowitz
  • اعمال وصلهٔ Stefan Rank برای جلوگیری از مثبت کاذب W0410 هنگام وجود چند عبارت واردسازی "from __future__"
  • پیاده‌سازی #4012: علامت‌گذاری بک‌تیک (back tick) به عنوان منسوخ‌شده (پیام جدید W0333)
  • گزینهٔ جدید ignored-class در بررسی‌کنندهٔ typecheck جهت صرف‌نظر از بررسی اعضا بر اساس نام کلاس (وصله ارائه‌شده توسط Thomas W Barr)

تاریخ انتشار: 2007-06-07

  • اصلاح گزینهٔ disable-checker به‌گونه‌ای که بررسی‌کنندهٔ rpython را (که به‌طور پیش‌فرض غیرفعال است) تصادفاً فعال نکند
  • افزودن یادداشتی دربارهٔ افزونهٔ gedit به مستندات

تاریخ انتشار: 2007-03-02

•
رفع مشکل بسته‌بندی نامشخص در نگارش 0.13.0 که منجر به مفقود شدن تعدادی از فایل‌ها در توزیع شده بود

تاریخ انتشار: 2007-02-28

  • بررسی‌کننده جدید RPython (Restricted Python) برای همراهان PyPy یا افرادی که مایلند با استفاده از مترجم پروژه PyPy یک نسخه کامپایل‌شده از برنامه پایتون خود را داشته باشند. برای اطلاعات بیشتر درباره PyPy یا RPython از https://www.pypy.org (قبلاً codespeak.net/pypy/) دیدن کنید.
  • پیام‌های جدید E0104 و E0105 معرفی شدند تا به‌ترتیب درباره "return" و "yield" در خارج از تابع یا متد هشدار دهند.
  • پیام جدید E0106 هنگامی که "yield" و "return something" در یک تابع یا متد با هم ترکیب شده باشند.
  • پیام جدید W0107 برای دستور غیرضروری pass.
  • پیام جدید W0614 برای تمایز قائل شدن بین import X استفاده‌نشده و from X import * استفاده‌نشده (#3209، وصله ارائه‌شده توسط Daniel Drake).
  • گنجاندن وصله Daniel Drake برای ارائه پیام متفاوت E1003 به‌جای E1001 در زمانی که یک عضو مفقود پیدا شده اما شکست در استنتاج شناسایی شده است.
  • گزارش‌گر msvs برای گزارش شماره خط به سبک Visual Studio (#3285).
  • امکان استفاده درون‌خطی از گزینه disable-all (#3218، وصله ارائه‌شده توسط Daniel Drake).
  • گزینه --init-hook برای فراخوانی کدهای دلخواه لازم جهت تنظیم محیط (مانند sys.path) (#3156).
  • یک وصله دیگر از Daniel برای رفع مشکل تجزیه گزینه‌های خط فرمان؛ این قطعاً نسخه DDrake خواهد بود :)
  • رفع #3184: خرابی و کرش هنگام وجود "return" خارج از تابع.
  • رفع #3205: مثبت کاذب در W0704.
  • رفع #3123: مثبت کاذب در W0212 روی متد ایستا (static method).
  • رفع #2485: مثبت کاذب در W0222.
  • رفع #3259: هنگامی که پیامی صریحاً فعال می‌شود، بررسی شود که بررسی‌کننده صادرکننده آن نیز فعال باشد.

تاریخ انتشار: 2006-11-23

  • رفع #3143: باگ W0233 با اشیای YES.
  • رفع #3119: خطای تفاضل یک واحدی (Off-by-one) در شمارش خطوط یک فایل.
  • رفع #3117: تسهیل بازنویسی sys.stdout برای گزارش‌گرها.
  • رفع #2508: مثبت کاذب در E0601 با lambda.
  • رفع #3125: مثبت کاذب E1101 و تکرار پیام. فقط بخش آخر واقعاً رفع شده است زیرا مثبت کاذب اولیه به دلیل تنظیم پویای صفت‌ها در کلاس decimal.Context است.
  • رفع #3149: مثبت کاذب‌های E0101 و معرفی E0100 برای متدهای سازنده (__init__) مولد (generator).
  • رفع برخی موارد مثبت کاذب در بررسی‌کننده قالب‌بندی.

تاریخ انتشار: 2006-09-25

  • رفع مثبت کاذب قالب‌بندی در python >= 2.4 با دستورهای چندخطی.
  • رفع برخی مشکلات نسخه 2.5.
  • رفع باگ حوزه دید عبارت مولد (generator expression) (وابسته به astng 0.16.1).
  • حذف الزام به استفاده از __revision__.

    تاریخ انتشار: 2006-08-10

•
تغییرات کاربردپذیری:
  • گزینه‌های parseable، html و color اکنون توسط یک گزینه واحد output-format مدیریت می‌شوند
  • گزینه‌های enable-<checkerid> و disable-all اکنون توسط دو گزینه (مانعة‌الجمع) enable-checker و disable-checker مدیریت می‌شوند که فهرستی از نام‌های checker جداشده با ویرگول را به عنوان مقدار می‌گیرند
  • تغییر نام گزینه debug-mode به errors-only
  • آغاز نگارش کتابچه راهنمای مرجع کاربر
  • پیام جدید W0212 برای دسترسی به عضو حفاظت‌شده از کد کلاینت (بستن #14081)
  • پیام‌های جدید W0105 و W0106 برگرفته از W0104 (عبارت به نظر بی‌اثر می‌رسد) به ترتیب برای زمانی که عبارت در واقع یک رشته باشد (که گاهی به جای کامنت برای مستندسازی استفاده می‌شود) یا یک عبارت خالی ناشی از یک نقطه‌ویرگول بی‌فایده
  • دسته‌بندی مجدد W0302 به C0302
  • رفع مشکل به طوری که پیام‌های سراسری (global) دیگر به آخرین ماژول تحلیل‌شده مرتبط نمی‌شوند (بستن #10106)
  • رفع برخی باگ‌های مربوط به غیرفعال‌سازی محلی پیام‌ها
  • رفع مشکل cr/lf در هنگام تولید فایل rc در پلتفرم‌های ویندوز

تاریخ انتشار: 2006-04-19

  • رفع خرابی ناشی از بررسی‌کننده exceptions در برخی موارد
  • رفع برخی هشدارهای مثبت کاذب در E1101 برای متدهای انتزاعی یا کلاس‌هایی که __getattr__ را تعریف می‌کنند
  • راه‌حل موقت برای جلوگیری از خطای "_socketobject" has not "connect" member. مشکل اصلی این است که astng قادر به فهم کدی که برای ساخت شیء socket.socket با استفاده از exec به کار رفته نیست
  • افزودن گزینه‌ای در بررسی‌کننده similarity برای نادیده گرفتن docstringها، که به طور پیش‌فرض فعال است
  • گنجاندن وصله از Benjamin Niemann برای فعال‌سازی/غیرفعال‌سازی پیام‌ها در سطح بلوک

تاریخ انتشار: 2006-03-06

  • هشدار: این انتشار شامل برخی تغییرات در پیکربندی است (پایین را ببینید)، بنابراین اگر از فایل‌های پیکربندی استفاده می‌کنید ممکن است نیاز به بررسی و به‌روزرسانی آن‌ها داشته باشید
  • این انتشار نیازمند نسخه 0.15 یا بالاتر astng است (که شما را از خرابی‌های زیاد pylint نجات خواهد داد...)
  • پیام W0705 به E0701 تغییر دسته‌بندی داده شد و اکنون مشکلات وراثت بیشتری را شناسایی می‌کند، و یک مورد مثبت کاذب که در آن عبارت except خالی پس از گرفتن یک Exception می‌آمد برطرف شد (بستن #10422)
  • پیام‌های E0212 و E0214 (متد متالکلاس/کلاس باید mcs/cls را به عنوان آرگومان اول داشته باشد) به C0202 و C0203 تغییر دسته‌بندی داده شدند، زیرا این قاعده به اندازه "self" برای متدهای نمونه (E0213) جاافتاده نیست
  • پیام W0224 به F0220 تغییر دسته‌بندی داده شد (ناتوانی در حل رابط‌های پیاده‌سازی‌شده توسط یک کلاس)
  • یک بررسی‌کننده typecheck جدید، با معرفی بررسی‌های زیر:
  • پیام E1101، دسترسی به عضو ناموجود (پیاده‌سازی #10430)، که نیاز به E0201 را برطرف کرده و بنابراین برخی گزینه‌ها از بررسی‌کننده classes به این بررسی‌کننده منتقل شده‌اند
  • پیام E1102، فراخوانی یک شیء غیرقابل فراخوانی
  • پیام‌های E1111 و W1111 زمانی که یک انتساب روی یک فراخوانی تابع انجام می‌شود اما تابع استنتاج‌شده مقدار None را برمی‌گرداند (پیاده‌سازی #10431)
•
تغییرات در بررسی‌کننده base:
  • بررسی نام صفت‌های سطح ماژول و نمونه (گزینه‌های پیکربندی جدید const-rgx و attr-rgx) (پیاده‌سازی #10209 و #10440)
  • متغیرهای list comprehension و عبارت‌های تولیدکننده (generator expression) عبارت باقاعده مخصوص خود را دارند (گزینه inlinevar-rgx) (پیاده‌سازی #9146)
  • بررسی C0101 به همراه گزینه min-name-length آن حذف شده است (به هر حال این مورد می‌تواند در عبارت باقاعده تعیین شود...)
  • پیام‌های W0103 و W0121 اکنون توسط بررسی‌کننده variables مدیریت می‌شوند (W0103 اکنون W0603 است و W0604 به پیام‌های مختلف تقسیم شده است)
  • پیام‌های W0131 و W0132 به ترتیب به C0111 و C0112 تغییر دسته‌بندی داده شدند
  • پیام جدید W0104 برای عبارت بدون اثر
  • پشتیبانی از عبارت باقاعده برای dummy-variables (گزینه dummy-variables-rgx جایگزین dummy-variables می‌شود) (پیاده‌سازی #10027)
  • مدیریت بهتر عبارت global، پیام‌های W0602، W0603 و W0604 را ببینید (پیاده‌سازی #10344 و #10236)
  • گزینه --debug-mode، تمام بررسی‌کننده‌های فاقد پیام خطا را غیرفعال کرده و بقیه را برای نمایش صرفاً خطا فیلتر می‌کند
  • رفع برخی موارد مثبت کاذب در R0201 (متد می‌تواند یک تابع باشد)

    تاریخ انتشار: 2006-01-10

  • به‌روزرسانی‌های فراوان جهت هماهنگی با تغییرات API در astng 0.14؛ بنابراین پیش از استفاده از این نسخه pylint، بسته logilab-astng نسخه 0.14 یا بالاتر را نصب کنید.
  • بررسی‌کننده شماره ۱۰! newstyle به جستجوی مشکلات مربوط به استفاده از کلاس‌های سبک قدیم / سبک جدید (old style / new style) می‌پردازد (بر پایه قابلیت تشخیص سبک جدید در astng 0.14).
  • گزینه جدید 'load-plugins' برای بارگذاری افزایه‌های جانبی pylint (قابل استفاده از خط فرمان یا از طریق فایل پیکربندی) (پیاده‌سازی #10031).
  • بررسی وجود فایل "pylintrc" در دایرکتوری کاری فعلی پیش از استفاده از فایل مشخص‌شده در متغیر محیطی PYLINTRC یا فایل‌های پیش‌فرض ~/.pylintrc و /etc/pylintrc.
  • رفع مثبت کاذب در W0706 (Identifier used to raise an exception is assigned...) و پرتاب مجدد نمونه استثنای دریافت‌شده.
  • رفع مثبت کاذب در E0611 (No name get in module blabla) هنگام دسترسی به __dict__ یک کلاس.
  • رفع چند مورد مثبت کاذب در E0203 ("access to member before its definition").
  • رفع مثبت کاذب در E0214 ("metaclass method first argument should be mcs) هنگام استفاده از staticmethod بر روی یک metaclass.
  • رفع مشکل بسته‌بندی که در آن دایرکتوری test/regrtest_data وجود نداشت.
  • هشدار W0212 (method could be a function) در دسته‌بندی REFACTOR تحت عنوان R0201 بازطبقه‌بندی شد، و دیگر زمانی که یک متد، متد انتزاعیِ یک کلاس والد را رونویسی (override) می‌کند در نظر گرفته نمی‌شود.
  • گنجاندن نام ماژول در W0401 (wildcard import)، طبق پیشنهاد Amaury.
  • هنگام استفاده از '--parseable'، در صورتی که مسیرها درون زیردایرکتوریِ دایرکتوری کاری فعلی باشند، به صورت نسبی نسبت به آن نوشته می‌شوند (#9789).
  • دستور 'pylint --version' نگارش‌های logilab-astng و logilab-common را نمایش می‌دهد.
  • اصلاح pylint.el جهت مدیریت نویسه فاصله در نام فایل‌ها.
  • اصلاحات متفرقه در سبک نگارش (lint style).

تاریخ انتشار: 2005-11-07

  • رفع مثبت کاذب "deprecated module" زمانی که کد، ماژولی را وارد (import) می‌کند که نام آن با نام یک ماژول منسوخ‌شده آغاز می‌شود (بستن #10061).
  • رفع مثبت کاذب "module has no name __dict__" (بستن #10039).
  • رفع مثبت کاذب "access to undefined variable __path__" (بستن #10065).
  • رفع مثبت کاذب "explicit return in __init__" هنگامی که دستور return در واقع درون یک تابع داخلی قرار دارد (بستن #10075).

تاریخ انتشار: 2005-10-21

  • بررسی وجود نام‌های واردشده از یک ماژول در خود ماژول (E0611)، وصله ارائه‌شده توسط Amaury Forgeot d'Arc.
  • چاپ یک هشدار (W0212) برای متدهایی که می‌توانند یک تابع باشند (پیاده‌سازی #9100).
  • گزینه جدید --defining-attr-methods در بررسی‌کننده کلاس‌ها.
  • گزینه جدید --acquired-members در بررسی‌کننده کلاس‌ها، مورد استفاده هنگام --zope=yes جهت جلوگیری از مثبت کاذب در ویژگی‌های اکتسابی (که با این گزینه جدید فهرست می‌شوند) (بستن #8616).
  • تولید یک خطای E0602 به ازای هر بار استفاده از یک متغیر تعریف‌نشده (پیش‌تر، تنها یک خطا برای اولین استفاده ثبت می‌شد و نه برای موارد پس از آن) (پیاده‌سازی #1000).
  • امکان ذخیره‌سازی گزینه profile.
  • اصلاح فایل .bat در ویندوز، وصله ارائه‌شده توسط Amaury Forgeot d'Arc.
  • رفع یک مورد مثبت کاذب دیگر برای E0601 (access before definition) با حلقه‌های for مانند "for i in range(10): print i" (آزمون func_noerror_defined_and_used_on_same_line).
  • رفع مثبت کاذب برای E0201 (undefined member) هنگام دسترسی به __name__ در یک شیء کلاس.
  • اصلاح ترتیب پیمایش بررسی‌کننده‌های astng.
  • رفع اشکال در بررسی‌کننده قالب‌بندی هنگام تجزیه فایلی از یک پلتفرم با نویسه‌های خط جدیدِ متفاوت (بستن #9239).
  • اصلاح عبارت باقاعده تشخیص کدگذاری (encoding).
  • اصلاح پردازش --rcfile (پشتیبانی از --rcfile=file، بستن #9590).

    تاریخ انتشار: 2005-05-27

  • هشدار: pylint دیگر یک زیربسته از logilab نیست. کاربران ممکن است نیاز داشته باشند دایرکتوری قدیمی logilab/pylint را به صورت دستی حذف کنند.
  • معرفی گزینه جدید --additional-builtins برای مدیریت توابع توکار (builtins) تعریف‌شده توسط کاربر
  • گزینه --reports اکنون دارای نام مستعار کوتاه -r است، و -i برای --include-ids
  • رفع باگی در بررسی‌کننده متغیرها (variables checker) که ممکن بود هنگام تعریف و استفاده از متغیرها در یک دستور مشابه، موجب مثبت کاذب شود (تست func_noerror_defined_and_used_on_same_line)
  • این بار، رفع واقعی مشکل "disable-msg در فایل پیکربندی"، تستی به unittest_lint اضافه شد
  • رفع باگ در --list-messages و python -OO
  • رفع احتمال مثبت کاذب برای W0201

تاریخ انتشار: 2005-04-14

  • امکان تجزیه فایل‌های بدون پسوند هنگامی که مسیری در خط فرمان مشخص شده است (تست noext)
  • عدم توقف در صورت ناتوانی در خواندن یک گزینه درون‌خطی (برای نمونه داخل یک ماژول)، تنها ایجاد یک پیام اطلاعاتی (تست func_i0010)
  • پیام جدید E0103 برای break یا continue در خارج از حلقه (بسته شدن #8883، تست func_continue_not_in_loop)
  • رفع باگ در بررسی‌کننده متغیرها که موجب عدم شناسایی برخی از خطاهای نام واقعی می‌شد (بسته شدن #8884، تست func_nameerror_on_string_substitution)
  • رفع باگ در بررسی‌کننده کلاس‌ها که در صورت انتساب "object" در کلاسی که از آن ارث‌بری می‌کند باعث از کار افتادن pylint می‌شد (تست func_noerror_object_as_class_attribute)
  • رفع مشکل بررسی‌کننده کدهای مشابه (similar checker) هنگامی که گزینه‌های مربوطه در یک فایل پیکربندی تعریف شده‌اند
  • گزینه جدید --generate-man برای تولید صفحه راهنمای pylint (نیازمند جدیدترین نسخه logilab.common (>= 0.9.3))
  • بسته‌بندی صفحه راهنمای تولید‌شده

تاریخ انتشار: 2005-02-24

  • رفع مشکل حوزه دید (scope) که می‌توانست باعث مثبت کاذب و منفی صادق در E0602 شود
  • رفع مشکل برخی گزینه‌ها مانند disable-msg که هنگام دریافت از فایل پیکربندی باعث ایجاد خطا می‌شدند

تاریخ انتشار: 2005-02-16

  • رفع مثبت کاذب در E0201 ("دسترسی به عضو تعریف‌نشده") با فرامعمارها (metaclasses)
  • رفع مثبت کاذب در E0203 ("دسترسی به عضو پیش از تعریف آن") هنگامی که ویژگی‌ها در یک کلاس والد تعریف شده‌اند
  • رفع مثبت کاذب در W0706 ("شناسه مورد استفاده برای ایجاد استثنا منتسب‌شده به...")
  • اصلاح تفسیر "t" به عنوان مقدار متغیر پیکربندی indent-string
  • اصلاح --rcfile به گونه‌ای که --rcfile=pylintrc نیز معتبر باشد (در نسخه‌های پیشین تنها --rcfile pylintrc کار می‌کرد)
  • نمونه جدید بررسی‌کننده خام (raw checker) در دایرکتوری examples/

    تاریخ انتشار: 2005-02-04

  • گزینه جدید --rcfile برای تعیین فایل پیکربندی بدون نیاز به متغیر محیطی PYLINTRC
  • افزودن یک ماژول نمونه برای بررسی‌کننده (checker) سفارشی pylint (دایرکتوری example/ را ببینید)
  • چندین اصلاح برای هماهنگی با تغییرات common 0.9.1 (با این حال همچنان باید با common 0.9.0 کار کند، اگرچه ارتقا توصیه می‌شود)

تاریخ انتشار: 2005-01-20

  • اصلاح مجدد حالت Emacs برای pylint
  • عدم نمایش traceback هنگام اجرای دستور ساده "pylint"
  • رفع باگی که ممکن بود هنگام تحلیل کلاس‌های والد موجب کرش شود
  • رفع مشکلات بررسی‌کننده قالب‌بندی (format checker): عدم توقف روی فایل‌های حاوی چندین CR، جلوگیری از مثبت کاذب خطاهای C0322، C0323 و C0324 در رشته‌های نقل‌قول سه‌گانه دارای علامت نقل‌قول در داخل خود
  • تشخیص صحیح دسترسی به عضوی که بعداً در متد __init__ تعریف شده است
  • وابستگی کنونی به common 0.8.1 برای حل مشکل تحلیل رابط‌ها (بستن #8606)
  • گزینه جدید --list-msgs برای توصیف بررسی‌کننده‌های موجود و پیام‌های آن‌ها
  • افزودن مستندات مخصوص ویندوز به فایل README، مشارکت از طرف Brian van den Broek
  • به‌روزرسانی doc/features.txt (این فایل اکنون با استفاده از گزینه --list-msgs تولید می‌شود)، مدخل‌های بیشتر در FAQ
  • بهبود پوشش آزمون‌ها

تاریخ انتشار: 2004-10-19

  • اجتناب از درون‌ریزی (import) ماژول‌های تحلیل‌شده!
  • دسته‌بندی‌های پیام جدید Refactor و Convention. برخی از هشدارها به این دسته‌بندی‌های جدید منتقل شدند
  • افزوده شدن "similar"، ابزاری برای یافتن خطوط کپی و جای‌گذاری شده کد، هم به صورت ابزار خط فرمان مستقل و هم یکپارچه‌شده به عنوان یک بررسی‌کننده در pylint
  • امکان گزارش وابستگی‌های درون‌ریزی توسط بررسی‌کننده imports به صورت یک گراف dot
  • بررسی‌کننده جدیدی که اغلب موارد تشخیص Refactor را گردآوری می‌کند (همراه با برخی معیارهای جدید)
  • امکان ذخیره گزینه‌های خط فرمان بیشتری در فایل پیکربندی
  • رفع باگ مربوط به تعداد کل / مستندسازی‌نشده متدها

تاریخ انتشار: 2004-07-08

  • اصلاح حالت Emacs برای pylint
  • اصلاح بررسی‌کننده‌های کلاس‌ها جهت مدیریت رابط‌های twisted

تاریخ انتشار: 2004-05-14

  • اصلاح اسکریپت setup.py برای پشتیبانی از bdist_winst (البته نصاب تولیدشده آزمایش نشده است...) همراه با فایل ضروری logilab/__init__.py
  • اصلاح قرارداد نام‌گذاری فایل طبق پیشنهاد Andreas Amoroso
  • رفع باگ عجیب کرش با نام‌های نامعتبر متدها

    تاریخ انتشار: 2004-05-10

  • اصلاح مسیر فایل همراه با --parsable
  • گزینهٔ --parsable به --parseable تغییر نام یافت
  • افزودن وصله از Andreas Amoroso جهت ارسال پیام‌های خروجی به فایل به جای خروجی استاندارد
  • افزودن Run به فهرست نام‌های معتبر متغیر
  • اصلاح عبارت باقاعدهٔ نام‌های متغیر و بررسی نام‌های کلاس‌های محلی
  • مدیریت پایه‌ای فراکلاس‌ها (metaclasses)
  • اعمال no-docstring-rgx از این پس بر روی کلاس‌ها نیز
  • گزینه‌ای جدید برای مشخص کردن عبارت باقاعده‌ای متفاوت برای متدها نسبت به توابع
  • عدم نمایش گزارش ارزیابی هنگامی که هیچ دستوری تحلیل نشده است
  • رفع خرابی (crash) هنگام وجود کلاس تودرتو درون یک متد
  • اصلاح بررسی‌کنندهٔ قالب‌بندی جهت مدیریت رشته‌های با سه نقل‌قول و خطوط ترکیب کد و توضیح
  • استفاده از logilab.common.ureports برای چیدمان گزارش‌ها

تاریخ انتشار: 2004-02-17

  • افزودن یک خروجی متنی قابل تجزیه (parsable)، هنگام استفاده از گزینهٔ --parsable
  • افزودن یک حالت Emacs با استفاده از این خروجی، موجود در پوشهٔ elisp توزیع
  • اصلاح برخی اشتباهات نگارشی در پیام‌ها
  • تغییر مقادیر گزینه include-ids به yn، و مجاز کردن آن در فایل پیکربندی
  • جلوگیری از توقف ناگهانی به دلیل فایل‌های آمار آسیب‌دیده
  • رفع باگ در بررسی‌کنندهٔ قالب‌بندی که ممکن بود اجرای pylint را متوقف کند
  • ارائه اسکریپت‌هایی برای unix و windows جهت اجرای رابط گرافیکی حداقلی tk برای pylint

تاریخ انتشار: 2003-12-23

  • گریز دادن کدهای HTML در پیام‌های گزارشگر HTML (گزارش باگ توسط Juergen Hermann)
  • افزودن "TODO" به فهرست برچسب‌های یادداشت پیش‌فرض
  • افزودن "rexec" به فهرست ماژول‌های منسوخ‌شدهٔ پیش‌فرض
  • اصلاح اشتباهات نگارشی در برخی پیام‌ها

تاریخ انتشار: 2003-12-05

  • رفع باگ در بررسی‌کننده‌های قالب‌بندی و کلاس‌ها
  • حذف دستور print از بررسی‌کننده‌های وارد کردن (imports)
  • ارائه یک رابط کاربری گرافیکی ساده بر پایه tk، که در درجه اول برای کاربران windows مفید است

    تاریخ انتشار: 2003-11-20

  • بررسی‌کننده جدید استثناها، برای بررسی استثناهای رشته‌ای و عبارت‌های except خالی.
  • بررسی‌کننده واردسازی‌ها، وارد کردن مجدد ماژول‌ها را بررسی می‌کند.
  • بررسی‌کننده کلاس‌ها فراخوانی __init__ اجداد و بازنویسی نشدن متدهای انتزاعی را بررسی می‌کند. این بررسی‌کننده دیگر به واردسازی‌های استفاده‌نشده در فایل‌های __init__ ایرادی نمی‌گیرد و گزینه جدید ignore-interface-methods را ارائه می‌دهد که هنگام استفاده از پیاده‌سازی Interface در zope در پروژه‌تان مفید است.
  • بررسی‌کننده پایه، فراخوانی‌های غیرمجاز توابع توکار (کنترل‌شده توسط گزینه bad-functions) و استفاده از * و ** را بررسی می‌کند.
  • بررسی‌کننده قالب‌بندی استفاده از <> و "l" را به‌عنوان نشانگر long int بررسی می‌کند.
  • تغییرات عمده در API داخلی.
  • استفاده از بازنویسی astng بر پایه compiler.ast.
  • افزوده شدن شناسه یکتا برای پیام‌ها، طبق پیشنهاد Wolfgang Grafen.
  • افزوده شدن شناسه یکتا برای گزارش‌ها.
  • امکان دریافت چند ماژول یا فایل به‌عنوان آرگومان.
  • گزینه‌های جدید خط فرمان: --disable-msg، --enable-msg، --help-msg، --include-ids، --reports، --disable-report، --cache-size.
  • گزینه --version نسخه مفسر python را نشان می‌دهد.
  • حذف برخی گزینه‌ها که اکنون با [en|dis]able-msg یا disable-report جایگزین شده‌اند.
  • خواندن گزینه‌های disable-msg و enable-msg در فایل‌های مبدأ (باید در توضیحات بالای فایل و به شکل "# pylint: disable-msg=W0402" باشد).
  • پیام جدید برای ماژول‌هایی که خودشان را وارد می‌کنند به‌جای پیام "cyclic import".
  • رفع باگ مربوط به واردسازی‌های نسبی و چرخه‌ای.
  • رفع باگ در بررسی‌کننده واردسازی‌ها (چرخه‌ها همیشه شناسایی نمی‌شدند).
  • اصلاحات بیشتر در بررسی‌کننده قالب‌بندی: عدم بررسی توضیحات و docstring، و بررسی نخستین خط پس از دندانه‌گذاری.
  • نام‌های مجاز/ممنوع اکنون بر تمام شناسه‌ها اعمال می‌شوند نه فقط متغیرها، بنابراین گزینه پیکربندی از (good|bad)-variable-names به (good|bad)-names تغییر یافت.
  • افزودن string، rexec و Bastion به فهرست پیش‌فرض ماژول‌های منسوخ‌شده.
  • چاپ نکردن هشدار تعریف مجدد برای تابع/کلاس/متدِ تعریف‌شده در شاخه‌های ناسازگار با هم (mutually exclusive).

تاریخ انتشار: 2003-10-10

  • افزوده شدن برخی مستندات و رفع چند غلط املایی.
  • تنظیم متغیر محیطی PYLINT_IMPORT به 1 در طول اجرای pylint.
  • بررسی وجود داشتن متغیرهای "واردشده" با استفاده از دستور global.
  • مشکلات دندانه‌گذاری اکنون به‌جای خطا به هشدار تبدیل شده‌اند.
  • اصلاح checkers.initialize برای تلاش جهت بارگذاری تمام فایل‌ها با پسوند شناخته‌شده python (وصله از wrobell).
  • اصلاح شماری از پیام‌ها.
  • اصلاح فایل پیکربندی نمونه.
  • اصلاح گزینه bad-construction.
  • اصلاح بررسی‌کننده کدگذاری (encoding checker).
  • اصلاح بررسی‌کننده قالب‌بندی (format checker).

    تاریخ انتشار: 2003-09-12

  • بررسی‌کننده جدید برای کدگذاری منبع / FIXME (بر اساس pep 263)
  • گزینه جدید --zope که واردسازی Zope را فعال می‌کند. برای بررسی کدهای محصولات Zope مفید است.
  • گزینه جدید --comment که یادداشت ارزیابی نظر را فعال می‌کند (به طور پیش‌فرض غیرفعال است).
  • برطرف‌سازی انبوهی از باگ‌ها
  • زیرساخت آسان برای آزمون‌های کارکردی

تاریخ انتشار: 2003-06-18

  • انتشار رفع باگ
  • حذف وابستگی به pyreverse

تاریخ انتشار: 2003-06-01

•
قابلیت‌های بسیار بیشتر!

تاریخ انتشار: 2003-05-19

•
انتشار اولیه

برای استفاده در خط فرمان، pylint به صورت زیر نصب می‌شود:

pip install pylint

یا اگر می‌خواهید املا را نیز با enchant بررسی کنید (ممکن است نیاز به نصب کتابخانه C مربوط به enchant داشته باشید https://pyenchant.github.io/pyenchant/install.html#installing-the-enchant-c-library):

pip install pylint[spelling]

این ابزار همچنین می‌تواند در اغلب ویرایشگرها یا IDEها ادغام شود. اطلاعات بیشتر را می‌توانید در مستندات بیابید https://pylint.readthedocs.io/en/latest/user_guide/installation/index.html.

ما از انواع مشارکت‌ها استقبال می‌کنیم؛ مانند به‌روزرسانی مستندات، کدهای جدید، بررسی گزارش‌های مشکل برای موارد تکراری یا اعلام به ما جهت بستن آن‌ها، تأیید پابرجا بودن مشکلات، ایجاد گزارش مشکل در صورت یافتن باگ یا درخواست یک ویژگی جدید https://pylint.readthedocs.io/en/latest/contact.html#bug-reports-feedback و غیره. از هر مشارکتی بسیار قدردانی می‌شود!

لطفاً از منشور اخلاقی https://github.com/pylint-dev/pylint/blob/main/CODE_OF_CONDUCT.md پیروی کرده و در صورتی که مایل به مشارکت در کد هستید، راهنمای مشارکت‌کنندگان https://pylint.readthedocs.io/en/latest/development_guide/contribute.html را بررسی کنید.

بخش ارتقای pylint را در راهنمای نصب ببینید <#upgrading-pylint>.

مستندات پیکربندی را ببینید <#all-configurations-options>..SS قالب فایل پیکربندی چیست؟

فایل پیکربندی می‌تواند یک فایل ini یا toml باشد. برای مشاهده فهرست کامل گزینه‌های ممکن <#all-options> را ببینید.

برای جزئیات و مثال‌ها، بخش کنترل پیام‌ها <#message-control> را بخوانید.

پیش از Pylint 2.13.0، فرمول امتیازی که به‌صورت پیش‌فرض استفاده می‌شد کران پایینی نداشت. فرمول امتیاز پیش‌فرض جدید عبارت است از:

max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10))

اگر پروژه شما شامل یک فایل پیکربندی است که توسط نسخه قدیمی‌تری از Pylint ایجاد شده است، می‌توانید evaluation را روی عبارت بالا تنظیم کنید تا رفتار جدید را به دست آورید. همچنین، از آنجا که مقادیر منفی از نظر فنی همچنان پشتیبانی می‌شوند، evaluation می‌تواند روی نسخه‌ای از عبارت بالا تنظیم شود که حداقل صفر را اعمال نمی‌کند.

پیشوند نام callback را با cb_ (مخفف callback) قرار دهید، مانند cb_onclick(...). با انجام این کار، استفاده از آرگومان‌ها بررسی نخواهد شد. راه‌حل دیگر استفاده از یکی از نام‌های تعریف‌شده در متغیر پیکربندی "dummy-variables" برای آرگومان‌های استفاده‌نشده است (به‌صورت پیش‌فرض "_" و "dummy").

یا به این دلیل که مستعد مثبت کاذب هستند، یا به این خاطر که بیش از حد سلیقه‌ای هستند و نباید جزو پیام‌های پیش‌فرض قرار گیرند.

می‌توانید افزونه‌ای را که باید صراحتاً بارگذاری کنید در مرجع فنی <#optional-checkers> مشاهده کنید.

مجموعه کامل بررسی‌های Pylint هرگز آن‌قدر سریع نخواهد بود که با هر فشردن کلید اجرا شود. با این حال، برخی از IDEها می‌توانند pylint را هنگام باز کردن یا ذخیره کردن فایل‌ها اجرا کنند. برای مثال، افزونه مایکروسافت برای VS Code https://github.com/microsoft/vscode-pylint#readme را ببینید.

با این اوصاف، pylint بهترین عملکرد را برای بررسی هنگام ذخیره در پروژه‌های کوچک، کارهای ادغام مداوم (CI)، یا قلاب pre-push در گیت برای پروژه‌های بزرگ دارد. هرچه مخزن شما بزرگ‌تر باشد، pylint کندتر خواهد بود.

اگر می‌خواهید pylint را برای این نوع کاربردها سریع‌تر کنید، می‌توانید از گزینه --errors-only استفاده کنید که تمام بررسی‌های بازسازی (refactor)، قراردادها (convention) و هشدارها را حذف می‌کند. همچنین می‌توانید بررسی‌هایی با پیچیدگی ذاتا بالا را که نیازمند تحلیل کل پایگاه کد هستند، مانند duplicate-code یا cyclic-import غیرفعال کنید (این فهرست کامل نیست).

‏pylint باید تمام کد شما را به‌یک‌باره تحلیل کند تا مقادیر واقعی حاصل از فراخوانی‌ها را به بهترین شکل استنتاج کند. اگر تنها بخشی از فایل‌ها ارائه شوند، ممکن است pylint نوع یک مقدار خاص را تشخیص ندهد و استنتاج ضعیف‌تری برای آن زیرمجموعه تولید کند. موازی‌سازی pylint ساده نیست؛ در صورتی که این موضوع برای شما اهمیت دارد، استفاده از گزینه -j را توصیه نمی‌کنیم.

‏pycodestyle https://github.com/PyCQA/pycodestyle: bad-indentation, bare-except, line-too-long, missing-final-newline, multiple-statements, singleton-comparison, trailing-newlines, trailing-whitespace, unnecessary-negation, unnecessary-semicolon, wrong-import-position

‏pyflakes https://github.com/PyCQA/pyflakes: undefined-variable, unused-import, unused-variable

‏mccabe https://github.com/PyCQA/mccabe: too-many-branches

‏pydocstyle https://github.com/PyCQA/pydocstyle: missing-module-docstring, missing-class-docstring, missing-function-docstring

‏pep8-naming https://github.com/PyCQA/pep8-naming: invalid-name, bad-classmethod-argument, bad-mcs-classmethod-argument, no-self-argument

‏isort https://github.com/pycqa/isort و flake8-import-order https://github.com/PyCQA/flake8-import-order: ungrouped-imports, wrong-import-order

باید پیام no-member را به گزینه ignored-checks-for-mixins خود اضافه کنید و نام کلاس mixin خود را با نامی که به "Mixin" یا "mixin" ختم می‌شود (پیش‌فرض) نام‌گذاری کنید، یا مقدار پیش‌فرض را با تغییر گزینه mixin-class-rgx عوض کنید.

داده‌های تحلیل به‌صورت یک فایل pickle در دایرکتوری‌ای ذخیره می‌شوند که محل آن با استفاده از قوانین زیر تعیین می‌شود:

  • مقدار متغیر محیطی PYLINTHOME در صورت تنظیم بودن
زیردایرکتوری "pylint" در XDG_CACHE_HOME کاربر در صورت تنظیم بودن این متغیر محیطی، در غیر این صورت
  • لینوکس: "~/.cache/pylint"
  • مک‌او‌اس: "~/Library/Caches/pylint"
  • ویندوز: "C:Users<username>AppDataLocalpylint"
•
دایرکتوری ".pylint.d" در دایرکتوری جاری

از نظر تاریخی، pylint dot org به‌عنوان وب‌سایت اصلی Pylint عمل می‌کرد. با این حال، ما دیگر به این دامنه دسترسی نداریم. مالکان فعلی با نمایش تبلیغات در کنار مستندات قدیمی و بدون هیچ‌گونه مشارکتی در Pylint، در حال کسب درآمد از آن هستند. برای مشاهدهٔ آخرین و رسمی‌ترین مستندات Pylint، لطفاً به pylint.readthedocs.io در https://pylint.readthedocs.io/en/stable مراجعه کنید.

لطفاً برای جزئیات بیشتر، گزارش شمارهٔ 8934 را در https://github.com/pylint-dev/pylint/issues/8934 مشاهده کنید.

فکر می‌کنید باگی در Pylint پیدا کرده‌اید؟ خوب، ممکن است همین‌طور باشد چرا که Pylint و Python به‌شدت در حال توسعه هستند!

لطفاً وقت بگذارید و بررسی کنید که آیا این مورد از قبل در ردیاب مشکلات (issue tracker) در https://github.com/pylint-dev/pylint ثبت شده است یا خیر.

توجه داشته باشید که این مشکل ممکن است در یکی از وابستگی‌های اصلی Pylint، یعنی astroid نیز گزارش شده باشد:

می‌توانید با استفاده از سرور Discord دربارهٔ مشکل خود گفتگو کنید:

https://discord.com/invite/Egy6P8AMB5

فهرست پستی code-quality با سایر ابزارهایی که هدف آن‌ها بهبود کیفیت کدهای Python است به اشتراک گذاشته شده است.

می‌توانید در این فهرست پستی در https://mail.python.org/mailman3/lists/code-quality.python.org عضو شوید.

آرشیوها در https://mail.python.org/pipermail/code-quality در دسترس هستند.

آرشیوهای پیش از آوریل ۲۰۱۳ دیگر در دسترس نیستند. در https://mail.python.org/pipermail این بخش تحت عنوان python-projects قرار داشت.

[تصویر: Tidelift] [تصویر]

پشتیبانی حرفه‌ای برای pylint به‌عنوان بخشی از اشتراک Tidelift در <https://tidelift.com/subscription/pkg/pypi-pylint?utm_source=pypi-pylint&utm_medium=referral&utm_campaign=readme> در دسترس است. Tidelift به تیم‌های توسعهٔ نرم‌افزار یک منبع واحد برای خرید و نگهداری نرم‌افزارهایشان با تضمین‌های سطح حرفه‌ای از سوی کارشناسانی که آن را به بهترین شکل می‌شناسند ارائه می‌دهد، در حالی که به‌شکلی روان و یکپارچه با ابزارهای موجود ادغام می‌شود.

Logilab و مشارکت‌کنندگان Pylint

2003-2026, Logilab و مشارکت‌کنندگان Pylint

August 10, 2026 4.0