| PYLINT(1) | Pylint | PYLINT(1) |
نام (NAME)
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
پایلینت چیست؟ (WHAT IS PYLINT?)
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) کد ارائه دهد.
نصب (INSTALL)
برای استفاده در خط فرمان، 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 که هراسی از کمی کندتر بودن نسبت به وضعیت فعلیاش ندارد، بسیار دقیقتر و جامعتر از سایر لینترها عمل میکند. بررسیهای بیشتری در آن گنجانده شده است، از جمله برخی بررسیهای سلیقهای (opinionated) که به صورت پیشفرض غیرفعال هستند اما میتوان با استفاده از پیکربندی آنها را فعال کرد.
نحوه استفاده از PYLINT (HOW TO USE PYLINT)
ابزار Pylint باهوشتر از شما نیست: ممکن است درباره مواردی به شما هشدار دهد که آگاهانه انجام دادهاید یا مواردی را بررسی کند که برایتان اهمیتی ندارند. در زمان بهکارگیری، بهویژه در یک پروژه قدیمی (legacy) که pylint هرگز در آن اعمال نشده بود، بهتر است کار را با پرچم --errors-only آغاز کنید، سپس پیامهای مربوط به قراردادها و بازسازی (refactor) را با --disable=C,R غیرفعال نمایید و به تدریج همگام با تحول اولویتهایتان، پیامها را بازبینی و مجدداً فعال کنید.
ابزار Pylint بسیار پیکربندیپذیر است و امکان نگارش پلاگینها را برای افزودن بررسیهای دلخواهتان (برای نمونه، برای کتابخانههای داخلی یا یک قاعده داخلی) فراهم میکند. Pylint همچنین دارای زیستبومی از پلاگینهای موجود برای چارچوبهای محبوب و کتابخانههای شخص ثالث است.
نکته:
لینترهای توصیهشده در کنار PYLINT (ADVISED LINTERS ALONGSIDE PYLINT)
پروژههایی که ممکن است بخواهید در کنار 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 (ADDITIONAL TOOLS INCLUDED IN PYLINT)
ابزار Pylint همراه با دو ابزار جانبی عرضه میشود:
- pyreverse https://pylint.readthedocs.io/en/latest/additional_tools/pyreverse/index.html (ابزاری مستقل که نمودارهای بسته و کلاس را تولید میکند.)
- symilar https://pylint.readthedocs.io/en/latest/additional_tools/symilar/index.html (ابزار شناسایی کدهای تکراری که درون pylint نیز ادغام شده است)
مشارکت (CONTRIBUTING)
ما از تمامی اشکال مشارکت استقبال میکنیم؛ مانند بهروزرسانی مستندات، کدهای جدید، بررسی تکراری نبودن گزارشها (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 را مطالعه نمایید.
نمایش استفاده شما (SHOW YOUR USAGE)
شما میتوانید این نشان (badge) را در فایل README خود قرار دهید تا دیگران بدانند پروژه شما از pylint استفاده میکند.
https://github.com/pylint-dev/pylint.UNINDENT
نحوه افزودن نشان به مستندات خود را در مستندات نشان https://pylint.readthedocs.io/en/latest/user_guide/installation/badge.html بیاموزید.
مجوز (LICENSE)
ابزار pylint، به استثنای چند مورد ذکر شده در زیر، تحت GPLv2 https://github.com/pylint-dev/pylint/blob/main/LICENSE منتشر میشود.
فایلهای آیکون تحت پروانه CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0 هستند:
- doc/logo.png https://raw.githubusercontent.com/pylint-dev/pylint/main/doc/logo.png
- doc/logo.svg
https://raw.githubusercontent.com/pylint-dev/pylint/main/doc/logo.svg
لطفاً اطلاعات تماس را در https://pylint.readthedocs.io/en/latest/contact.html بررسی کنید.
[تصویر: Tidelift] [تصویر] پشتیبانی حرفهای از pylint بهعنوان بخشی از اشتراک Tidelift <https://tidelift.com/subscription/pkg/pypi-pylint?utm_source=pypi-pylint&utm_medium=referral&utm_campaign=readme> در دسترس است. Tidelift به تیمهای توسعهٔ نرمافزار مرجعی یکپارچه برای خرید و نگهداری نرمافزارهایشان با تضمینهای حرفهای از سوی کارشناسانی که آن را به بهترین شکل میشناسند ارائه میدهد، در حالی که بهطور یکپارچه با ابزارهای موجود سازگار است.
آموزش (Tutorial)
این آموزش تماماً دربارهٔ مواجهه با استانداردهای کدنویسی، با دانش اندک یا بدون داشتن شناختی عمیق از برنامهنویسی یا خود استانداردهای کد است. این کار معادل نادیده گرفتن دفترچهٔ راهنما و پریدن مستقیم به میان کار است.
اعلان خط فرمان برای این مثالها بدین صورت است:
tutor Desktop$
شروع به کار (Getting Started)
اجرای 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 را میتوان به روشهای زیر نصب کرد:
- به عنوان یک ابزار خط فرمان <#installation>
- یکپارچهشده در ویرایشگر یا IDE شما <#ide-integration>
- به عنوان یک قلاب pre-commit <#pre-commit-integration>
- برای چندین مفسر python در یکپارچهسازی مداوم (CI) شما <#continuous-integration>
نصب از خط فرمان (Command line installation)
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 install pylint
sudo apt-get install pylint
یکپارچهسازی با ویرایشگر و IDE (Editor and IDE integration)
Pylint را میتوان در ویرایشگرها و IDEهای گوناگون ادغام کرد. در زیر میتوانید راهنماهایی را برای برخی از متداولترین آنها پیدا کنید.
- Eclipse https://www.pydev.org/manual_adv_pylint.html
- Emacs https://www.emacswiki.org/emacs/PythonProgrammingInEmacs
- Eric IDE https://eric-ide.python-projects.org در منوی Project > Check،
- gedit https://launchpad.net/gedit-pylint-2 (گزینهای دیگر برای gedit https://wiki.gnome.org/Apps/Gedit/PylintPlugin)
- Flymake <#pylint-in-flymake>
- Jupyter Notebook https://github.com/nbQA-dev/nbQA
- Komodo https://mateusz.loskot.net/post/2006/01/15/running-pylint-from-komodo
- Pycharm https://stackoverflow.com/a/46409649/2519059
- PyDev https://www.pydev.org/manual_adv_pylint.html
- pyscripter https://github.com/pyscripter/pyscripter در منوی Tool -> Tools.
- Spyder https://docs.spyder-ide.org/current/panes/pylint.html در منوی View -> Panes -> Static code analysis
- Sublime Text https://packagecontrol.io/packages/SublimeLinter-pylint
- TextMate <#pylint-in-textmate>
- Vim https://www.vim.org/scripts/script.php?script_id=891
- Visual Studio Code https://code.visualstudio.com/docs/python/linting در منوی Preferences -> Settings
- Visual Studio Code Pylint Extension https://marketplace.visualstudio.com/items?itemName=ms-python.pylint
- Visual Studio https://docs.microsoft.com/visualstudio/python/code-pylint در دستور Python > Run PyLint در منوی زمینهای (context menu) یک پروژه.
- WingIDE https://wingware.com/doc/warnings/external-checkers
هشدار:
یکپارچهسازی Pylint با TextMate
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 باز کرده و آن را آزمایش کنید.
باید خروجی را در یک پنجرهٔ جدید ببینید:
No config file found, using default configuration
آنگاه همه چیز روبهراه است و به احتمال زیاد Pylint نکاتی را دربارهٔ کد پایتون شما گوشزد کرده است (یا اگر کد شما از قبل با انتظارات آن مطابقت داشته باشد، با وضعیت 0 خارج خواهد شد).
اگر پیامی به این صورت دریافت کردید:
این پیام یعنی 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
- ci:
- 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 دیگر):
[](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 را مدیریت نمایید. 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 برای فراخوانی از خط فرمان طراحی شده است. نحوهٔ استفاده بدین صورت است:
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 قرار داشته باشد.
با بستههای فضاینام ضمنی (With implicit namespace packages)
اگر سورسهای تحلیلشده از بستههای فضاینام ضمنی (PEP 420) استفاده میکنند، ریشه(های) سورس باید با استفاده از گزینهٔ --source-roots مشخص شوند. در غیر این صورت، نام بستهها به اشتباه تشخیص داده میشود، زیرا بستههای فضاینام ضمنی فاقد فایل __init__.py هستند.
پشتیبانی از تطبیق الگو (Globbing support)
همچنین امکان مشخص کردن دایرکتوریها و فایلها با استفاده از الگوهای تطبیق (globbing patterns) وجود دارد:
pylint [options] packages/*/src
گزینههای خط فرمان (Command line options)
پیش از هر چیز، دو گزینهٔ پایه (اما کاربردی) وجود دارد.
- --version
- نمایش شمارهٔ نسخهٔ برنامه و خروج
- -h, --help
- نمایش راهنما دربارهٔ گزینههای خط فرمان
ابزار 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 آمدهاند
البته شما همچنین میتوانید با مقادیر پیشفرض شروع کرده و پیکربندی را بهصورت دستی تنظیم کنید.
سایر گزینههای سراسری کاربردی عبارتند از:
- --ignore=<file[,file...]>
- فایلها یا دایرکتوریهایی که باید نادیده گرفته شوند. آنها باید نام پایه (base name) باشند، نه مسیر کامل.
- --output-format=<format>
- انتخاب قالب خروجی (text، json، custom).
- --msg-template=<template>
- تغییر الگوی پیام خروجی متنی.
- --list-msgs
- تولید پیامهای pylint.
- --list-msgs-enabled
- نمایش فهرستی از پیامهایی که با پیکربندی دادهشده فعال و غیرفعال هستند.
- --full-documentation
- تولید
مستندات
کامل 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 نوع یک مقدار خاص را نادیده بگیرد و استنتاج ضعیفتری برای آن زیرمجموعه ارائه دهد. همچنین ممکن است با تغییر مجموعهٔ فایلها، نتایج بهطور غیرمنتظرهای متفاوت باشد؛ زیرا تقسیمبندی جدید میتواند استنتاج را تغییر دهد. بنابراین، اگر صحت و قطعی بودن نتایج برای شما مهم است، این کار را انجام ندهید.
کدهای خروج (Exit codes)
برنامهٔ 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 این را تغییر دهید. مقادیر ممکن عبارتند از:
- text
- parseable
- colorized
- json2: قالب بهبودیافتهٔ json
- json: قالب قدیمی json
- msvs: برای visual studio
- github: پیامهای GitHub action https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/workflow-commands-for-github-actions
با ارسال فهرستی از قالبها که با کاما از هم جدا شدهاند به --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 بهره میبرد و فیلدهای زیر در دسترس هستند:
- path
- مسیر نسبی فایل
- abspath
- مسیر مطلق فایل
- line
- شمارهٔ خط
- column
- شمارهٔ ستون
- end_line
- شمارهٔ خط پایان گره (node)
- end_column
- شمارهٔ ستون پایان گره (node)
- module
- نام ماژول
- obj
- شیء درون ماژول (در صورت وجود)
- msg
- متن پیام
- msg_id
- کد پیام (مثلاً I0011)
- symbol
- نام نمادین پیام (مثلاً locally-disabled)
- C
- نشانهٔ تکحرفی دستهبندی پیام
- category
- نام کامل دستهبندی پیام
برای نمونه، قالب پیشفرض پیشین (قبل از 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)
بخش گزارشها (Reports section)
بهدنبال پیامهای تحلیل، Pylint میتواند مجموعهای از گزارشها را نمایش دهد که هر کدام بر جنبهٔ خاصی از پروژه تمرکز دارند؛ مانند تعداد پیامها بر پایهٔ دستهبندی، وابستگیهای ماژولها. این ویژگیها را میتوان از طریق گزینهٔ --reports=y یا نگارش کوتاه آن -ry فعال کرد.
بهعنوان مثال، گزارش معیارها خلاصههای جمعآوریشده از اجرای فعلی را نمایش میدهد:
- تعداد ماژولهای پردازششده
- برای هر ماژول، درصد خطاها و هشدارها
- تعداد کل خطاها و هشدارها
- درصد کلاسها، توابع و ماژولهای دارای docstring، همراه با مقایسه نسبت به اجرای پیشین
- درصد کلاسها، توابع و ماژولها با نامگذاری صحیح (مطابق با استاندارد کدنویسی)، همراه با مقایسه نسبت به اجرای پیشین
- فهرستی از وابستگیهای خارجی یافتشده در کد و محل قرارگیری آنها
در نهایت، Pylint یک امتیاز ارزیابی کلی برای کد نمایش میدهد که از حداکثر امتیاز ۱۰.۰ محاسبه میشود. این خروجی را میتوان از طریق گزینهٔ --score=n یا فرم خلاصهٔ آن، -sn، غیرفعال کرد.
فرمول ارزیابی را میتوان با گزینهٔ --evaluation=<python_expression> بازنویسی کرد.
پیامها (Messages)
نمای کلی پیامها (Messages overview)
Pylint میتواند پیامهای زیر را صادر کند:
مهلک (Fatal)
تمام پیامها در دستهبندی مهلک (fatal):
astroid-error / F0002
پیام صادرشده:
%s: %s
توضیحات:
هنگامی استفاده میشود که خطایی غیرمنتظره حین ساخت نمایش Astroid رخ داده باشد. این حالت معمولاً با یک traceback همراه است. لطفاً چنین خطاهایی را گزارش دهید!
جزئیات تکمیلی:
این پیام مربوط به یک مشکل داخلی در pylint است. نیازی به تغییر در کد شما نیست، اما شاید نیاز به تغییر در پیکربندی یا نحوهٔ نصب pylint باشد.
ایجادشده توسط بررسیکنندهٔ اصلی https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py.
config-parse-error / F0011
پیام صادرشده:
error while parsing the configuration: %s
توضیحات:
هنگامی استفاده میشود که حین تجزیهٔ یک فایل پیکربندی pylint، استثنایی رخ داده باشد.
جزئیات تکمیلی:
این پیام مربوط به مشکلی در پیکربندی شماست، نه کد شما.
ایجادشده توسط بررسیکنندهٔ اصلی https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py.
fatal / F0001
پیام صادرشده:
%s
توضیحات:
هنگامی استفاده میشود که خطایی مانع از تحلیل یک ماژول شده باشد (برای نمونه، عدم توانایی در یافتن آن).
جزئیات تکمیلی:
این پیام مربوط به یک مشکل داخلی در pylint است. نیازی به هیچ تغییری در کد شما نیست.
ایجادشده توسط بررسیکنندهٔ اصلی https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/lint/pylinter.py.
method-check-failed / F0202
پیام صادرشده:
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.
parse-error / F0010
پیام صادرشده:
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' تغییر نام داده است. پیام جدید را میتوانید در این بخش بیابید:
import-error / E0401
پیام صادرشده:
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.
خطا (Error)
تمام پیامهای موجود در دستهبندی خطا:
abstract-class-instantiated / E0110
پیام صادرشده:
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.
assigning-non-slot / E0237
پیام صادرشده:
انتساب به ویژگی %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.
assignment-from-none / E1128
پیام صادرشده:
انتساب نتیجه فراخوانی یک تابع، در حالی که تابع 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")
پیوندهای مرتبط:
- PEP 492 - کوروتینها با نحو async و await https://peps.python.org/pep-0492
- contextlib.asynccontextmanager https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager
ایجادشده توسط بررسیکننده typecheck https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/typecheck.py.
await-outside-async / E1142
پیام صادرشده:
عبارت '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.
bad-except-order / E0701
پیام صادرشده:
ترتیب نادرست بندهای 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.
bad-exception-cause / E0705
پیام صادرشده:
علت استثنا روی چیزی تنظیم شده است که نه استثنا است و نه 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
پیوندهای مرتبط:
- دستور raise https://docs.python.org/3/reference/simple_stmts.html#the-raise-statement
- زنجیرهسازی صریح استثناها https://peps.python.org/pep-3134/#explicit-exception-chaining بر اساس PEP 3134
ایجادشده توسط بررسیکنندهٔ 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 را ببینید.
پیوندهای مرتبط:
- قواعد نحوی رشتههای قالب https://docs.python.org/3/library/string.html#formatstrings
- وبگاه PyFormat https://pyformat.info
ایجادشده توسط بررسیکنندهٔ string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py.
bad-plugin-value / E0013
پیام صادرشده:
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.
bad-str-strip-call / E1310
پیام صادر شده:
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، گذشته از اینکه هیچ تأثیری بر نتیجه نهایی ندارد، ممکن است نشاندهنده این برداشت نادرست باشد.
پیوندهای مرتبط:
- •
- مستندات: str.strip([chars]) https://docs.python.org/3/library/stdtypes.html?highlight=strip#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 ببینید.
پیوندهای مرتبط:
- سینتکس رشتهٔ قالببندی https://docs.python.org/3/library/string.html#formatstrings
- PyFormat https://pyformat.info
ایجاد شده توسط بررسیکنندهٔ string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py.
bad-super-call / E1003
پیام صادرشده:
آرگومان نخست نامعتبر %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() استفاده شود.
پیوندهای مرتبط:
- •
- مستندات super() https://docs.python.org/3/library/functions.html#super
ایجاد شده توسط بررسیکنندهٔ 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 / E2502
پیام صادرشده:
حاوی نویسههای کنترلی است که میتوانند اجازه دهند کد مبهم، متفاوت از آنچه نمایش داده میشود اجرا گردد
توضیحات:
یونیکدهای دوجهته (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
پیوندهای مرتبط:
- •
- bpo-42965 https://bugs.python.org/issue42965
نکته:
ایجاد شده توسط بررسیکننده typing https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/typing.py.
broken-noreturn / E6004
پیام صادرشده:
'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 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.
class-variable-slots-conflict / E0242
پیام صادرشده:
مقدار %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.
dict-iter-missing-items / E1141
پیام صادرشده:
بازگشایی یک دیکشنری در پیمایش بدون فراخوانی .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.
duplicate-argument-name / E0108
پیام صادرشده:
نام آرگومان تکراری %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.
format-needs-mapping / E1303
پیام صادرشده:
برای رشته قالببندی نگاشت انتظار میرفت، نه %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-mro / E0240
پیام صادرشده:
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-is-generator / E0100
پیام صادرشده:
متد __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.
invalid-all-object / E0604
پیام صادرشده:
شیء نامعتبر %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.
invalid-bytes-returned / E0308
پیام صادرشده:
__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.
invalid-character-carriage-return / E2511
پیام صادرشده:
نویسهٔ 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.
invalid-character-esc / E2513
پیام صادرشده:
نویسهٔ 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.
invalid-character-sub / E2512
پیام صادرشده:
نویسهٔ 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.
invalid-character-zero-width-space / E2515
پیام صادرشده:
نویسهٔ 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.
invalid-enum-extension / E0244
پیام صادرشده:
گسترش کلاس ارثبریشدهی 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.
invalid-field-call / E3701
پیام صادرشده:
استفاده نامعتبر از 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.
invalid-getnewargs-ex-returned / E0313
پیام صادرشده:
__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.
invalid-hash-returned / E0309
پیام صادرشده:
__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.
invalid-length-hint-returned / E0310
پیام صادرشده:
__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.
invalid-match-args-definition / E1902
پیام صادرشده:
`__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.
invalid-repr-returned / E0306
پیام صادرشده:
__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.
invalid-slice-index / E1127
پیام صادرشده:
نمایهٔ برش یک 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.
invalid-slice-step / E1144
پیام صادرشده:
گام برش نمیتواند 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-slots-object / E0236
پیام صادرشده:
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.
invalid-star-assignment-target / E0113
پیام صادرشده:
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.
invalid-unary-operand-type / E1130
پیام صادرشده:
%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.
invalid-unicode-codec / E2501
پیام صادرشده:
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.
logging-too-few-args / E1206
پیام صادرشده:
آرگومانهای ناکافی برای رشته قالببندی لاگگیری
توضیحات:
زمانی استفاده میشود که به رشته قالببندی لاگگیری، آرگومانهای بسیار کمی اختصاص داده شود.
کد مشکلدار:
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.
logging-unsupported-format / E1200
پیام صادرشده:
نویسه قالببندی لاگگیری پشتیبانینشده %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.
misplaced-bare-raise / E0704
پیام صادرشده:
دستور 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.
missing-format-string-key / E1304
پیام صادرشده:
کلید %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.
missing-kwoa / E1125
پیام صادرشده:
آرگومان کلیدواژهای اجباری %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.
modified-iterating-dict / E4702
پیام صادرشده:
دیکشنری در حال پیمایش '%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.
multiple-class-sub-patterns / E1904
پیام صادرشده:
چندین زیرالگو برای صفت %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-in-module / E0611
پیام صادرشده:
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.
no-self-argument / E0213
پیام صادرشده:
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.
non-iterator-returned / E0301
پیام صادرشده:
__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.
nonlocal-and-global / E0115
پیام صادرشده:
نام %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.
not-a-mapping / E1134
پیام صادرشده:
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.
not-async-context-manager / E1701
پیام صادرشده:
مدیر زمینه ناهمگام '%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.
not-context-manager / E1129
پیام صادرشده:
مدیر زمینه '%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-raised / E0711
پیام صادرشده:
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.
positional-only-arguments-expected / E3102
پیام صادرشده:
`%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)
پیوندهای مرتبط:
- •
- PEP 570 https://peps.python.org/pep-570
ایجادشده توسط بررسیکننده 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.
raising-bad-type / E0702
پیام صادرشده:
پرتاب %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.
redundant-keyword-arg / E1124
پیام صادرشده:
آرگومان %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ها به شما اجازه میدهند در صورت صریح/مطلق بودن واردسازیها، در هر صورت این کار را تقریباً بدون هیچ هزینهای انجام دهید. بنابراین، همچنان واردسازیهای مطلق اغلب نسبت به موارد نسبی ترجیح داده میشوند.
پیوندهای مرتبط:
- واردسازی مطلق در برابر واردسازی نسبی صریح ماژول پایتون https://stackoverflow.com/a/16748366/2519059
- حذف توصیه علیه واردسازیهای نسبی از مستندات https://bugs.python.org/msg118031
ایجادشده توسط بررسیکنندهٔ imports https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/imports.py.
repeated-keyword / E1132
پیام صادرشده:
دریافت چندین مقدار برای آرگومان کلیدواژهای %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
پیوندهای مرتبط:
- PEP380 https://peps.python.org/pep-0380
- توضیحات Stackoverflow https://stackoverflow.com/a/16780113/2519059
ایجادشده توسط بررسیکنندهٔ basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py.
return-in-init / E0101
پیام صادرشده:
دستور 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
پیوندهای مرتبط:
- •
- مستندات متد __init__ https://docs.python.org/3/reference/datamodel.html#object.__init__
ایجادشده توسط بررسیکنندهٔ 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-method / E1519
پیام صادرشده:
دکوراتور 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.
star-needs-assignment-target / E0114
پیام صادرشده:
عبارت ستارهدار فقط میتواند در مقصد انتساب استفاده شود
توضیحات:
هنگامی صادر میشود که یک عبارت ستارهدار در مقصد انتساب استفاده نشده باشد.
کد مشکلدار:
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.
too-few-format-args / E1306
پیام صادرشده:
آرگومانهای کافی برای رشتهٔ قالببندی وجود ندارد (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"))
پیوندهای مرتبط:
- •
- قالببندی رشته https://docs.python.org/3/library/string.html#formatstrings
ایجاد شده توسط بازبین 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"))
پیوندهای مرتبط:
- •
- قالببندی رشته https://docs.python.org/3/library/string.html#formatstrings
ایجاد شده توسط بررسیکننده string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py.
too-many-function-args / E1121
پیام صادرشده:
آرگومانهای مکانی بیش از حد برای فراخوانی %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.
too-many-star-expressions / E0112
پیام صادرشده:
بیش از یک عبارت ستارهدار در انتساب
توضیحات:
هنگامی صادر میشود که بیش از یک عبارت ستارهدار (`*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.
undefined-all-variable / E0603
پیام صادرشده:
نام متغیر تعریفنشده %r در __all__
توضیحات:
زمانی استفاده میشود که در __all__ به یک نام متغیر تعریفنشده ارجاع داده شود.
کد دارای مشکل:
__all__ = ["get_fruit_colour"] # [undefined-all-variable]
def get_fruit_color():
pass
کد درست:
__all__ = ["get_fruit_color"]
def get_fruit_color():
pass
پیوندهای مرتبط:
- •
- وارد کردن * از یک بسته https://docs.python.org/3/tutorial/modules.html#importing-from-a-package
ایجادشده توسط بررسیکننده 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.
unexpected-keyword-arg / E1123
پیام صادرشده:
آرگومان کلیدواژهای غیرمنتظره %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.
unexpected-special-method-signature / E0302
پیام صادرشده:
متد ویژه %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.
unpacking-non-sequence / E0633
پیام صادرشده:
تلاش برای بازگشایی یک غیردنباله%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.
unrecognized-inline-option / E0011
پیام صادرشده:
گزینه فایل ناشناخته %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.
unsubscriptable-object / E1136
پیام صادرشده:
مقدار '%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.
unsupported-binary-operation / E1131
پیام صادرشده:
%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.
unsupported-membership-test / E1135
پیام صادرشده:
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.
used-prior-global-declaration / E0118
پیام صادرشده:
نام %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-inside-async-function / E1700
پیام صادرشده:
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 نمیتواند صادر شود.
پیوندهای مرتبط:
- •
- PEP 525 https://peps.python.org/pep-0525
ایجاد شده توسط بررسیکننده 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 / E0235
پیام 'bad-context-manager' تغییر نام یافته است. پیام جدید را میتوان در این نشانی یافت:
bad-exception-context / E0703
پیام 'bad-exception-context' تغییر نام یافته است. پیام جدید را میتوان در این نشانی یافت:
bad-option-value / E0012
پیام 'bad-option-value' تغییر نام یافته است. پیام جدید را میتوان در این نشانی یافت:
useless-option-value / R0022
پیام صادرشده:
مقدار گزینهٔ بیاستفاده برای '%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 / E1103
نام 'maybe-no-member' تغییر یافته است. پیام جدید را میتوان در اینجا یافت:
old-non-iterator-returned-2 / E0234
نام 'old-non-iterator-returned-2' تغییر یافته است. پیام جدید را میتوان در اینجا یافت:
old-unbalanced-tuple-unpacking / E0632
نام 'old-unbalanced-tuple-unpacking' تغییر یافته است. پیام جدید را میتوان در اینجا یافت:
unbalanced-tuple-unpacking / W0632
پیام صادرشده:
احتمال بازگشایی ناتراز تاپل با دنبالهٔ %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' تغییر نام یافته است. پیام جدید را میتوان در اینجا یافت:
هشدار (Warning)
تمام پیامها در دستهبندی هشدار:
abstract-method / W0223
پیام صادرشده:
متد %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 صادر میکند. امیدواریم در آینده این ناهمخوانی را در مستندات برطرف کنیم.
پیوندهای مرتبط:
- لیترالهای رشته و بایت https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals
- توضیح مفصل در Stack Overflow https://stackoverflow.com/a/19030982/2519059
ایجاد شده توسط بررسیکنندهٔ string https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/strings.py.
anomalous-unicode-escape-in-string / W1402
پیام صادرشده:
توالی گریز یونیکد غیرعادی در رشتهٔ بایتی: '%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.
arguments-renamed / W0237
پیام صادرشده:
%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> وجود دارد.
پیوندهای مرتبط:
- آزمونهای بدون assertion https://stackoverflow.com/a/137418/2519059
- آزمودن اینکه هیچ خطایی ایجاد نمیشود https://stackoverflow.com/questions/20274987
- پارامتریکسازی raiseهای شرطی https://docs.pytest.org/en/latest/example/parametrize.html#parametrizing-conditional-raising
ایجادشده توسط بررسیکنندهی basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py.
assert-on-tuple / W0199
پیام صادرشده:
دستور 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.
bad-builtin / W0141
پیام صادرشده:
از تابع توکار %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 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 https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/dunder.py.
bad-format-string / W1302
پیام صادرشده:
رشتهٔ قالببندی نامعتبر
توضیحات:
زمانی استفاده میشود که یک رشتهٔ قالببندی PEP 3101 نامعتبر باشد.
کد دارای مشکل:
print("{a[0] + a[1]}".format(a=[0, 1])) # [bad-format-string]
کد صحیح:
print("{a[0]} + {a[1]}".format(a=[0, 1]))
پیوندهای مرتبط:
- نحو رشتهٔ قالببندی (Format String Syntax) https://docs.python.org/3/library/string.html#formatstrings
- PyFormat https://pyformat.info
ایجاد شده توسط بررسیکنندهٔ 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.
bad-indentation / W0311
پیام صادرشده:
دندانهگذاری نادرست. %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.
bad-staticmethod-argument / W0211
پیام صادرشده:
متد ایستا با %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.
bad-thread-instantiation / W1506
پیام صادرشده:
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 میتواند روش بهتری برای مدیریت این حالت باشد.
پیوندهای مرتبط:
- توصیه برنامهنویسی در PEP8 https://peps.python.org/pep-0008/#programming-recommendations
- PEP 760 – No More Bare Excepts (ردشده) https://peps.python.org/pep-0760
- بحث درباره PEP 760 https://discuss.python.org/t/pep-760-no-more-bare-excepts/67182
ایجادشده توسط بررسیکننده exceptions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/exceptions.py.
binary-op-exception / W0711
پیام صادرشده:
استثنای موردنظر برای گرفتن، نتیجه یک عملیات باینری "%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-in-finally / W0137
پیام صادرشده:
استفاده از '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
پیوندهای مرتبط:
- مستندات Python 3، بند 'finally' https://docs.python.org/3/reference/compound_stmts.html#finally-clause
- PEP 765 - منع return/break/continue که از بلوک finally خارج میشوند https://peps.python.org/pep-0765
ایجاد شده توسط بررسیکننده 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.
broad-exception-raised / W0719
پیام صادرشده:
پرتاب استثنای بیش از حد عمومی: %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!"
پیوندهای مرتبط:
- •
- بحث در Stackoverflow https://stackoverflow.com/questions/25314547/cell-var-from-loop-warning-from-pylint
ایجادشده توسط بررسیکنندهٔ 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.
confusing-with-statement / W0124
پیام صادرشده:
آمدن یک مدیر زمینه (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 https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/consider_ternary_expression.py.
contextmanager-generator-missing-cleanup / W0135
پیام صادرشده:
از زمینهٔ استفادهشده در تابع %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
- دلایل توجیهی (Rationale) https://discuss.python.org/t/preventing-yield-inside-certain-context-managers/1091
- گزارش اشکال CPython https://github.com/python/cpython/issues/81924#issuecomment-1093830682
ایجاد شده توسط بررسیکننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/function_checker.py.
continue-in-finally / W0136
پیام صادرشده:
استفاده از '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
پیوندهای مرتبط:
- مستندات بند 'finally' در Python 3 https://docs.python.org/3/reference/compound_stmts.html#finally-clause
- PEP 765 - غیرمجاز کردن return/break/continue که از بلوک finally خارج میشوند https://peps.python.org/pep-0765
ایجاد شده توسط بررسیکننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_error_checker.py.
dangerous-default-value / W0102
پیام صادرشده:
مقدار پیشفرض خطرناک %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.
deprecated-attribute / W4906
پیام صادرشده:
استفاده از صفت منسوخشده %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.
deprecated-decorator / W4905
پیام صادرشده:
استفاده از دکوراتور منسوخشدهٔ %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.
deprecated-module / W4901
پیام صادرشده:
ماژول منسوخشده %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 https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/typing.py.
differing-param-doc / W9017
پیام صادرشده:
مغایرت "%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 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 https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py.
duplicate-except / W0705
پیام صادرشده:
گرفتن نوع استثنای %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}
پیوندهای مرتبط:
- دیکشنریهای پایتون https://docs.python.org/3/tutorial/datastructures.html#dictionaries
- انواع نگاشت — dict https://docs.python.org/3/library/stdtypes.html#typesmapping
ایجادشده توسط بررسیکننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py.
duplicate-string-formatting-argument / W1308
پیام صادرشده:
آرگومان تکراری قالببندی رشته %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-without-hash / W1641
پیام صادرشده:
پیادهسازی __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 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.
exec-used / W0122
پیام صادرشده:
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!")')
- و غیره.
پیوندهای مرتبط:
- مراقب exec و eval در پایتون باشید https://lucumr.pocoo.org/2011/2/1/exec-in-python
- مستندات پایتون https://docs.python.org/3/library/functions.html#exec
ایجادشده توسط بررسیکننده 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-without-interpolation / W1309
پیام صادرشده:
استفاده از یک 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.
fixme / W0511
پیام صادرشده:
%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.
format-combined-specification / W1305
پیام صادرشده:
رشته قالببندی شامل هر دو حالت شمارهگذاری خودکار فیلدها و تعیین دستی فیلد است
توضیحات:
هنگامی استفاده میشود که یک رشته قالببندی بر اساس 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-at-module-level / W0604
پیام صادرشده:
استفاده از دستور global در سطح ماژول
توضیحات:
هنگامی استفاده میشود که از دستور "global" در سطح ماژول استفاده کنید، زیرا این کار هیچ تأثیری ندارد.
کد دارای ایراد:
price = 25 global price # [global-at-module-level]
کد صحیح:
price = 25
پیوندهای مرتبط:
- پرسشهای متداول رسمی Python - متغیرهای global و local https://docs.python.org/3/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python
- PEP 3104 - دسترسی به نامها در حوزههای بیرونی https://peps.python.org/pep-3104
- دستور global در Python https://docs.python.org/3/reference/simple_stmts.html#global
ایجادشده توسط بررسیکننده variables https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/variables.py.
global-statement / W0603
پیام صادرشده:
استفاده از دستور 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.
global-variable-undefined / W0601
پیام صادرشده:
متغیر سراسری %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.
implicit-str-concat / W1404
پیام صادرشده:
الحاق ضمنی رشته در %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.
inconsistent-quotes / W1405
پیام صادرشده:
جداکننده نقلقول %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.
invalid-format-index / W1307
پیام صادرشده:
استفاده از کلید جستجوی نامعتبر %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.
invalid-overridden-method / W0236
پیام صادرشده:
انتظار میرفت متد %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.
keyword-arg-before-vararg / W1113
پیام صادرشده:
آرگومان کلیدواژهای پیش از فهرست آرگومانهای مکانی متغیر در تعریف تابع %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.
kwarg-superseded-by-positional-arg / W1117
پیام صادرشده:
مقدار %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://docs.python.org/3/howto/logging.html#logging-variable-data
- دلیل منطقی برای این پیام در Stack Overflow https://stackoverflow.com/a/34634301/2519059
ایجادشده توسط بررسیکنندهٔ logging https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/logging.py.
logging-fstring-interpolation / W1203
پیام صادرشده:
از قالببندی %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://docs.python.org/3/howto/logging.html#logging-variable-data
- دلیل منطقی https://stackoverflow.com/questions/34619790
ایجادشده توسط بررسیکنندهٔ 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 را غیرفعال کنید.
پیوندهای مرتبط:
- ثبت دادههای متغیر https://docs.python.org/3/howto/logging.html#logging-variable-data
- دلیل وجود این پیام در stackoverflow https://stackoverflow.com/a/34634301/2519059
ایجادشده توسط بررسیکنندهٔ logging https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/logging.py.
lost-exception / W0150
پیام صادرشده:
دستور %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.
misplaced-future / W0410
پیام صادرشده:
واردسازی __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 https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py.
missing-format-argument-key / W1303
پیام صادرشده:
نبود آرگومان کلیدواژهای %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"))
پیوندهای مرتبط:
- PEP 3101 https://peps.python.org/pep-3101
- قالببندی سفارشی رشته https://docs.python.org/3/library/string.html#custom-string-formatting
ایجادشده توسط بررسیکننده 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.
missing-param-doc / W9015
پیام صادرشده:
"%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 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.
missing-raises-doc / W9006
پیام صادرشده:
"%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 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 https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py.
missing-return-type-doc / W9012
پیام صادرشده:
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 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.
missing-type-doc / W9016
پیام صادرشده:
"%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 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 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 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.
multiple-constructor-doc / W9005
پیام صادرشده:
"%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 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.
nan-comparison / W0177
پیام صادرشده:
مقایسه %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.
nested-min-max / W3301
پیام صادرشده:
از فراخوانی تو در توی '%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:
پیوندهای مرتبط:
- PEP 489 https://peps.python.org/pep-0489/#export-hook-name
- PEP 672 https://peps.python.org/pep-0672/#confusing-features
- گزارش مشکل ۲۰۴۸۵ در Python https://bugs.python.org/issue20485
ایجادشده توسط بررسیکنندهٔ nonascii-checker https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/non_ascii_names.py.
non-parent-init-called / W0233
پیام صادرشده:
متد __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.
overlapping-except / W0714
پیام صادرشده:
استثناهای دارای همپوشانی (%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 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 صادر نمیشود.
پیوندهای مرتبط:
- •
- PEP 591 https://peps.python.org/pep-0591
ایجاد شده توسط بررسیکنندهٔ classes https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/classes/class_checker.py.
pointless-exception-statement / W0133
پیام صادرشده:
دستور استثنا هیچ اثری ندارد
توضیحات:
زمانی استفاده میشود که یک استثنا ایجاد شده باشد بدون آنکه انتساب یابد، صادر (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.
pointless-string-statement / W0105
پیام صادرشده:
دستور رشتهای هیچ تأثیری ندارد
توضیحات:
زمانی استفاده میشود که یک رشته بهعنوان یک دستور استفاده شود (که البته هیچ تأثیری ندارد). این یک حالت خاص از 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.
possibly-unused-variable / W0641
پیام صادرشده:
احتمالاً متغیر %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.
protected-access / W0212
پیام صادرشده:
دسترسی به عضو محافظتشده %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
پیوندهای مرتبط:
- •
- PEP 3134 https://peps.python.org/pep-3134
ایجادشده توسط بررسیکننده exceptions https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/exceptions.py.
raising-format-tuple / W0715
پیام صادرشده:
آرگومانهای استثنا نشان میدهند که احتمالاً قالببندی رشته مد نظر بوده است
توضیحات:
هنگامی استفاده میشود که چندین آرگومان به سازندهٔ یک استثنا ارسال شود و اولین آرگومان، یک لیترال رشتهای حاوی مواردی باشد که به نظر میرسد جاینگهدارهایی برای قالببندی باشند
کد دارای اشکال:
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.
redeclared-assigned-name / W0128
پیام صادرشده:
اعلان مجدد متغیر %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.
redefined-loop-name / W2901
پیام صادرشده:
بازتعریف %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 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.
redefined-slots-in-subclass / W0244
پیام صادرشده:
بازتعریف اسلاتهای %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 https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py.
redundant-u-string-prefix / W1406
پیام صادرشده:
پیشوند 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>.
پیوندهای مرتبط:
- آزمونهای بدون اعتبارسنجی https://stackoverflow.com/a/137418/2519059
- آزمودن اینکه هیچ خطایی رخ نمیدهد https://stackoverflow.com/questions/20274987
- پارامتریسازی برانگیختن شرطی خطا https://docs.pytest.org/en/latest/example/parametrize.html#parametrizing-conditional-raising
ایجادشده توسط بررسیکنندهٔ stdlib https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/stdlib.py.
redundant-yields-doc / W9010
پیام صادرشده:
مستندسازی زائد 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 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-in-finally / W0134
پیام صادرشده:
'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]
پیوندهای مرتبط:
- مستندات Python 3، بند 'finally' https://docs.python.org/3/reference/compound_stmts.html#finally-clause
- PEP 765 - Disallow return/break/continue that exit a finally block https://peps.python.org/pep-0765
ایجادشده توسط بررسیکنندهٔ 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
پیوندهای مرتبط:
- •
- دستور انتساب در پایتون https://docs.python.org/3/reference/simple_stmts.html#assignment-statements
ایجادشده توسط بررسیکننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/basic_checker.py.
self-cls-assignment / W0642
پیام صادرشده:
انتساب نامعتبر به %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.
shallow-copy-environ / W1507
پیام صادرشده:
استفاده از 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.
signature-differs / W0222
پیام صادرشده:
امضا با متد %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 / W1510
پیام صادرشده:
استفاده از 'subprocess.run' بدون تعیین صریح مقدار برای 'check'.
توضیحات:
کلیدواژه ``check`` بهطور پیشفرض روی False تنظیم شده است. این بدان معناست که فرآیند راهاندازیشده توسط ``subprocess.run`` میتواند با یک کد خروج غیرصفر خارج شده و بدون هشدار شکست بخورد. بهتر است آن را بهطور صریح مقداردهی کنید تا رفتار مدیریت خطا کاملاً مشخص باشد.
کد دارای مشکل:
import subprocess proc = subprocess.run(["ls"]) # [subprocess-run-check]
کد درست:
import subprocess proc = subprocess.run(["ls"], check=False)
پیوندهای مرتبط:
- •
- مستندات subprocess.run https://docs.python.org/3/library/subprocess.html#subprocess.run
ایجاد شده توسط بررسیکننده 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-without-brackets / W0245
پیام صادرشده:
فراخوانی 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 https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/broad_try_clause.py.
try-except-raise / W0706
پیام صادرشده:
گرداننده 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.
undefined-loop-variable / W0631
پیام صادرشده:
استفاده از متغیر حلقه احتمالاً تعریفنشده %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.
unnecessary-lambda / W0108
پیام صادرشده:
ممکن است 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.
unnecessary-semicolon / W0301
پیام صادرشده:
نقطهویرگول غیرضروری
توضیحات:
زمانی استفاده میشود که انتهای یک عبارت با نقطهویرگول (";") خاتمه یابد، در حالی که نیازی به آن نیست (اینجا پایتون است، نه C ;).
کد دارای مشکل:
print("Hello World!"); # [unnecessary-semicolon]
کد درست:
print("Hello World!")
ایجادشده توسط بررسیکننده format https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/format.py.
unreachable / W0101
پیام صادرشده:
کد غیرقابلدسترس
توضیحات:
زمانی استفاده میشود که کدی پس از یک دستور "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.
unused-argument / W0613
پیام صادرشده:
آرگومان استفادهنشده %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.
unused-format-string-argument / W1304
پیام صادرشده:
آرگومان قالببندی استفادهنشده %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.
unused-import / W0611
پیام صادرشده:
%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.
unused-variable / W0612
پیام صادرشده:
متغیر استفادهنشده %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.
useless-else-on-loop / W0120
پیام صادرشده:
بند 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 https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py.
useless-parent-delegation / W0246
پیام صادرشده:
تفویض بیاستفاده به والد یا ()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 https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docparams.py.
useless-with-lock / W2101
پیام صادرشده:
'%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-constant-test / W0125
پیام صادرشده:
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.
using-f-string-in-unsupported-version / W2601
پیام صادرشده:
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.
using-generic-type-syntax-in-unsupported-version / W2604
پیام صادرشده:
نحو نوع جنریک (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-used / W0149
پیام صادرشده:
حلقه `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
پیوندهای مرتبط:
- •
- گفتگوی Stackoverflow https://stackoverflow.com/questions/920645/when-to-use-while-or-for-in-python
نکته:
ایجادشده توسط بررسیکننده 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.
wrong-exception-operation / W0716
پیام صادرشده:
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 / W0703
'broad-except' تغییرنام یافته است. پیام جدید را میتوان در این نشانی یافت:.SS cache-max-size-none / W1517
نام 'cache-max-size-none' تغییر یافته است. پیام جدید را میتوانید در اینجا بیابید:
implicit-str-concat-in-sequence / W1403
نام 'implicit-str-concat-in-sequence' تغییر یافته است. پیام جدید را میتوانید در اینجا بیابید:
lru-cache-decorating-method / W1516
نام 'lru-cache-decorating-method' تغییر یافته است. پیام جدید را میتوانید در اینجا بیابید:
old-assignment-from-none / W1111
نام 'old-assignment-from-none' تغییر یافته است. پیام جدید را میتوانید در اینجا بیابید:
old-deprecated-argument / W1511
نام 'old-deprecated-argument' تغییر یافته است. پیام جدید را میتوانید در اینجا بیابید:
old-deprecated-class / W1512
نام 'old-deprecated-class' تغییر یافته است. پیام جدید را میتوانید در اینجا بیابید:
old-deprecated-decorator / W1513
نام 'old-deprecated-decorator' تغییر یافته است. پیام جدید را میتوانید در اینجا بیابید:
old-deprecated-method / W1505
نام 'old-deprecated-method' تغییر یافته است. پیام جدید را میتوانید در اینجا بیابید:
old-deprecated-module / W0402
نام 'old-deprecated-module' تغییر یافته است. پیام جدید را میتوانید در اینجا بیابید:
old-empty-docstring / W0132
نام 'old-empty-docstring' تغییر یافته است. پیام جدید را میتوانید در اینجا بیابید:
empty-docstring / C0112
پیام صادرشده:
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 / W9003
نام 'old-missing-param-doc' تغییر یافته است. پیام جدید را میتوانید در اینجا بیابید:
old-missing-returns-doc / W9007
نام 'old-missing-returns-doc' تغییر یافته است. پیام جدید را میتوانید در اینجا بیابید:
old-missing-type-doc / W9004
نام 'old-missing-type-doc' تغییر یافته است. پیام جدید را میتوانید در اینجا بیابید:
old-missing-yields-doc / W9009
نام 'old-missing-yields-doc' تغییر یافته است. پیام جدید را میتوانید در اینجا بیابید:
old-non-iterator-returned-1 / W0234
نام 'old-non-iterator-returned-1' تغییر یافته است. پیام جدید را میتوانید در اینجا بیابید:.SS old-unidiomatic-typecheck / W0154
نام 'old-unidiomatic-typecheck' تغییر یافته است. پیام جدید را میتوان در بخش زیر یافت:
unidiomatic-typecheck / C0123
پیام صادرشده:
برای بررسی نوع، به جای 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
پیوندهای مرتبط:
- تابع توکار type() https://docs.python.org/3/library/functions.html#type
- تابع توکار isinstance() https://docs.python.org/3/library/functions.html#isinstance
ایجادشده توسط بررسیکننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/comparison_checker.py.
old-unpacking-non-sequence / W0633
نام 'old-unpacking-non-sequence' تغییر یافته است. پیام جدید را میتوان در بخش زیر یافت:
useless-super-delegation / W0235
نام 'useless-super-delegation' تغییر یافته است. پیام جدید را میتوان در بخش زیر یافت:
قرارداد (Convention)
تمام پیامها در دستهبندی قرارداد (convention):
bad-classmethod-argument / C0202
پیام صادرشده:
متد کلاس %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 https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/docstyle.py.
bad-file-encoding / C2503
پیام صادرشده:
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.
bad-mcs-method-argument / C0203
پیام صادرشده:
متد فراکلاس %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.
consider-iterating-dictionary / C0201
پیام صادرشده:
بهجای فراخوانی .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 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.
consider-using-enumerate / C0200
پیام صادرشده:
استفاده از 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.
dict-init-mutate / C3401
پیام صادرشده:
هنگام مقداردهی اولیه دیکشنری، تمام کلید/مقدارهای شناختهشده را اعلان کنید.
توضیحات:
دیکشنریها میتوانند در یک دستور واحد و با استفاده از نحو لفظِ دیکشنری (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 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-first-line-empty / C0199
پیام صادرشده:
خط اول در 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 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.
import-private-name / C2701
پیام صادرشده:
وارد کردن %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 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.
invalid-name / C0103
پیام صادرشده:
%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) یا تحمیلشده توسط رابط جلوگیری شود.
- --name-group=<name1:name2:...,...>
- مقدار
پیشفرض:
خالی
قالب: گروههای جداشده با کاما از نامهای جداشده با دونقطه.
این گزینه میتواند برای ترکیب سبکهای نامگذاری استفاده شود. برای مثال، function:method الزامی میکند که توابع و متدها از سبکی یکسان استفاده کنند، و سبکی که توسط هر یک از این دو نوع نام فعال شود به دیگری نیز سرایت میکند. این امر مستلزم آن است که عبارت باقاعده برای انواع نامهای ترکیبشده از نامهای گروه مشابهی استفاده کند.
- --include-naming-hint=y|n
- پیشفرض: off
همراه با هر هشدار invalid-name، یک راهنمایی (عبارت باقاعده استفادهشده) برای قالب نام صحیح گنجانده شود.
ایجادشده توسط بررسیکننده basic https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/base/name_checker/checker.py.
line-too-long / C0301
پیام صادرشده:
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.
misplaced-comparison-constant / C2201
پیام صادرشده:
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 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.
missing-final-newline / C0304
پیام صادرشده:
خط جدید پایانی وجود ندارد (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>."
پیوندهای مرتبط:
- استاندارد POSIX https://pubs.opengroup.org/onlinepubs/9699919799
- استاندارد POSIX، فصل 3.206 (Line) https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_206
ایجادشده توسط بررسیکننده 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.
missing-module-docstring / C0114
پیام صادرشده:
نبود 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)
پیوندهای مرتبط:
- تاریخچه CRLF و LF https://stackoverflow.com/a/6521730/2519059
- مدیریت پایان خطوط در Git https://stackoverflow.com/a/10855862/2519059
- مجموعهای از الگوهای کاربردی .gitattributes https://github.com/alexkaratarakis/gitattributes
ایجاد شده توسط بررسیکننده format https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/format.py.
multiple-imports / C0410
پیام صادرشده:
چندین 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.
non-ascii-module-import / C2403
پیام صادرشده:
نام %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.
single-string-used-for-slots / C0205
پیام صادرشده:
مقدار __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.
singleton-comparison / C0121
پیام صادرشده:
مقایسه %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.
too-many-lines / C0302
پیام صادرشده:
خطوط بیش از حد در ماژول (%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.
trailing-whitespace / C0303
پیام صادرشده:
فاصلههای خالی پایانی
توضیحات:
هنگامی استفاده میشود که بین انتهای یک خط و نویسهی خط جدید، فاصلهی خالی وجود داشته باشد.
کد دارای مشکل:
print("Hello") # [trailing-whitespace]
# ^^^ trailing whitespaces
کد صحیح:
print("Hello")
ایجادشده توسط بررسیکننده format https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/format.py.
typevar-double-variance / C0131
پیام صادرشده:
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-mismatch / C0132
پیام صادرشده:
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 / C0328
پیام صادرشده:
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
پیوندهای مرتبط:
- تاریخچه CRLF و LF https://stackoverflow.com/a/6521730/2519059
- مدیریت پایان خطوط در Git https://stackoverflow.com/a/10855862/2519059
- مجموعهای از الگوهای کاربردی .gitattributes https://github.com/alexkaratarakis/gitattributes
ایجاد شده توسط بررسیکننده 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.
unnecessary-direct-lambda-call / C3002
پیام صادرشده:
عبارت لامبدا مستقیماً فراخوانی شده است. در عوض عبارت را بهصورت درونخطی اجرا کنید.
توضیحات:
هنگامی استفاده میشود که یک عبارت لامبدا به جای اجرای محتوای آن بهصورت درونخطی، مستقیماً فراخوانی شود.
کد دارای اشکال:
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.
unnecessary-dunder-call / C2801
پیام صادرشده:
متد داندر %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.
unnecessary-negation / C0117
پیام صادرشده:
تغییر دادن "%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.
use-implicit-booleaness-not-comparison-to-string / C1804
پیام صادرشده:
"%s" میتواند به "%s" سادهسازی شود، در صورتی که دقیقاً یک رشته باشد، زیرا یک رشتهٔ خالی فالسگونه (falsey) است
توضیحات:
رشتههای خالی در یک زمینهٔ بولی (boolean context) نادرست (false) در نظر گرفته میشوند. پیروی کورکورانه از این بررسی در پایگاههای کدی با نوعبندی ضعیف (weakly typed)، میتواند اشکالاتی ایجاد کند که عیبیابی آنها دشوار است. اگر مقدار بتواند چیز دیگری باشد که فالسگونه (falsey) است اما رشته نیست (برای مثال ``None``، یک دنبالهٔ خالی، یا ``0``)، کد معادل نخواهد بود.
هشدار:
کد دارای اشکال:
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``، یک رشته خالی، یا یک توالی خالی)، کد معادل نخواهد بود.
هشدار:
کد دارای مشکل:
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.
use-implicit-booleaness-not-len / C1802
پیام صادرشده:
برای تعیین خالی بودن یک توالی، از `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.
use-sequence-for-iteration / C0208
پیام صادرشده:
هنگام پیمایش روی مقادیر از یک نوع دنباله استفاده کنید
توضیحات:
هنگام پیمایش روی مقادیر، انواع دنباله (مانند ``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__ بسته استفاده کنید.
پیوندهای مرتبط:
- --allow-reexport-from-package <#imports-options>
- راهنمای واردسازی PEP 8 https://peps.python.org/pep-0008/#imports
- Pylint block-disable <#block-disables>
- mypy --no-implicit-reexport https://mypy.readthedocs.io/en/stable/command_line.html#cmdoption-mypy-no-implicit-reexport
ایجادشده توسط بررسیکننده imports https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/imports.py.
wrong-import-order / C0411
پیام صادرشده:
%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.
wrong-spelling-in-comment / C0401
پیام صادرشده:
املای نادرست واژهٔ '%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 / C0102
'blacklisted-name' تغییر نام یافته است. پیام جدید را میتوان در اینجا یافت:
compare-to-empty-string / C1901
'compare-to-empty-string' تغییر نام یافته است. پیام جدید را میتوان در اینجا یافت:
compare-to-zero / C2001
'compare-to-zero' تغییر نام یافته است. پیام جدید را میتوان در اینجا یافت:
len-as-condition / C1801
'len-as-condition' تغییر نام یافته است. پیام جدید را میتوان در اینجا یافت:
missing-docstring / C0111
'missing-docstring' تغییر نام یافته است. پیام جدید را میتوان در اینجا یافت:
old-misplaced-comparison-constant / C0122
'old-misplaced-comparison-constant' تغییر نام یافته است. پیام جدید را میتوان در اینجا یافت:
old-non-ascii-name / C0144
'old-non-ascii-name' تغییر نام یافته است. پیام جدید را میتوان در اینجا یافت:
unneeded-not / C0113
'unneeded-not' تغییر نام یافته است. پیام جدید را میتوان در اینجا یافت:
بازآرایی (Refactor)
تمام پیامهای دستهبندی بازآرایی (refactor):
chained-comparison / R1716
پیام صادرشده:
سادهسازی مقایسه زنجیرهای میان عملوندها
توضیحات:
این پیام زمانی صادر میشود که 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.
comparison-with-itself / R0124
پیام صادرشده:
مقایسهٔ زائد - %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.
condition-evals-to-constant / R1727
پیام صادرشده:
شرط بولی '%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 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 https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/typing.py.
consider-math-not-float / R6106
پیام صادرشده:
استفاده از %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
بنابراین تصمیمگیری به این بستگی دارد که چگونه و با چه بسامدی نیاز به استفاده از آن دارید و چه چیزی برای شما اهمیت دارد.
نکته:
consider-merging-isinstance / R1701
پیام صادرشده:
ادغام این فراخوانیهای 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.
consider-refactoring-into-while-condition / R3501
پیام صادرشده:
استفاده از '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 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.
consider-using-alias / R6002
پیام صادرشده:
'%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 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 https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/code_style.py.
consider-using-augmented-assign / R6104
پیام صادرشده:
برای انجام مستقیم یک انتساب افزوده از '%s' استفاده کنید
توضیحات:
زمانی صادر میشود که یک انتساب به همان شیئی ارجاع میدهد که در حال انتساب مقدار به آن است. این مورد میتواند به یک انتساب افزوده تبدیل شود. بهطور پیشفرض غیرفعال است!
هشدار:
کد دارای اشکال:
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 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.
consider-using-from-import / R0402
پیام صادرشده:
بهجای آن از '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.
consider-using-generator / R1728
پیام صادرشده:
بهجای '%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 نیز توصیه شده است.
پیوندهای مرتبط:
- PEP 289 https://peps.python.org/pep-0289
- بنچمارک و بحث پیرامون any/all/list/tuple https://github.com/pylint-dev/pylint/pull/3309#discussion_r576683109
- بنچمارک و بحث پیرامون sum/max/min https://github.com/pylint-dev/pylint/pull/6595#issuecomment-1125704244
ایجادشده توسط بررسیکنندهٔ 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.
consider-using-in / R1714
پیام صادرشده:
ادغام این مقایسهها با '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.
consider-using-join / R1713
پیام صادرشده:
استفاده از 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.
consider-using-min-builtin / R1730
پیام صادرشده:
استفاده از '%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.
consider-using-namedtuple-or-dataclass / R6101
پیام صادرشده:
استفاده از 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 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.
consider-using-sys-exit / R1722
پیام صادرشده:
بهجای آن استفاده از '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.
consider-using-tuple / R6102
پیام صادرشده:
استفاده از تاپل درجا بهجای لیست را در نظر بگیرید
توضیحات:
صرفاً جهت یکدستی سبک نگارش! زمانی صادر میشود که یک ``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 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 استفاده شود
پیوندهای مرتبط:
- مستندات پایتون: خواندن و نوشتن فایلها https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files
- PEP 343 https://peps.python.org/pep-0343
- مدیرهای زمینه در پایتون https://johnlekberg.com/blog/2020-10-11-ctx-manage.html نوشته John Lekberg
- منطق و دلایل https://stackoverflow.com/a/73181877/2519059
ایجادشده توسط بررسیکنندهٔ refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.
cyclic-import / R0401
پیام صادرشده:
درونریزی چرخهای (%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 https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/check_elif.py.
empty-comment / R2044
پیام صادرشده:
خط دارای کامنت خالی
توضیحات:
زمانی استفاده میشود که نماد # روی خطی ظاهر شود و به دنبال آن کامنت واقعی نیامده باشد
کد دارای اشکال:
# +1:[empty-comment] # # +1:[empty-comment] x = 0 #
کد درست:
# comment x = 0 # comment
فایل پیکربندی:
[main] load-plugins=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.
literal-comparison / R0123
پیام صادرشده:
در '%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.
magic-value-comparison / R2004
پیام صادرشده:
استفاده از یک ثابت نامگذاریشده یا یک 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 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.
match-class-positional-attributes / R1906
پیام صادرشده:
بهجای ویژگیهای ترتیبی از ویژگیهای کلیدواژهای استفاده کنید (%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.
no-else-break / R1723
پیام صادرشده:
"%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.
no-else-raise / R1720
پیام صادرشده:
"%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.
no-self-use / R6301
پیام صادرشده:
متد میتواند یک تابع باشد
توضیحات:
زمانی به کار میرود که یک متد از نمونهٔ مقید خود استفاده نمیکند و بنابراین میتواند به صورت یک تابع نوشته شود.
کد مشکلدار:
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 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 / R6105
پیام صادرشده:
Prefer 'typing.NamedTuple' over 'collections.namedtuple'
توضیحات:
'typing.NamedTuple' از کلیدواژهٔ نامآشنای 'class' همراه با type-hints برای خوانایی بهتر استفاده میکند (همچنین به دلیل اجتناب از فراخوانی داخلی exec، سریعتر است). بهطور پیشفرض غیرفعال است!
احتیاط:
کد دارای اشکال:
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
پیوندهای مرتبط:
- •
- typing.NamedTuple https://docs.python.org/3/library/typing.html#typing.NamedTuple
نکته:
ایجادشده توسط بررسیکنندهٔ 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.
redefined-argument-from-local / R1704
پیام صادرشده:
بازتعریف آرگومان با نام محلی %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 https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/extensions/redefined_variable_type.py.
redundant-typehint-argument / R6006
پیام صادرشده:
نوع `%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 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.
simplifiable-if-expression / R1719
پیام صادرشده:
عبارت 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.
simplify-boolean-expression / R1709
پیام صادرشده:
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 به بیرون منتشر شود.
پیوندهای مرتبط:
- •
- PEP 479 https://peps.python.org/pep-0479
ایجادشده توسط بازرس (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.
too-complex / R1260
پیام صادرشده:
%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 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.
too-many-boolean-expressions / R0916
پیام صادرشده:
عبارات بولی بیش از حد در دستور 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.
too-many-instance-attributes / R0902
پیام صادرشده:
تعداد ویژگیهای نمونه بیش از حد مجاز (%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 / R0917
پیام صادرشده:
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.
too-many-statements / R0915
پیام صادرشده:
تعداد بیش از حد دستورها (%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.
unnecessary-comprehension / R1721
پیام صادرشده:
استفاده غیرضروری از 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.
unnecessary-default-type-args / R6007
پیام صادرشده:
نوع `%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 تعداد آرگومانهای نوع را اعتبارسنجی نمیکنند؛ بنابراین مقادیر پیشفرض این موارد میتواند در نسخههای پیشین نیز استفاده شود.
پیوندهای مرتبط:
- مستندات Python برای AsyncGenerator https://docs.python.org/3.13/library/typing.html#typing.AsyncGenerator
- مستندات Python برای Generator https://docs.python.org/3.13/library/typing.html#typing.Generator
نکته:
ایجادشده توسط بررسیکنندهٔ 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.
unnecessary-list-index-lookup / R1736
پیام صادرشده:
جستجوی غیرضروری اندیس لیست، بهجای آن از '%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.
use-a-generator / R1729
پیام صادرشده:
بهجای '%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 باشند)، عملکرد بهتر خواهد بود.
پیوندهای مرتبط:
- PEP 289 – Generator Expressions https://peps.python.org/pep-0289
- بنچمارک و گفتگو در زمان پیادهسازی اولیه https://github.com/pylint-dev/pylint/pull/3309#discussion_r576683109
ایجادشده توسط بررسیکنندهٔ 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.
use-set-for-membership / R6201
پیام صادرشده:
استفاده از 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 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
پیوندهای مرتبط:
- •
- PEP 380 https://peps.python.org/pep-0380
ایجاد شده توسط بررسیکننده refactoring https://github.com/pylint-dev/pylint/blob/main/build/lib/pylint/checkers/refactoring/refactoring_checker.py.
useless-object-inheritance / R0205
پیام صادرشده:
کلاس %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 / R0201
پیام 'old-no-self-use' تغییر نام یافته است. پیام جدید را میتوانید در اینجا بیابید:
old-simplifiable-if-statement / R0102
پیام 'old-simplifiable-if-statement' تغییر نام یافته است. پیام جدید را میتوانید در اینجا بیابید:
old-too-many-nested-blocks / R0101
پیام 'old-too-many-nested-blocks' تغییر نام یافته است. پیام جدید را میتوانید در اینجا بیابید:
اطلاعات (Information)
تمام پیامها در دستهبندی اطلاعات (information):
bad-inline-option / I0010
پیام صادرشده:
امکان در نظر گرفتن گزینه درونخطی %r وجود ندارد
توضیحات:
زمانی استفاده میشود که یک گزینه درونخطی قالببندی نادرستی داشته باشد یا نتوان از آن در داخل ماژولها استفاده کرد.
احتیاط:
احتیاط:
کد دارای مشکل:
# 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 دسترسی پیدا شود. به دلیل در دسترس نبودن کد منبع، تحلیل ایستا غیرممکن است، اما میتواند با دروننگری اشیاء زنده در زمان اجرا انجام شود.
هشدار:
جزئیات بیشتر:
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.
deprecated-pragma / I0022
پیام صادرشده:
پراگمای "%s" منسوخ شده است، بهجای آن از "%s" استفاده کنید
توضیحات:
برخی از گزینههای درونخطی pylint تغییر نام یافته یا بازنگری شدهاند؛ فقط باید از جدیدترین شکل آن استفاده شود. یادداشت: skip-all فقط در pylint >= 0.26 در دسترس است
هشدار:
هشدار:
کد دارای مشکل:
# 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 / I0013
پیام صادرشده:
نادیده گرفتن کل فایل
توضیحات:
برای اعلام اینکه فایل بررسی نخواهد شد استفاده میشود
هشدار:
هشدار:
کد دارای مشکل:
# 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)
توضیحات:
زمانی استفاده میشود که یک گزینهٔ درونخطی یک پیام یا یک دسته از پیامها را غیرفعال کند.
هشدار:
هشدار:
کد دارای مشکل:
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.
raw-checker-failed / I0001
پیام صادرشده:
عدم امکان اجرای بررسیکنندههای خام روی ماژول توکار %s
توضیحات:
برای اطلاع از اینکه یک ماژول توکار توسط بررسیکنندههای خام بررسی نشده است، استفاده میشود.
هشدار:
هشدار:
جزئیات تکمیلی:
این پیام هشدار میدهد که تحلیل یک ماژول توکار غیرممکن بوده است (یک گره 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= در فایل سرکوب شده است. این پیام برای پیامهایی که به دلیل تنظیمات پیکربندی نادیده گرفته میشوند، تولید نمیشود.
هشدار:
هشدار:
کد دارای مشکل:
### 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.
use-symbolic-message-instead / I0023
پیام صادرشده:
%s
توضیحات:
زمانی استفاده میشود که یک پیام بر اساس شناسه (id) فعال یا غیرفعال شده باشد.
هشدار:
هشدار:
کد دارای مشکل:
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
توضیحات:
زمانی گزارش میشود که پیامی بهطور صریح برای یک خط یا بلوکی از کد غیرفعال شده باشد، اما هرگز رخ ندهد.
هشدار:
هشدار:
کد دارای مشکل:
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 / I0014
پیام 'deprecated-disable-all' تغییر نام یافته است. پیام جدید را میتوانید در این آدرس بیابید:
کنترل پیامها (Messages control)
به منظور کنترل پیامها، 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 از مقادیر پیشفرض خود استفاده خواهد کرد.
نکته:
بررسیکنندههای استاندارد
بررسیکننده Main
--analyse-fallback-blocks
تحلیل بلوکهای جایگزین وارد کردن (import fallback blocks). این گزینه میتواند برای پشتیبانی از کدهای سازگار با هر دو نسخه پایتون ۲ و ۳ استفاده شود، به این معنی که بلوک ممکن است کدی داشته باشد که فقط در یکی از مفسرها وجود دارد و هنگام تحلیل، منجر به موارد مثبت کاذب شود.
پیشفرض: False
--clear-cache-post-run
پاکسازی حافظههای موقت درونحافظهای (in-memory caches) پس از پایان بررسی کد (linting). در صورت اجرای pylint در حالتی شبیه به سرور مفید است.
پیشفرض: False
--confidence
تنها نمایش هشدارهایی با سطوح اطمینان فهرستشده. برای نمایش همه، این مقدار را خالی بگذارید. سطوح معتبر: 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" استفاده کنید.
پیشفرض: ()
--enable
پیام، گزارش، دستهبندی یا بررسیکننده با شناسه(های) دادهشده را فعال میکند. میتوانید چندین شناسه را با ویرگول (,) جدا کرده یا این گزینه را چندین بار درج کنید (تنها در خط فرمان، نه در فایل پیکربندی که در آن باید فقط یک بار بیاید). برای مثالها گزینه "--disable" را نیز ببینید.
پیشفرض: ()
--evaluation
عبارت پایتونی که باید امتیازی کمتر یا مساوی ۱۰ بازگرداند. شما به متغیرهای 'fatal'، 'error'، 'warning'، 'refactor'، 'convention' و 'info' که شامل تعداد پیامها در هر دستهبندی هستند، و همچنین 'statement' که تعداد کل دستورهای تحلیلشده است دسترسی دارید. این امتیاز توسط گزارش ارزیابی سراسری (RP0004) استفاده میشود.
پیشفرض: max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10))
--exit-zero
همیشه یک کد وضعیت 0 (غیرخطا) بازمیگرداند، حتی اگر خطاهای lint پیدا شوند. این قابلیت اساساً در اسکریپتهای یکپارچهسازی مداوم (CI) مفید است.
پیشفرض: False
--extension-pkg-allow-list
فهرستی جداشده با ویرگول از نام بستهها یا ماژولهایی که افزونههای C ممکن است از آنها بارگذاری شوند. افزونهها در مفسر فعال پایتون بارگذاری میشوند و ممکن است کدهای دلخواه را اجرا کنند.
پیشفرض: []
--extension-pkg-whitelist
فهرستی جداشده با ویرگول از نام بستهها یا ماژولهایی که افزونههای C ممکن است از آنها بارگذاری شوند. افزونهها در مفسر فعال پایتون بارگذاری میشوند و ممکن است کدهای دلخواه را اجرا کنند. (این نامی جایگزین برای extension-pkg-allow-list جهت سازگاری با نسخههای پیشین است.)
پیشفرض: []
--fail-on
اگر هر یک از این پیامها/دستهبندیها شناسایی شوند، کد خروج غیرصفر بازمیگرداند، حتی اگر امتیاز بالاتر از مقدار --fail-under باشد. نحو نگارش آن مشابه enable است. پیامهای مشخصشده فعال میشوند، در حالی که دستهبندیها تنها پیامهای از پیش فعالشده را بررسی میکنند.
پیشفرض: ""
--fail-under
آستانه امتیازی را مشخص میکند که پایینتر از آن، برنامه با خطا خارج خواهد شد.
پیشفرض: 10
--from-stdin
ورودی استاندارد (stdin) را به عنوان یک اسکریپت پایتون تفسیر میکند که نام فایل آن باید به عنوان آرگومان module_or_package فرستاده شود.
پیشفرض: False
--ignore
فایلها یا دایرکتوریهایی که باید نادیده گرفته شوند. این موارد باید نام پایه (base name) باشند، نه مسیر کامل.
پیشفرض: ('CVS',)
--ignore-paths
افزودن فایلها یا دایرکتوریهای منطبق بر الگوهای عبارات منظم (regex) به فهرست نادیدهگرفتهشدهها (ignore-list). عبارت منظم در برابر مسیرها سنجیده میشود و میتواند در قالب Posix یا Windows باشد. از آنجا که '\' در سامانههای Windows نشاندهنده جداکننده دایرکتوری است، نمیتواند به عنوان نویسه گریز (escape character) استفاده شود.
پیشفرض: []
--ignore-patterns
فایلها یا دایرکتوریهای منطبق بر الگوهای عبارات منظم نادیده گرفته میشوند. عبارت منظم با نامهای پایه سنجیده میشود، نه مسیرها. مقدار پیشفرض، قفلهای فایل Emacs را نادیده میگیرد.
پیشفرض: (re.compile('^\\.#'),)
--ignored-modules
فهرستی از نام ماژولهایی که صفتهای عضو آنها نباید بررسی شود و وارد (import) نخواهند شد (برای ماژولها/پروژههایی که در آنها فضاهای نام در زمان اجرا دستکاری میشوند و بنابراین صفتهای عضو موجود از طریق تحلیل ایستا قابل استنتاج نیستند مفید است). این گزینه از نامهای واجد شرایط (qualified) ماژول و همچنین تطبیق الگوی یونیکس پشتیبانی میکند.
پیشفرض: ()
--jobs
استفاده از چند پردازش برای افزایش سرعت Pylint. مشخص کردن 0 باعث شناسایی خودکار تعداد پردازندههای در دسترس برای استفاده میشود و در Windows تعداد را محدود میکند تا از قفل شدن برنامه جلوگیری شود.
پیشفرض: 1
--limit-inference-results
مهار تعداد مقادیر استنتاجشده بالقوه هنگام استنتاج یک شیء منفرد. این کار میتواند به بهبود عملکرد هنگام کار با توابع بزرگ یا شرایط تودرتو و پیچیده کمک کند.
پیشفرض: 100
--load-plugins
فهرستی از پلاگینها (به صورت مقادیر جداشده با ویرگول از نام ماژولهای پایتون) برای بارگذاری، معمولاً جهت ثبت بررسیکنندههای اضافی.
پیشفرض: ().SS --msg-template
قالب مورد استفاده برای نمایش پیامها. این یک رشته قالببندی سبک جدید پایتون (new-style format string) است که برای قالببندی اطلاعات پیام استفاده میشود. برای تمام جزئیات به مستندات مراجعه کنید.
پیشفرض: ""
--output-format
تعیین قالب خروجی. قالبهای موجود عبارتند از: 'text'، 'parseable'، 'colorized'، 'json2' (قالب json بهبودیافته)، 'json' (قالب json قدیمی)، msvs (ویژوال استودیو) و 'github' (GitHub actions). همچنین میتوانید یک کلاس گزارشگر مشخص کنید، به عنوان مثال mypackage.mymodule.MyReporterClass.
پیشفرض: text
--persistent
ذخیره (pickle) دادههای جمعآوریشده برای مقایسههای بعدی.
پیشفرض: True
--prefer-stubs
ارجاع واردسازیها (imports) به استابهای pyi. در صورت موجود بودن. ممکن است پیامهای no-member را کاهش داده و پیامهای not-an-iterable را افزایش دهد.
پیشفرض: False
--py-version
حداقل نسخه پایتون جهت استفاده در بررسیهای وابسته به نسخه. پیشفرض، نسخهای است که برای اجرای pylint استفاده شده است.
پیشفرض: sys.version_info[:2]
--recursive
کشف و شناسایی ماژولها و بستههای پایتون در زیردرخت سیستم فایل.
پیشفرض: False
--reports
مشخص میکند که آیا یک گزارش کامل نمایش داده شود یا فقط پیامها.
پیشفرض: False
--score
فعال کردن امتیاز ارزیابی.
پیشفرض: True
--source-roots
افزودن مسیرها به فهرست ریشههای سورس (source roots). از الگوهای تطبیق مسیر (globbing) پشتیبانی میکند. ریشه سورس یک مسیر مطلق یا نسبی نسبت به دایرکتوری کاری فعلی است که برای تعیین فضاینام بسته (package namespace) برای ماژولهای واقع در زیر آن ریشه استفاده میشود.
پیشفرض: ()
--unsafe-load-any-extension
اجازه بارگذاری افزونههای دلخواه 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
--argument-naming-style
سبک نامگذاری منطبق با نامهای صحیح آرگومان.
پیشفرض: snake_case
--argument-rgx
عبارت باقاعده منطبق با نامهای صحیح آرگومان. بر argument-naming-style اولویت دارد. در صورت خالی ماندن، نامهای آرگومان با سبک نامگذاری تعیینشده بررسی خواهند شد.
پیشفرض: None
--attr-naming-style
سبک نامگذاری منطبق با نامهای صحیح صفتها.
پیشفرض: snake_case
--attr-rgx
عبارت باقاعده منطبق با نامهای صحیح صفتها. بر attr-naming-style اولویت دارد. در صورت خالی ماندن، نامهای صفت با سبک نامگذاری تعیینشده بررسی خواهند شد.
پیشفرض: None
--bad-names
نامهای نامناسب متغیر که همیشه باید رد شوند، جداشده با کاما.
پیشفرض: ('foo', 'bar', 'baz', 'toto', 'tutu', 'tata')
--bad-names-rgxs
عبارتهای باقاعده نامهای نامناسب متغیر، جداشده با کاما. در صورتی که نامها با هر عبارت باقاعدهای تطابق داشته باشند، همواره رد خواهند شد
پیشفرض: ""
--class-attribute-naming-style
سبک نامگذاری منطبق با نامهای صحیح صفتهای کلاس.
پیشفرض: any
--class-attribute-rgx
عبارت باقاعده منطبق با نامهای صحیح صفتهای کلاس. بر class-attribute-naming-style اولویت دارد. در صورت خالی ماندن، نامهای صفت کلاس با سبک نامگذاری تعیینشده بررسی خواهند شد.
پیشفرض: None
--class-const-naming-style
سبک نامگذاری منطبق با نامهای صحیح ثابتهای کلاس.
پیشفرض: UPPER_CASE
--class-const-rgx
عبارت باقاعده منطبق با نامهای صحیح ثابتهای کلاس. بر class-const-naming-style اولویت دارد. در صورت خالی ماندن، نامهای ثابت کلاس با سبک نامگذاری تعیینشده بررسی خواهند شد.
پیشفرض: None
--class-naming-style
سبک نامگذاری منطبق با نامهای صحیح کلاس.
پیشفرض: PascalCase
--class-rgx
عبارت باقاعده منطبق با نامهای صحیح کلاس. بر class-naming-style اولویت دارد. در صورت خالی ماندن، نامهای کلاس با سبک نامگذاری تعیینشده بررسی خواهند شد.
پیشفرض: None
--const-naming-style
سبک نامگذاری منطبق با نامهای صحیح ثابتها.
پیشفرض: UPPER_CASE
--const-rgx
عبارت باقاعده منطبق با نامهای صحیح ثابتها. بر const-naming-style اولویت دارد. در صورت خالی ماندن، نامهای ثابت با سبک نامگذاری تعیینشده بررسی خواهند شد.
پیشفرض: None
--docstring-min-length
حداقل طول خطوط برای توابع/کلاسهایی که نیازمند docstring هستند؛ موارد کوتاهتر معاف هستند.
پیشفرض: -1
--function-naming-style
سبک نامگذاری منطبق با نامهای صحیح توابع.
پیشفرض: snake_case.SS --function-rgx
عبارت باقاعده منطبق بر نامهای صحیح توابع. بر function-naming-style ارجحیت دارد. در صورت خالی ماندن، نامهای توابع با سبک نامگذاری تعیینشده بررسی خواهند شد.
پیشفرض: None
--good-names
نامهای متغیر مناسب که همواره باید پذیرفته شوند، جداشده با کاما.
پیشفرض: ('i', 'j', 'k', 'ex', 'Run', '_')
--good-names-rgxs
عبارتهای باقاعده نامهای متغیر مناسب، جداشده با کاما. در صورتی که نامها با هر یک از عبارتهای باقاعده مطابقت داشته باشند، همواره پذیرفته خواهند شد.
پیشفرض: ""
--include-naming-hint
گنجاندن یک راهنما برای قالب نامگذاری صحیح همراه با invalid-name.
پیشفرض: False
--inlinevar-naming-style
سبک نامگذاری منطبق بر نامهای صحیح تکرار درونخطی (inline iteration).
پیشفرض: any
--inlinevar-rgx
عبارت باقاعده منطبق بر نامهای صحیح تکرار درونخطی. بر inlinevar-naming-style ارجحیت دارد. در صورت خالی ماندن، نامهای تکرار درونخطی با سبک نامگذاری تعیینشده بررسی خواهند شد.
پیشفرض: None
--method-naming-style
سبک نامگذاری منطبق بر نامهای صحیح متدها.
پیشفرض: snake_case
--method-rgx
عبارت باقاعده منطبق بر نامهای صحیح متدها. بر method-naming-style ارجحیت دارد. در صورت خالی ماندن، نامهای متدها با سبک نامگذاری تعیینشده بررسی خواهند شد.
پیشفرض: None
--module-naming-style
سبک نامگذاری منطبق بر نامهای صحیح ماژولها.
پیشفرض: snake_case
--module-rgx
عبارت باقاعده منطبق بر نامهای صحیح ماژولها. بر module-naming-style ارجحیت دارد. در صورت خالی ماندن، نامهای ماژولها با سبک نامگذاری تعیینشده بررسی خواهند شد.
پیشفرض: None
--name-group
مجموعههایی از نامها که با دونقطه از هم جدا شدهاند و هنگامی که عبارتهای باقاعده نام، چندین سبک را مجاز میدانند، سبک نامگذاری یکدیگر را تعیین میکنند.
پیشفرض: ()
--no-docstring-rgx
عبارت باقاعدهای که تنها باید با نامهای توابع یا کلاسهایی مطابقت داشته باشد که نیازی به docstring ندارند.
پیشفرض: re.compile('^_')
--paramspec-rgx
عبارت باقاعده منطبق بر نامهای صحیح متغیرهای مشخصات پارامتر (parameter specification). در صورت خالی ماندن، نامهای متغیر مشخصات پارامتر با سبک نامگذاری تعیینشده بررسی خواهند شد.
پیشفرض: None
--property-classes
فهرستی از دکوراتورها که ویژگی (property) تولید میکنند، مانند abc.abstractproperty. برای ثبت دکوراتورهای دیگری که ویژگیهای معتبر ایجاد میکنند به این فهرست اضافه کنید. این دکوراتورها فقط برای invalid-name در نظر گرفته میشوند.
پیشفرض: ('abc.abstractproperty',)
--typealias-rgx
عبارت باقاعده منطبق بر نامهای صحیح نامهای مستعار نوع (type alias). در صورت خالی ماندن، نامهای مستعار نوع با سبک نامگذاری تعیینشده بررسی خواهند شد.
پیشفرض: None
--typevar-rgx
عبارت باقاعده منطبق بر نامهای صحیح متغیرهای نوع (type variable). در صورت خالی ماندن، نامهای متغیرهای نوع با سبک نامگذاری تعیینشده بررسی خواهند شد.
پیشفرض: None.SS --typevartuple-rgx
عبارت باقاعده برای تطبیق با نامهای درست چندتایی متغیر نوع (type variable tuple). اگر خالی رها شود، نامهای چندتایی متغیر نوع با سبک نامگذاری تعیینشده بررسی خواهند شد.
پیشفرض: None
--variable-naming-style
سبک نامگذاری منطبق با نامهای درست متغیر.
پیشفرض: snake_case
--variable-rgx
عبارت باقاعده برای تطبیق با نامهای درست متغیر. بر 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 =
--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
فهرست نامهای معتبر برای آرگومان نخست در یک متد کلاس (classmethod).
پیشفرض: ('cls',)
--valid-metaclass-classmethod-first-arg
فهرست نامهای معتبر برای آرگومان نخست در متد کلاس یک متاکلاس.
پیشفرض: ('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"]
بررسیکننده طراحی (Design Checker)
--exclude-too-few-public-methods
فهرست عبارتهای باقاعده از نامهای اجداد کلاس برای نادیدهگرفتن هنگام شمارش متدهای عمومی (مشاهده R0903)
پیشفرض: []
--ignored-parents
فهرست نامهای کامل کلاسها برای نادیدهگرفتن هنگام شمارش والدین کلاس (مشاهده R0901)
پیشفرض: ()
--max-args
حداکثر تعداد آرگومانها برای تابع / متد.
پیشفرض: 5
--max-attributes
حداکثر تعداد مشخصهها برای یک کلاس (مشاهده R0902).
پیشفرض: 7
--max-bool-expr
حداکثر تعداد عبارتهای بولی در یک دستور if (مشاهده R0916).
پیشفرض: 5
--max-branches
حداکثر تعداد شاخهها برای بدنه تابع / متد.
پیشفرض: 12
--max-complexity
آستانه پیچیدگی سیکلوماتیک McCabe
پیشفرض: 10.SS --max-locals
حداکثر تعداد متغیرهای محلی برای بدنه تابع / متد.
پیشفرض: 15
--max-parents
حداکثر تعداد والدها برای یک کلاس (R0901 را ببینید).
پیشفرض: 7
--max-positional-arguments
حداکثر تعداد آرگومانهای مکانی برای تابع / متد.
پیشفرض: 5
--max-public-methods
حداکثر تعداد متدهای عمومی برای یک کلاس (R0904 را ببینید).
پیشفرض: 20
--max-returns
حداکثر تعداد return / yield برای بدنه تابع / متد.
پیشفرض: 6
--max-statements
حداکثر تعداد دستورات در بدنه تابع / متد.
پیشفرض: 50
--min-public-methods
حداقل تعداد متدهای عمومی برای یک کلاس (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
بررسیکننده استثناها (Exceptions Checker)
--overgeneral-exceptions
استثناهایی که هنگام گرفتهشدن (catch)، یک هشدار صادر میکنند.
پیشفرض: ('builtins.BaseException', 'builtins.Exception')
نکته: فقط tool.pylint الزامی است، عنوان بخش الزامی نیست. اینها مقادیر پیشفرض هستند.
[tool.pylint.exceptions] overgeneral-exceptions = ["builtins.BaseException", "builtins.Exception"]
--expected-line-ending-format
قالب مورد انتظار برای پایان خط؛ برای نمونه خالی (هر پایان خطی)، LF یا CRLF.
پیشفرض: ""
--ignore-long-lines
عبارت باقاعده (Regexp) برای خطی که مجاز است از حد تعیینشده طولانیتر باشد.
پیشفرض: ^\s*(# )?<?https?://\S+>?$
--indent-after-paren
تعداد فاصلههای تورفتگی مورد نیاز درون یک خط معلق (hanging) یا ادامهدار.
پیشفرض: 4
--indent-string
رشتهای که به عنوان واحد تورفتگی استفاده میشود. این مقدار معمولاً " " (۴ فاصله) یا "t" (۱ تب) است.
پیشفرض: `` ``
--max-line-length
بیشینهٔ تعداد نویسهها در یک خط منفرد. مقدار پیشفرض ۱۰۰ در Pylint بر اساس رهنمود PEP 8 است که بیان میکند تیمها میتوانند طول خط را تا ۹۹ نویسه انتخاب کنند.
پیشفرض: 100
--max-module-lines
بیشینهٔ تعداد خطها در یک ماژول.
پیشفرض: 1000
--single-line-class-stmt
اجازه دادن به قرارگیری بدنهٔ کلاس در همان خط اعلان، در صورتی که بدنه تنها شامل یک عبارت باشد.
پیشفرض: False
--single-line-if-stmt
اجازه دادن به قرارگیری بدنهٔ دستور 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
بررسیکنندهٔ Imports (Imports Checker)
--allow-any-import-level
فهرستی از ماژولهایی که میتوان آنها را در هر سطحی، و نه فقط در بالاترین سطح (top level)، وارد (import) کرد.
پیشفرض: ()
--allow-reexport-from-package
اجازه دادن به بازصادرات (re-export) صریح از طریق نام مستعار (alias) از __init__ یک بسته.
پیشفرض: False
--allow-wildcard-with-all
اجازه دادن به واردسازیهای عامهنما (wildcard imports) از ماژولهایی که __all__ را تعریف کردهاند.
پیشفرض: False.SS --deprecated-modules
ماژولهای منسوخشدهای که نباید استفاده شوند، که با کاما از هم جدا شدهاند.
پیشفرض: ()
--ext-import-graph
خروجی دادن یک نمودار (با فرمت .gv یا هر قالب تصویر پشتیبانیشده) از وابستگیهای خارجی در فایل مشخصشده (گزارش RP0402 نباید غیرفعال باشد).
پیشفرض: ""
--import-graph
خروجی دادن یک نمودار (با فرمت .gv یا هر قالب تصویر پشتیبانیشده) از تمامی وابستگیها (یعنی داخلی و خارجی) در فایل مشخصشده (گزارش RP0402 نباید غیرفعال باشد).
پیشفرض: ""
--int-import-graph
خروجی دادن یک نمودار (با فرمت .gv یا هر قالب تصویر پشتیبانیشده) از وابستگیهای داخلی در فایل مشخصشده (گزارش RP0402 نباید غیرفعال باشد).
پیشفرض: ""
--known-standard-library
اجبار ترتیب واردسازی (import) برای شناختن یک ماژول به عنوان بخشی از کتابخانههای استاندارد سازگاری.
پیشفرض: ()
--known-third-party
اجبار ترتیب واردسازی (import) برای شناختن یک ماژول به عنوان بخشی از یک کتابخانه شخص ثالث (third-party).
پیشفرض: ('enchant',)
--preferred-modules
جفتهایی از ماژولها و ماژولهای ترجیحی، که با کاما از هم جدا شدهاند.
پیشفرض: ()
نکته: تنها 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
--logging-format-style
نوع قالببندی رشتهای که متدهای logging انجام میدهند. `old` به معنای استفاده از قالببندی % است، و `new` برای قالببندی `{}` به کار میرود.
پیشفرض: old
--logging-modules
ماژولهای logging برای بررسی اینکه آرگومانهای قالب رشته در قالب پارامترهای تابع logging باشند.
پیشفرض: ('logging',)
نکته: تنها tool.pylint الزامی است، عنوان بخش الزامی نیست. اینها مقادیر پیشفرض هستند.
[tool.pylint.logging] # Possible choices: ['old', 'new'] logging-format-style = "old" logging-modules = ["logging"]
--timeout-methods
فهرستی از نامهای کامل (مانند 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"]
بررسیکنندهٔ Miscellaneous
--check-fixme-in-docstring
آیا در docstringها به دنبال fixmeها جستجو شود یا خیر.
پیشفرض: False
--notes
فهرستی از برچسبهای یادداشت جهت در نظر گرفتن، جداشده با کاما.
پیشفرض: ('FIXME', 'XXX', 'TODO')
--notes-rgx
عبارت باقاعده (Regex) برچسبهای یادداشت جهت در نظر گرفتن.
پیشفرض: ""
نکته: فقط tool.pylint الزامی است، عنوان بخش لازم نیست. اینها مقادیر پیشفرض هستند.
[tool.pylint.miscellaneous] check-fixme-in-docstring = false notes = ["FIXME", "XXX", "TODO"] notes-rgx = ""
بررسیکنندهٔ Refactoring
--max-nested-blocks
حداکثر تعداد بلوکهای تو در تو برای بدنهٔ تابع / متد
پیشفرض: 5
--never-returning-functions
نام کامل توابعی که هرگز بازنمیگردند. هنگام بررسی inconsistent-return-statements، اگر تابعی فراخوانی شود که هرگز بازگشت ندارد، به عنوان یک دستور return صریح در نظر گرفته شده و هیچ پیامی چاپ نخواهد شد.
پیشفرض: ('sys.exit', 'argparse.parse_error')
--suggest-join-with-non-empty-separator
صادر شدن هشدار '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
--ignore-comments
کامنتها از محاسبهٔ شباهت حذف میشوند
پیشفرض: True
--ignore-docstrings
رشتههای مستندات (docstringها) از محاسبهٔ شباهت حذف میشوند
پیشفرض: True
--ignore-imports
واردکردنها (imports) از محاسبهٔ شباهت حذف میشوند
پیشفرض: True
--ignore-signatures
امضاها (signatures) از محاسبهٔ شباهت حذف میشوند
پیشفرض: True
--min-similarity-lines
حداقل تعداد خطوط برای یک شباهت.
پیشفرض: 4
نکته: تنها tool.pylint الزامی است، عنوان بخش لازم نیست. اینها مقادیر پیشفرض هستند.
[tool.pylint.similarities] ignore-comments = true ignore-docstrings = true ignore-imports = true ignore-signatures = true min-similarity-lines = 4
بررسیکنندهٔ املا (Spelling Checker)
--max-spelling-suggestions
تعداد پیشنهادهای ارائهشده برای غلطهای املایی را محدود میکند.
پیشفرض: 4
--spelling-dict
نام لغتنامهٔ املایی. لغتنامههای موجود به نصب محلی enchant شما بستگی دارد.
پیشفرض: ""
--spelling-ignore-comment-directives
فهرستی از کلمات جداشده با کاما که در صورت قرار گرفتن در ابتدای یک کامنت، باید بهعنوان دستورالعمل (directive) در نظر گرفته شوند و بررسی نشوند.
پیشفرض: fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy:
--spelling-ignore-words
فهرستی از کلمات جداشده با کاما که نباید بررسی شوند.
پیشفرض: ""
--spelling-private-dict-file
مسیری به فایلی که شامل لغتنامهٔ اختصاصی است؛ یک کلمه در هر خط.
پیشفرض: ""
--spelling-store-unknown-words
تعیین میکند که آیا کلمات ناشناخته به جای صدور پیام، در لغتنامهٔ اختصاصی ذخیره شوند یا خیر (گزینهٔ --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
--check-quote-consistency
این پرچم مشخص میکند که آیا در صورت استفادهٔ ناهمگون از نویسهٔ جداکنندهٔ نقلقول در یک پودمان، هشدار inconsistent-quotes صادر شود یا خیر.
پیشفرض: False
--check-str-concat-over-line-jumps
این پرچم مشخص میکند که آیا برای الحاق ضمنی رشتهها در دنبالههایی که در چندین سطر تعریف شدهاند، هشدار implicit-str-concat صادر شود یا خیر.
پیشفرض: False
نکته: تنها بخش tool.pylint مورد نیاز است و عنوان بخش الزامی نیست. این مقادیر، مقادیر پیشفرض هستند.
[tool.pylint.string] check-quote-consistency = false check-str-concat-over-line-jumps = false
بررسیکنندهٔ بررسی نوع (Typecheck Checker)
--contextmanager-decorators
فهرستی از دکوراتورهایی که مدیر زمینه (context manager) ایجاد میکنند، مانند contextlib.contextmanager. برای ثبت دکوراتورهای دیگری که مدیران زمینهٔ معتبر تولید میکنند، آنها را به این فهرست اضافه کنید.
پیشفرض: ['contextlib.contextmanager']
--generated-members
فهرستی از اعضایی که بهصورت پویا تنظیم شده و توسط سامانهٔ استنتاج pylint شناسایی نمیشوند، بنابراین هنگام دسترسی نباید خطای E1101 را فعال کنند. عبارات باقاعدهٔ پایتون پذیرفته میشوند.
پیشفرض: ()
--ignore-mixin-members
مشخص میکند که آیا اعضای مفقودی که در کلاس mixin مورد دسترسی قرار گرفتهاند باید نادیده گرفته شوند یا خیر. کلاسی mixin در نظر گرفته میشود که نام آن با گزینهٔ mixin-class-rgx مطابقت داشته باشد.
پیشفرض: True
--ignore-none
مشخص میکند که آیا در صورت استنتاج None برای مالک صفت (attribute)، هشداری در مورد اعضای ناموجود صادر شود یا خیر.
پیشفرض: True
--ignore-on-opaque-inference
این پرچم کنترل میکند که آیا pylint باید در صورت بازگردانده شدن یک شیء کدر (opaque) هنگام استنتاج، دربارهٔ no-member و بررسیهای مشابه هشدار دهد یا خیر. فرایند استنتاج میتواند هنگام ارزیابی یک شیء پایتون چندین نتیجهٔ محتمل ارائه دهد، اما ممکن است برخی شاخهها ارزیابی نشوند که به استنتاج جزئی میانجامد. در چنین حالتی، ممکن است همچنان صدور هشدار no-member و سایر بررسیها برای باقی اشیاء استنتاجشده مفید باشد.
پیشفرض: True
--ignored-checks-for-mixins
فهرستی از نامهای نمادین پیامها که باید برای اعضای Mixin نادیده گرفته شوند.
پیشفرض: ['no-member', 'not-async-context-manager', 'not-context-manager', 'attribute-defined-outside-init']
--ignored-classes
فهرستی از نامهای کلاسهایی که صفات عضو آنها نباید بررسی شوند (مفید برای کلاسهایی با صفات تنظیمشده بهصورت پویا). این گزینه از نامهای واجد شرایط (qualified names) پشتیبانی میکند.
پیشفرض: ('optparse.Values', 'thread._local', '_thread._local', 'argparse.Namespace')
--missing-member-hint
هنگامی که نام یک عضو پیدا نمیشود، راهنمایی حاوی نامهای احتمالی را نمایش میدهد. نحوهٔ یافتن این راهنما بر پایهٔ فاصلهٔ ویرایش (edit distance) است.
پیشفرض: True
--missing-member-hint-distance
حداکثر فاصلهٔ ویرایشی که یک نام میتواند داشته باشد تا بهعنوان گزینهای مشابه برای نام عضو مفقود در نظر گرفته شود.
پیشفرض: 1
--missing-member-max-choices
تعداد کل نامهای مشابهی که باید هنگام نمایش راهنما برای یک عضو مفقود مد نظر قرار گیرند.
پیشفرض: 1
--mixin-class-rgx
الگوی عبارت باقاعده (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 = []
بررسیکنندهٔ متغیرها (Variables Checker)
--additional-builtins
فهرستی از نامهای اضافی که فرض میشود در builtins تعریف شدهاند. به یاد داشته باشید که در صورت امکان باید از تعریف builtins جدید خودداری کنید.
پیشفرض: ()
--allow-global-unused-variables
مشخص میکند که آیا متغیرهای سراسری استفادهنشده باید به عنوان تخطی در نظر گرفته شوند یا خیر.
پیشفرض: True
--allowed-redefined-builtins
فهرستی از نامهایی که مجازند بر builtins سایه بیندازند (آنها را shadow کنند)
پیشفرض: ()
--callbacks
فهرستی از رشتهها که میتوانند یک تابع بازخورد (callback) را بر اساس نام شناسایی کنند. نام یک callback باید با یکی از این رشتهها شروع شده یا پایان یابد.
پیشفرض: ('cb_', '_cb')
--dummy-variables-rgx
یک عبارت باقاعده (regular expression) برای تطبیق با نام متغیرهای صوری (dummy)، یعنی متغیرهایی که انتظار نمیرود استفاده شوند.
پیشفرض: _+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_
--ignored-argument-names
نامهای آرگومانی که با این عبارت مطابقت داشته باشند نادیده گرفته خواهند شد.
پیشفرض: re.compile('_.*|^ignored_|^unused_')
--init-import
مشخص میکند که آیا واردکردنهای (import) استفادهنشده در فایلهای __init__ باید بررسی شوند یا خیر.
پیشفرض: False
--redefining-builtins-modules
فهرستی از نامهای واجد شرایط ماژولها (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"]
بررسیکنندهٔ Broad_try_clause
--max-try-statements
حداکثر تعداد دستورهای مجاز در یک عبارت try
پیشفرض: 1
نکته: تنها tool.pylint الزامی است، عنوان بخش لازم نیست. اینها مقادیر پیشفرض هستند.
[tool.pylint.broad_try_clause] max-try-statements = 1
بررسیکنندهٔ Code_style
--max-line-length-suggestions
حداکثر طول خطی که همچنان برای آن پیشنهادها ارائه میشوند. برای جلوگیری از پیشنهادهای اختیاری که ممکن است توسط یک قالببند کد (مانند black) شکسته شوند استفاده میشود. مقدار پیشفرض آن مطابق تنظیمات ``max-line-length`` خواهد بود.
پیشفرض: 0
نکته: تنها tool.pylint الزامی است، عنوان بخش لازم نیست. اینها مقادیر پیشفرض هستند.
[tool.pylint.code_style] max-line-length-suggestions = 0
بررسیکنندهٔ Deprecated_builtins
--bad-functions
فهرستی از نامهای توابع توکار (builtins) که نباید استفاده شوند، جداشده با کاما
پیشفرض: ['map', 'filter']
نکته: تنها tool.pylint الزامی است، عنوان بخش لازم نیست. اینها مقادیر پیشفرض هستند.
[tool.pylint.deprecated_builtins] bad-functions = ["map", "filter"]
بررسیکنندهٔ Dunder
--good-dunder-names
نامهای dunder مناسبی که همیشه باید پذیرفته شوند.
پیشفرض: []
نکته: تنها tool.pylint الزامی است، عنوان بخش لازم نیست. اینها مقادیر پیشفرض هستند.
[tool.pylint.dunder] good-dunder-names = []
بررسیکنندهٔ Magic-value
--valid-magic-values
فهرستی از مقادیر جادویی معتبر که `magic-value-compare` آنها را شناسایی نخواهد کرد. از اعداد صحیح، اعشاری و اعداد منفی پشتیبانی میکند؛ برای رشتهٔ خالی ``''`` را وارد کنید، برای مقادیر دارای بکاسلش تنها از یک بکاسلش استفاده کنید، مانند n.
پیشفرض: (0, -1, 1, '', '__main__')
نکته: تنها tool.pylint الزامی است، عنوان بخش لازم نیست. اینها مقادیر پیشفرض هستند.
[tool.pylint.magic-value] valid-magic-values = [0, -1, 1, "", "__main__"]
--accept-no-param-doc
اینکه آیا فقدان کامل مستندات پارامتر در docstring تابعی که دارای پارامتر است پذیرفته شود یا خیر.
پیشفرض: True
--accept-no-raise-doc
اینکه آیا فقدان کامل مستندات استثناها (raises) در docstring تابعی که استثنا پرتاب میکند پذیرفته شود یا خیر.
پیشفرض: True
--accept-no-return-doc
اینکه آیا فقدان کامل مستندات بازگشت (return) در docstring تابعی که عبارت بازگشتی دارد پذیرفته شود یا خیر.
پیشفرض: True
--accept-no-yields-doc
اینکه آیا فقدان کامل مستندات تولید مقادیر (yields) در docstring یک مولد (generator) پذیرفته شود یا خیر.
پیشفرض: True
--default-docstring-type
اگر نوع 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"
بررسیکنندهٔ Typing
--runtime-typing
اگر برنامه / کتابخانه نیازی به پشتیبانی از دروننگری زمان اجرای حاشیهنویسیهای نوع (type annotations) ندارد، روی ``no`` تنظیم کنید. اگر از حاشیهنویسیهای نوع صرفاً برای بررسی نوع یک برنامه استفاده میکنید، احتمالاً مشکلی نخواهید داشت. برای کتابخانهها، ابتدا ارزیابی کنید که آیا برخی کاربران میخواهند در زمان اجرا به نکات نوع (type hints) دسترسی داشته باشند یا خیر، مثلاً از طریق typing.get_type_hints. برای نسخههای پایتون 3.7 - 3.9 اعمال میشود.
پیشفرض: True
نکته: فقط tool.pylint لازم است، عنوان بخش الزامی نیست. این مقادیر پیشفرض هستند.
[tool.pylint.typing] runtime-typing = true
بررسیکنندهها
قابلیتهای Pylint
گزینهها و سوئیچهای بررسیکنندههای Pylint
بررسیکنندههای Pylint میتوانند سه دسته از امکانات را ارائه دهند:
- گزینههایی که اجرای آنها را کنترل میکنند،
- پیامهایی که میتوانند صادر کنند،
- گزارشهایی که میتوانند تولید کنند.
در زیر فهرستی از تمام بررسیکنندهها و قابلیتهای آنها آمده است.
بررسیکنندهٔ Async
نام دقیق این بررسیکننده async است..SS پیامهای بررسیکننده Async
- yield-inside-async-function (E1700)
- دستور Yield درون تابع async زمانی استفاده میشود که یک دستور yield یا yield from درون یک تابع async یافت شود. این پیام هنگام استفاده از Python < 3.5 نمیتواند صادر شود.
- not-async-context-manager (E1701)
- مدیر بافت ناهمگام '%s' متدهای __aenter__ و __aexit__ را پیادهسازی نمیکند. زمانی استفاده میشود که یک مدیر بافت ناهمگام با شیئی به کار رود که پروتکل مدیریت بافت ناهمگام را پیادهسازی نمیکند. این پیام هنگام استفاده از Python < 3.5 نمیتواند صادر شود.
بررسیکننده Bad-Chained-Comparison
نام دقیق بررسیکننده bad-chained-comparison است.
پیامهای بررسیکننده Bad-Chained-Comparison
- bad-chained-comparison (W3601)
- مقایسه زنجیرهای چندبخشی (%s) مشکوک با استفاده از عملگرهای ناسازگار از نظر معنایی (%s) زمانی استفاده میشود که یک مقایسه زنجیرهای وجود دارد که در آن یک عبارت، بخشی از دو مقایسه است که به گروههای معنایی متفاوتی تعلق دارند ("<" همان معنای "is" را نمیدهد، زنجیرهسازی آنها در عبارت "0 < x is None" احتمالاً یک اشتباه است).
بررسیکننده Basic
نام دقیق بررسیکننده basic است.
همچنین مستندات گزینههای بررسیکننده basic را ببینید: <#basic-options>
پیامهای بررسیکننده Basic
- init-is-generator (E0100)
- متد __init__ یک مولد (generator) است زمانی استفاده میشود که متد ویژه کلاسی __init__ به دلیل وجود yield در بدنه خود به یک مولد تبدیل شده باشد.
- return-in-init (E0101)
- دستور صریح return در __init__ زمانی استفاده میشود که متد ویژه کلاسی __init__ دارای یک مقدار بازگشتی صریح باشد.
- function-redefined (E0102)
- مورد %s از قبل در خط %s تعریف شده است زمانی استفاده میشود که یک تابع / کلاس / متد دوباره تعریف شود.
- not-in-loop (E0103)
- دستور %r بهدرستی درون حلقه قرار نگرفته است زمانی استفاده میشود که کلمات کلیدی break یا continue خارج از یک حلقه به کار روند.
- return-outside-function (E0104)
- دستور Return خارج از تابع زمانی استفاده میشود که یک دستور "return" در خارج از تابع یا متد یافت شود.
- yield-outside-function (E0105)
- دستور Yield خارج از تابع زمانی استفاده میشود که یک دستور "yield" در خارج از تابع یا متد یافت شود.
- return-arg-in-generator (E0106)
- دستور Return همراه با آرگومان درون مولد زمانی استفاده میشود که یک دستور "return" همراه با آرگومان درون یک تابع یا متد مولد (مثلاً دارای چند دستور "yield") پیدا شود. این پیام هنگام استفاده از Python >= 3.3 نمیتواند صادر شود.
- nonexistent-operator (E0107)
- استفاده از عملگر ناموجود %s زمانی استفاده میشود که تلاش کنید از عملگرهای پیشافزایش یا پیشکاهش به سبک زبان C شامل -- و ++ استفاده کنید، در حالی که در Python وجود ندارند.
- duplicate-argument-name (E0108)
- نام آرگومان تکراری %r در تعریف تابع نامهای آرگومان تکراری در تعریف توابع خطای نحوی (SyntaxError) هستند.
- abstract-class-instantiated (E0110)
- کلاس انتزاعی %r با متدهای انتزاعی نمونهسازی شده است زمانی استفاده میشود که از یک کلاس انتزاعی با متاکلاس abc.ABCMeta که دارای متدهای انتزاعی است، نمونهسازی شود.
- bad-reversed-sequence (E0111)
- اولین آرگومان reversed() یک دنباله نیست زمانی استفاده میشود که اولین آرگومان تابع توکار reversed() یک دنباله نباشد (متدهای __reversed__، یا __getitem__ و __len__ را پیادهسازی نکرده باشد).
- too-many-star-expressions (E0112)
- بیش از یک عبارت ستارهدار در انتساب هنگامی صادر میشود که بیش از یک عبارت ستارهدار (*x) در انتساب وجود داشته باشد. این یک SyntaxError است.
- invalid-star-assignment-target (E0113)
- مقصد انتساب ستارهدار باید درون یک لیست یا تاپل باشد هنگامی صادر میشود که یک عبارت ستارهدار به عنوان مقصد انتساب ستارهدار استفاده شود.
- star-needs-assignment-target (E0114)
- عبارت ستارهدار فقط در مقصد انتساب قابل استفاده است هنگامی صادر میشود که از یک عبارت ستارهدار در مقصد انتساب استفاده نشده باشد.
- nonlocal-and-global (E0115)
- نام %r هم nonlocal و هم global است هنگامی صادر میشود که یک نام، هم nonlocal و هم global باشد.
- nonlocal-without-binding (E0117)
- نام nonlocal مربوط به %s بدون انتساب یافت شد هنگامی صادر میشود که یک متغیر nonlocal نام متناظری در دامنههای والد نداشته باشد.
- used-prior-global-declaration (E0118)
- نام %r قبل از اعلان global استفاده شده است هنگامی صادر میشود که یک نام پیش از اعلان global به کار رود، که این عمل از نسخه Python 3.6 منجر به خطا میشود. این پیام هنگام استفاده از Python < 3.6 نمیتواند صادر شود.
- misplaced-format-function (E0119)
- تابع format روی str فراخوانی نشده است هنگامی صادر میشود که تابع format روی شیء str فراخوانی نشود؛ مثلاً اجرای print("value: {}").format(123) به جای print("value: {}".format(123)). این احتمالاً چیزی نبوده که کاربر مد نظر داشته است.
- unreachable (W0101)
- کد دستنیافتنی زمانی استفاده میشود که مقداری کد پس از یک دستور "return" یا "raise" وجود داشته باشد که هرگز اجرا نخواهد شد.
- dangerous-default-value (W0102)
- مقدار پیشفرض خطرناک %s به عنوان آرگومان زمانی استفاده میشود که یک مقدار تغییرپذیر (mutable) مانند list یا dictionary در مقدار پیشفرض یک آرگومان شناسایی شود.
- pointless-statement (W0104)
- به نظر میرسد دستور هیچ تاثیری ندارد زمانی استفاده میشود که یک دستور هیچ اثری نداشته باشد (یا دستکم اینگونه به نظر برسد).
- pointless-string-statement (W0105)
- دستور رشتهای هیچ تاثیری ندارد زمانی استفاده میشود که از یک رشته به عنوان دستور استفاده شود (که طبیعتاً هیچ تاثیری ندارد). این یک مورد خاص از W0104 با پیام مستقل خود است تا در صورت استفاده از این رشتهها به عنوان مستندات به جای کامنت، بتوانید به آسانی آن را غیرفعال کنید.
- expression-not-assigned (W0106)
- عبارت "%s" به چیزی منتسب نشده است زمانی استفاده میشود که عبارتی که فراخوانی تابع نیست، به چیزی منتسب نشود. احتمالاً هدف چیز دیگری بوده است.
- unnecessary-pass (W0107)
- دستور pass غیرضروری زمانی استفاده میشود که یک دستور "pass" بتواند بدون تغییر در رفتار کد حذف شود.
- unnecessary-lambda (W0108)
- عبارت Lambda ممکن است غیرضروری باشد زمانی استفاده میشود که بدنه یک عبارت lambda یک فراخوانی تابع با همان فهرست آرگومانهای خودِ lambda باشد؛ چنین عبارات lambda در اکثر موارد، با تابعی که درون بدنه فراخوانی میشود قابل جایگزینی هستند.
- duplicate-key (W0109)
- کلید تکراری %r در دیکشنری زمانی استفاده میشود که یک عبارت دیکشنری، یک کلید یکسان را چندین بار مقید (bind) کند.
- useless-else-on-loop (W0120)
- بند else در حلقهای بدون دستور break؛ بند else را حذف کرده و دندانهگذاری کدهای درون آن را بردارید حلقهها تنها در صورتی باید بند else داشته باشند که امکان خروج زودهنگام از آنها با دستور break وجود داشته باشد؛ در غیر این صورت دستورات زیر else باید در همان دامنه خودِ حلقه قرار گیرند.
- exec-used (W0122)
- استفاده از exec هنگامی صادر میشود که از دستور 'exec' استفاده شود. استفاده از این تابع برای ورودی کاربر خطرناک است و همچنین بهطور کلی کندتر از کد واقعی است. این بدان معنا نیست که هرگز نباید از آن استفاده کنید، بلکه ابتدا باید گزینههای جایگزین را در نظر گرفته و توابع در دسترس را محدود کنید.
- eval-used (W0123)
- استفاده از eval زمانی استفاده میشود که از تابع "eval" استفاده کنید، تا شما را از به کار بردن آن منصرف کند. برای ارزیابی ایمن رشتههای حاوی عبارتهای Python از منابع غیرقابل اعتماد، استفاده از ast.literal_eval را در نظر داشته باشید.
- confusing-with-statement (W0124)
- قرار گرفتن مدیر بافت دیگر پس از "as" شبیه به یک تاپل به نظر میرسد. هنگامی صادر میشود که یکی از اجزای دستور with چندین مقدار برگرداند و از انتساب نام با as فقط برای بخشی از این مقادیر استفاده کند، مانند with ctx() as a, b. این امر میتواند گمراهکننده باشد، زیرا مشخص نیست که آیا مدیر بافت یک تاپل برمیگرداند یا اینکه گره فاقد انتساب نام، خودش یک مدیر بافت دیگر است..TP using-constant-test (W0125) استفاده از یک دستور شرطی با یک مقدار ثابت هنگامی صادر میشود که یک دستور شرطی (If یا if سهتایی) از یک مقدار ثابت برای آزمون خود استفاده کند. این ممکن است آن چیزی نباشد که کاربر قصد انجامش را داشته است.
- missing-parentheses-for-call-in-test (W0126)
- استفاده از عبارت شرطی با فراخوانی احتمالاً نادرست تابع یا متد به دلیل نبود پرانتز هنگامی صادر میشود که به نظر برسد یک عبارت شرطی (If یا if سهتایی) به دلیل نبود پرانتز، یک تابع را به نادرستی فراخوانی میکند.
- self-assigning-variable (W0127)
- انتساب متغیر %r به خودش هنگامی صادر میشود که تشخیص دهیم یک متغیر به خودش منتسب شده است.
- redeclared-assigned-name (W0128)
- تعریف مجدد متغیر %r در انتساب هنگامی صادر میشود که تشخیص دهیم یک متغیر در همان انتساب دوباره تعریف شده است.
- assert-on-string-literal (W0129)
- دستور assert دارای یک رشته لیترال به عنوان آرگومان نخست خود است. این assert به صورت %s با شکست مواجه خواهد شد. زمانی استفاده میشود که یک دستور assert یک رشته لیترال را به عنوان آرگومان نخست خود داشته باشد، که باعث میشود assert همیشه با موفقیت سپری شود (pass).
- duplicate-value (W0130)
- مقدار تکراری %r در مجموعه (set) این پیام زمانی صادر میشود که یک set شامل یک مقدار یکسان به تعداد دو یا چند بار باشد.
- named-expr-without-context (W0131)
- استفاده از عبارت نامگذاریشده (named expression) بدون بافتار (context) هنگامی صادر میشود که از یک عبارت نامگذاریشده برای انجام یک انتساب معمولی در خارج از بافتارهایی مانند if، for، while یا یک comprehension استفاده شده باشد.
- pointless-exception-statement (W0133)
- دستور استثنا (exception) هیچ اثری ندارد زمانی به کار میرود که یک استثنا بدون اینکه منتسب شود، برانگیخته (raise) گردد، یا برای استفاده بعدی در جای دیگر بازگردانده (return) شود، ایجاد گردد.
- return-in-finally (W0134)
- دستور 'return' توسط بند 'finally' سایهاندازی شده است. هنگامی صادر میشود که یک دستور 'return' در یک بلوک 'finally' یافت شود. این کار مقدار بازگشتی تابع را بازنویسی خواهد کرد و باید از آن اجتناب شود.
- contextmanager-generator-missing-cleanup (W0135)
- از context استفادهشده در تابع %r خارج نخواهد شد. زمانی استفاده میشود که یک contextmanager درون یک تابع ژنراتور به کار رود و پاکسازی (cleanup) مدیریت نشده باشد.
- continue-in-finally (W0136)
- استفاده از 'continue' درون بند 'finally' توصیه نمیشود هنگامی صادر میشود که کلمه کلیدی continue در داخل یک بند finally یافت شود. این مورد از پایتون ۳.۱۴ به بعد یک SyntaxWarning صادر خواهد کرد.
- break-in-finally (W0137)
- استفاده از 'break' درون بند 'finally' توصیه نمیشود هنگامی صادر میشود که کلمه کلیدی break در داخل یک بند finally یافت شود. این مورد از پایتون ۳.۱۴ به بعد یک SyntaxWarning صادر خواهد کرد.
- comparison-with-callable (W0143)
- مقایسه با یک شیء فراخوانپذیر (callable)، آیا پرانتزها را جا انداختهاید؟ این پیام زمانی صادر میشود که pylint تشخیص دهد مقایسهای با یک شیء فراخوانپذیر انجام شده است، که میتواند نشان دهد پرانتزها جا افتادهاند و منجر به رفتارهای ناخواسته احتمالی میشود.
- lost-exception (W0150)
- دستور %s در بلوک finally ممکن است استثنا را ببلعد زمانی استفاده میشود که یک دستور break یا return در داخل بند finally از یک بلوک try...finally یافت شود: استثناهای برانگیختهشده در بند try بهجای برانگیختهشدن دوباره (re-raise)، بیصدا بلعیده خواهند شد.
- nan-comparison (W0177)
- مقایسه %s باید %s باشد زمانی استفاده میشود که یک عبارت با مقادیر NaN مانند numpy.NaN و float('nan') مقایسه شود.
- assert-on-tuple (W0199)
- دستور assert روی یک تاپل پر فراخوانی شده است. آیا منظورتان 'assert x,y' بوده است؟ فراخوانی assert روی یک تاپل در صورتی که تاپل خالی نباشد همیشه به درستی (true)، و اگر خالی باشد همیشه به نادرستی (false) ارزیابی میشود.
- literal-comparison (R0123)
- در '%s'، هنگام مقایسه لیترالهای ثابت از '%s' استفاده کنید نه '%s' ('%s') هنگام مقایسه یک شیء با یک لیترال استفاده میشود، که معمولاً کاری نیست که بخواهید انجام دهید، زیرا در مجموع ممکن است با لیترالی متفاوت از آنچه مورد انتظار بود مقایسه شود.
- comparison-with-itself (R0124)
- مقایسه زائد - %s زمانی استفاده میشود که چیزی با خودش مقایسه شود.
- comparison-of-constants (R0133)
- مقایسه میان مقادیر ثابت: "%s %s %s" دارای یک مقدار ثابت است هنگامی که دو لیترال با یکدیگر مقایسه میشوند، نتیجه یک مقدار ثابت است. استفاده مستقیم از مقدار ثابت هم خوانایی بهتری دارد و هم عملکرد بهتری را ارائه میدهد. مقداردهی اولیه 'True' و 'False' از این طریق، از زمان پایتون ۲.۳ دیگر الزامی نیست.
- invalid-name (C0103)
- نام %s با عنوان "%s" با %s مطابقت ندارد زمانی استفاده میشود که نام با قوانین نامگذاری مرتبط با نوع آن (ثابت، متغیر، کلاس...) مطابقت نداشته باشد.
- disallowed-name (C0104)
- نام غیرمجاز "%s" زمانی استفاده میشود که نام با bad-names یا bad-names-rgxs- (نامهای غیرمجاز) مطابقت داشته باشد.
- typevar-name-incorrect-variance (C0105)
- نام متغیر نوع وردایی (variance) را بازتاب نمیدهد%s هنگامی صادر میشود که نام یک TypeVar وردایی نوع خود را بازتاب ندهد. طبق PEP8، توصیه میشود پسوندهای '_co' و '_contra' به ترتیب به متغیرهایی اضافه شوند که برای اعلان رفتارهای هموردا (covariant) یا پادوردا (contravariant) استفاده میشوند. متغیرهای ناوردا (invariant یا پیشفرض) نیازی به پسوند ندارند. این پیام همچنین زمانی صادر میشود که متغیرهای ناوردا دارای پسوند باشند.
- empty-docstring (C0112)
- docstring خالی برای %s زمانی استفاده میشود که یک ماژول، تابع، کلاس یا متد دارای docstring خالی باشد (دیگر خیلی ساده میشد ;).
- missing-module-docstring (C0114)
- docstring ماژول وجود ندارد زمانی استفاده میشود که یک ماژول فاقد docstring باشد. ماژولهای خالی نیازی به docstring ندارند.
- missing-class-docstring (C0115)
- docstring کلاس وجود ندارد زمانی استفاده میشود که یک کلاس فاقد docstring باشد. حتی یک کلاس خالی نیز باید دارای docstring باشد.
- missing-function-docstring (C0116)
- docstring تابع یا متد وجود ندارد زمانی استفاده میشود که یک تابع یا متد فاقد docstring باشد. برخی متدهای خاص مانند __init__ نیازی به docstring ندارند.
- singleton-comparison (C0121)
- مقایسه %s باید %s باشد زمانی استفاده میشود که یک عبارت با مقادیر یگانه (singleton) مانند True، False یا None مقایسه شود.
- unidiomatic-typecheck (C0123)
- برای بررسی نوع، بهجای ()type از ()isinstance استفاده کنید. روش اصطلاحی (idiomatic) برای انجام بررسی صریح نوع در پایتون، استفاده از isinstance(x, Y) به جای type(x) == Y یا type(x) is Y است. گرچه شرایط غیرمعمولی نیز وجود دارد که این دو نتایج متفاوتی به دست میدهند.
- typevar-double-variance (C0131)
- TypeVar نمیتواند همزمان هم covariant و هم contravariant باشد هنگامی صادر میشود که هر دو آرگومان کلمهکلیدی "covariant" و "contravariant" در یک TypeVar روی "True" تنظیم شده باشند.
- typevar-name-mismatch (C0132)
- نام TypeVar با عنوان "%s" با نام متغیر منتسبشده "%s" مطابقت ندارد هنگامی صادر میشود که یک TypeVar به متغیری منتسب شود که با آرگومان نام آن مطابقت نداشته باشد.
- RP0101
- آمار بر پایه نوع
وارسیگر Classes (Classes checker)
نام دقیق این وارسیگر classes است.
همچنین مستندات گزینههای وارسیگر classes را ببینید <#classes-options>
پیامهای وارسیگر Classes (Classes checker Messages)
- method-hidden (E0202)
- مشخصهای که در %s سطر %s تعریف شده این متد را پنهان میکند هنگامی استفاده میشود که کلاسی متدی را تعریف کند که توسط یک مشخصهٔ نمونه از یک کلاس نیاکان یا تنظیمشده توسط کد کلاینت، پنهان شده باشد.
- access-member-before-definition (E0203)
- دسترسی به عضو %r پیش از سطر تعریف آن %s هنگامی استفاده میشود که به یک عضو نمونه، پیش از مقداردهی واقعی آن دسترسی پیدا شود.
- no-method-argument (E0211)
- متد %r هیچ آرگومانی ندارد هنگامی استفاده میشود که برای متدی که باید نمونهٔ مقیدشده را به عنوان نخستین آرگومان داشته باشد، هیچ آرگومانی تعریف نشده باشد.
- no-self-argument (E0213)
- متد %r باید "self" را به عنوان نخستین آرگومان داشته باشد هنگامی استفاده میشود که متدی آرگومانی متفاوت با "self" به عنوان نخستین آرگومان داشته باشد. این مورد به عنوان خطا در نظر گرفته میشود زیرا چنان قرارداد رایجی است که نباید آن را نقض کنید!
- invalid-slots-object (E0236)
- شیء نامعتبر %r در __slots__، باید تنها شامل رشتههای غیرخالی باشد هنگامی استفاده میشود که یک شیء نامعتبر (غیررشتهای) در __slots__ وجود داشته باشد.
- assigning-non-slot (E0237)
- انتساب به مشخصهٔ %r که در slots کلاس تعریف نشده است هنگامی استفاده میشود که مقداری به یک مشخصه که در slots کلاس تعریف نشده است انتساب یابد.
- invalid-slots (E0238)
- شیء __slots__ نامعتبر است هنگامی استفاده میشود که __slots__ نامعتبر در کلاس یافت شود. تنها یک رشته، یک تکرارپذیر یا یک دنباله مجاز است.
- inherit-non-class (E0239)
- ارثبری از %r، که یک کلاس نیست. هنگامی استفاده میشود که یک کلاس از چیزی که کلاس نیست ارثبری کند.
- inconsistent-mro (E0240)
- ترتیب تفکیک متد (MRO) ناسازگار برای کلاس %r هنگامی استفاده میشود که یک کلاس ترتیب تفکیک متد ناسازگاری داشته باشد.
- duplicate-bases (E0241)
- کلاسهای پایهٔ تکراری برای کلاس %r استفادهٔ مجدد و تکراری از کلاسهای پایه در کلاسهای مشتقشده موجب بروز TypeError میشود.
- class-variable-slots-conflict (E0242)
- مقدار %r در slots با متغیر کلاس تداخل دارد هنگامی استفاده میشود که مقداری در __slots__ با یک متغیر کلاس، ویژگی (property) یا متد تداخل داشته باشد.
- invalid-class-object (E0243)
- انتساب نامعتبر به '__class__'. باید یک تعریف کلاس باشد اما '%s' دریافت شد هنگامی استفاده میشود که یک شیء نامعتبر به ویژگی __class__ انتساب یابد. تنها یک کلاس مجاز است.
- invalid-enum-extension (E0244)
- توسعه دادن کلاس شمارشی (Enum) ارثبریشدهٔ "%s" هنگامی استفاده میشود که یک کلاس تلاش کند کلاس شمارشی (Enum) ارثبریشدهای را توسعه دهد. انجام این کار در زمان اجرا موجب بروز TypeError خواهد شد.
- declare-non-slot (E0245)
- چنین نامی %r در __slots__ وجود ندارد هنگامی صادر میشود که یک یادداشت نوع (type annotation) در یک کلاس، در فهرست نامهای موجود در __slots__ غایب باشد و __slots__ نیز شامل یک مدخل __dict__ نباشد.
- non-iterator-returned (E0301)
- __iter__ یک غیرتکرارگر برمیگرداند هنگامی استفاده میشود که متد __iter__ چیزی را برگرداند که یک تکرارپذیر نباشد (یعنی فاقد متد __next__ باشد)
- unexpected-special-method-signature (E0302)
- متد خاص %r انتظار %s پارامتر را دارد، %d %s داده شده است هنگامی صادر میشود که یک متد خاص با تعداد نامعتبری از پارامترها تعریف شده باشد. اگر تعداد آنها بسیار کم یا بسیار زیاد باشد، ممکن است متد اصلاً کار نکند.
- invalid-length-returned (E0303)
- __len__ یک عدد صحیح غیرمنفی برنمیگرداند هنگامی استفاده میشود که متد __len__ چیزی برگرداند که یک عدد صحیح غیرمنفی نباشد
- invalid-bool-returned (E0304)
- __bool__ مقدار bool برنمیگرداند هنگامی استفاده میشود که متد __bool__ چیزی برگرداند که bool نباشد
- invalid-index-returned (E0305)
- __index__ مقدار int برنمیگرداند هنگامی استفاده میشود که متد __index__ چیزی برگرداند که یک عدد صحیح نباشد
- invalid-repr-returned (E0306)
- __repr__ مقدار str برنمیگرداند هنگامی استفاده میشود که متد __repr__ چیزی برگرداند که یک رشته نباشد
- invalid-str-returned (E0307)
- __str__ مقدار str برنمیگرداند هنگامی استفاده میشود که متد __str__ چیزی برگرداند که یک رشته نباشد
- invalid-bytes-returned (E0308)
- __bytes__ مقدار bytes برنمیگرداند هنگامی استفاده میشود که متد __bytes__ چیزی برگرداند که bytes نباشد
- invalid-hash-returned (E0309)
- __hash__ مقدار int برنمیگرداند هنگامی استفاده میشود که متد __hash__ چیزی برگرداند که یک عدد صحیح نباشد
- invalid-length-hint-returned (E0310)
- __length_hint__ یک عدد صحیح غیرمنفی برنمیگرداند هنگامی استفاده میشود که متد __length_hint__ چیزی برگرداند که یک عدد صحیح غیرمنفی نباشد
- invalid-format-returned (E0311)
- __format__ مقدار str برنمیگرداند هنگامی استفاده میشود که متد __format__ چیزی برگرداند که یک رشته نباشد
- invalid-getnewargs-returned (E0312)
- __getnewargs__ یک چندتایی (tuple) برنمیگرداند هنگامی استفاده میشود که متد __getnewargs__ چیزی برگرداند که یک تاپل نباشد
- invalid-getnewargs-ex-returned (E0313)
- __getnewargs_ex__ یک تاپل شامل (tuple, dict) برنمیگرداند هنگامی استفاده میشود که متد __getnewargs_ex__ چیزی برگرداند که به فرم tuple(tuple, dict) نباشد
- attribute-defined-outside-init (W0201)
- مشخصهٔ %r بیرون از __init__ تعریف شده است هنگامی استفاده میشود که یک مشخصهٔ نمونه در خارج از متد __init__ تعریف شود.
- bad-staticmethod-argument (W0211)
- متد ایستا با %r به عنوان نخستین آرگومان هنگامی استفاده میشود که یک متد ایستا دارای "self" یا مقداری مشخصشده در گزینهٔ valid-classmethod-first-arg یا گزینهٔ valid-metaclass-classmethod-first-arg به عنوان نخستین آرگومان باشد.
- protected-access (W0212)
- دسترسی به عضو محافظتشدهٔ %s از یک کلاس کلاینت هنگامی استفاده میشود که به یک عضو محافظتشده (یعنی عضو کلاسی با نامی که با یک زیرخط آغاز میشود) در خارج از کلاس یا نوادگان کلاسی که در آن تعریف شده، دسترسی پیدا شود.
- implicit-flag-alias (W0213)
- عضو پرچم %(overlap)s جایگاههای بیتی مشترکی با %(sources)s دارد هنگامی استفاده میشود که چندین مقدار عدد صحیح تعریفشده درون یک کلاس enum.IntFlag، در یک جایگاه بیتی مشترک سهیم باشند.
- arguments-differ (W0221)
- متد %s %s %r هنگامی استفاده میشود که متدی تعداد آرگومان متفاوتی نسبت به رابط پیادهسازیشده یا متد بازنویسیشده داشته باشد. آرگومانهای اضافی دارای مقدار پیشفرض نادیده گرفته میشوند.
- signature-differs (W0222)
- امضا با متد %s %r متفاوت است هنگامی استفاده میشود که امضای متد با رابط پیادهسازیشده یا متد بازنویسیشده متفاوت باشد.
- abstract-method (W0223)
- متد %r در کلاس %r انتزاعی است اما در کلاس فرزند %r بازنویسی نشده است هنگامی استفاده میشود که یک متد انتزاعی (یعنی با صادر کردن NotImplementedError) در یک کلاس واقعی (concrete) بازنویسی نشده باشد.
- super-init-not-called (W0231)
- متد __init__ از کلاس پایهٔ %r فراخوانی نشده است هنگامی استفاده میشود که کلاس نیاکان دارای متد __init__ باشد که توسط کلاس مشتقشده فراخوانی نشده است.
- non-parent-init-called (W0233)
- متد __init__ از یک کلاس پایهٔ غیرمستقیم %r فراخوانی شده است هنگامی استفاده میشود که متد __init__ روی کلاسی فراخوانی شود که در میان نیاکان مستقیم کلاسِ تحلیلشده قرار ندارد..TP invalid-overridden-method (W0236) انتظار میرفت متد %r بهصورت %r باشد، اما در عوض %r یافت شد زمانی استفاده میشود که تشخیص داده شود متدی به روشی بازنویسی شده است که با کلاس پایهٔ آن مطابقت ندارد و میتواند منجر به بروز باگهای احتمالی در زمان اجرا شود.
- arguments-renamed (W0237)
- %s %s متد %r زمانی استفاده میشود که نام پارامتر یک متد با نام آن در رابط (interface) پیادهسازیشده یا در یک متد بازنویسیشده متفاوت باشد.
- unused-private-member (W0238)
- عضو خصوصی استفادهنشدهٔ `%s.%s` زمانی صادر میشود که یک عضو خصوصی از یک کلاس تعریف شده باشد اما مورد استفاده قرار نگیرد.
- overridden-final-method (W0239)
- متد %r متدی تعریفشده در کلاس %r را که با typing.final تزیین شده است بازنویسی میکند زمانی استفاده میشود که متدی تزیینشده با typing.final بازنویسی شده باشد.
- subclassed-final-class (W0240)
- کلاس %r زیرکلاسی از یک کلاس تزیینشده با typing.final است: %r زمانی استفاده میشود که از کلاسی تزیینشده با typing.final زیرکلاس ساخته شده باشد.
- redefined-slots-in-subclass (W0244)
- اسلاتهای بازتعریفشدهٔ %r در زیرکلاس زمانی استفاده میشود که یک اسلات در یک زیرکلاس دوباره تعریف شده باشد.
- super-without-brackets (W0245)
- فراخوانی super بدون پرانتز زمانی استفاده میشود که فراخوانی super فاقد پرانتز باشد و از این رو یک فراخوانی واقعی نبوده و طبق انتظار عمل نکند.
- useless-parent-delegation (W0246)
- تفویض بیهوده به والد یا ()super در متد %r زمانی استفاده میشود که بتوان تشخیص داد یک متد بازنویسیشده بیهوده است و با تکیه بر تفویض به والد یا ()super همان کاری را انجام میدهد که متد دیگری از MRO انجام میدهد.
- no-classmethod-decorator (R0202)
- استفاده از دکوراتور را بهجای فراخوانی classmethod در نظر بگیرید زمانی استفاده میشود که یک متد کلاسی بدون استفاده از ساختار دکوراتور تعریف شده باشد.
- no-staticmethod-decorator (R0203)
- استفاده از دکوراتور را بهجای فراخوانی staticmethod در نظر بگیرید زمانی استفاده میشود که یک متد ایستا بدون استفاده از ساختار دکوراتور تعریف شده باشد.
- useless-object-inheritance (R0205)
- کلاس %r از object ارثبری میکند، در python3 میتوان آن را با اطمینان از پایهها حذف کرد زمانی استفاده میشود که یک کلاس از object ارثبری کند، که در python3 ضمنی است، بنابراین میتوان آن را با اطمینان از کلاسهای پایه حذف کرد.
- property-with-parameters (R0206)
- نمیتوان برای ویژگیها (properties) پارامتر تعریف کرد زمانی استفاده میشود که تشخیص داده شود یک ویژگی دارای پارامتر نیز هست، که بیفایده است زیرا ویژگیها را نمیتوان با آرگومانهای اضافی فراخوانی کرد.
- bad-classmethod-argument (C0202)
- متد کلاسی %s باید %s را به عنوان آرگومان نخست داشته باشد زمانی استفاده میشود که نام آرگومان نخست یک متد کلاسی با مقدار مشخصشده در گزینهٔ valid-classmethod-first-arg (پیشفرض "cls") متفاوت باشد؛ رعایت این مورد برای تمایز آسان آنها از متدهای معمولی نمونه توصیه میشود.
- bad-mcs-method-argument (C0203)
- متد متاکلاس %s باید %s را به عنوان آرگومان نخست داشته باشد زمانی استفاده میشود که نام آرگومان نخست یک متد متاکلاس با مقدار مشخصشده در گزینهٔ valid-classmethod-first-arg (پیشفرض "cls") متفاوت باشد؛ رعایت این مورد برای تمایز آسان آنها از متدهای معمولی نمونه توصیه میشود.
- bad-mcs-classmethod-argument (C0204)
- متد کلاسی متاکلاس %s باید %s را به عنوان آرگومان نخست داشته باشد زمانی استفاده میشود که نام آرگومان نخست یک متد کلاسی متاکلاس با مقدار مشخصشده در گزینهٔ valid-metaclass-classmethod-first-arg (پیشفرض "mcs") متفاوت باشد؛ رعایت این مورد برای تمایز آسان آنها از متدهای معمولی نمونه توصیه میشود.
- single-string-used-for-slots (C0205)
- ویژگی __slots__ کلاس باید یک شیء پیمایشپذیر غیررشتهای باشد زمانی استفاده میشود که __slots__ کلاس بهجای یک شیء پیمایشپذیر، یک رشتهٔ ساده باشد.
- method-check-failed (F0202)
- ناتوان در
بررسی
امضای
متدها (%s / %s)
زمانی
استفاده
میشود که Pylint
به دلیلی
غیرمنتظره
قادر به
بررسی
سازگاری
امضای
متدها
نبوده باشد.
لطفاً در
صورت
مشاهدهٔ
این مورد،
آن را گزارش
دهید.
نام دقیق این بررسیکننده dataclass است.
پیامهای بررسیکننده Dataclass (Dataclass checker Messages)
- invalid-field-call (E3701)
- Invalid usage of field(), %s مشخصکنندهٔ dataclasses.field() تنها باید به عنوان مقدار یک انتساب درون یک dataclass، یا درون تابع make_dataclass() استفاده شود.
بررسیکننده طراحی (Design checker)
نام دقیق این بررسیکننده design است.
همچنین مستندات گزینههای بررسیکنندهٔ design را ببینید: <#design-options>
پیامهای بررسیکننده طراحی (Design checker Messages)
- too-many-ancestors (R0901)
- Too many ancestors (%s/%s) هنگامی استفاده میشود که کلاس بیش از حد کلاسهای والد (اجداد) داشته باشد؛ تلاش کنید آن را کاهش دهید تا به کلاسی سادهتر (و در نتیجه با کاربرد آسانتر) دست یابید.
- too-many-instance-attributes (R0902)
- Too many instance attributes (%s/%s) هنگامی استفاده میشود که کلاس بیش از حد مشخصههای نمونه داشته باشد؛ تلاش کنید آن را کاهش دهید تا به کلاسی سادهتر (و در نتیجه با کاربرد آسانتر) دست یابید.
- too-few-public-methods (R0903)
- Too few public methods (%s/%s) هنگامی استفاده میشود که کلاس متدهای عمومی بسیار کمی دارد؛ بنابراین مطمئن شوید که واقعاً ارزشش را دارد.
- too-many-public-methods (R0904)
- Too many public methods (%s/%s) هنگامی استفاده میشود که کلاس متدهای عمومی بیش از حد داشته باشد؛ تلاش کنید آن را کاهش دهید تا به کلاسی سادهتر (و در نتیجه با کاربرد آسانتر) دست یابید.
- too-many-return-statements (R0911)
- Too many return statements (%s/%s) هنگامی استفاده میشود که یک تابع یا متد بیش از حد دستور بازگشت (return) داشته باشد که دنبال کردن آن را دشوار میکند.
- too-many-branches (R0912)
- Too many branches (%s/%s) هنگامی استفاده میشود که یک تابع یا متد بیش از حد شاخه داشته باشد که دنبال کردن آن را دشوار میکند.
- too-many-arguments (R0913)
- Too many arguments (%s/%s) هنگامی استفاده میشود که یک تابع یا متد بیش از حد آرگومان بپذیرد.
- too-many-locals (R0914)
- Too many local variables (%s/%s) هنگامی استفاده میشود که یک تابع یا متد بیش از حد متغیر محلی داشته باشد.
- too-many-statements (R0915)
- Too many statements (%s/%s) هنگامی استفاده میشود که یک تابع یا متد بیش از حد دستور داشته باشد. در این صورت باید آن را به توابع یا متدهای کوچکتر تقسیم کنید.
- too-many-boolean-expressions (R0916)
- Too many boolean expressions in if statement (%s/%s) هنگامی استفاده میشود که یک دستور if شامل عبارتهای بولی بیش از حد باشد.
- too-many-positional-arguments (R0917)
- Too many positional arguments (%s/%s) هنگامی استفاده میشود که یک تابع بیش از حد آرگومان مکانی بپذیرد.
بررسیکننده استثناها (Exceptions checker)
نام دقیق این بررسیکننده exceptions است.
همچنین مستندات گزینههای بررسیکنندهٔ exceptions را ببینید: <#exceptions-options>
پیامهای بررسیکننده استثناها (Exceptions checker Messages)
- bad-except-order (E0701)
- Bad except clauses order (%s) هنگامی استفاده میشود که بندهای except به ترتیب درست (از خاصترین به عمومیترین) قرار نگرفته باشند. اگر این ترتیب را اصلاح نکنید، ممکن است برخی استثناها توسط گردانندهٔ خاصتر گرفته نشوند.
- raising-bad-type (E0702)
- Raising %s while only classes or instances are allowed هنگامی استفاده میشود که چیزی که نه یک کلاس و نه یک نمونه است برانگیخته (raise) شود (یعنی یک TypeError برانگیخته خواهد شد).
- misplaced-bare-raise (E0704)
- The raise statement is not inside an except clause هنگامی استفاده میشود که یک دستور raise خالی درون یک بند except به کار نرفته باشد. این کار خطا ایجاد میکند، زیرا هیچ استثنای فعالی برای ایجاد مجدد (re-raise) وجود ندارد. یک استثنا بر این قاعده، raise خالی درون یک بند finally است که تا زمانی که استثنایی درون بلوک try ایجاد شده باشد ممکن است کار کند، اما با این وجود یک بوی بد کد (code smell) است و نباید به آن اتکا کرد.
- bad-exception-cause (E0705)
- Exception cause set to something which is not an exception, nor None هنگامی استفاده میشود که از نحو "raise ... from ..." استفاده شود، در حالی که علت استثنا نه یک استثنا است و نه None.
- raising-non-exception (E0710)
- Raising a class which doesn't inherit from BaseException هنگامی استفاده میشود که کلاسی برانگیخته (raise) شود که از BaseException ارثبری نمیکند.
- notimplemented-raised (E0711)
- NotImplemented raised - should raise NotImplementedError هنگامی استفاده میشود که به جای NotImplementedError مقدار NotImplemented برانگیخته (raise) شود.
- catching-non-exception (E0712)
- Catching an exception which doesn't inherit from Exception: %s هنگامی استفاده میشود که کلاسی که از Exception ارثبری نمیکند به عنوان استثنا در یک بند except استفاده شود.
- bare-except (W0702)
- No exception type(s) specified یک بند خالی except: استثناهای SystemExit و KeyboardInterrupt را دریافت خواهد کرد که این کار متوقف کردن برنامه با Control-C را دشوارتر ساخته و میتواند مشکلات دیگر را پنهان کند. اگر میخواهید تمام استثناهایی را که بیانگر خطاهای برنامه هستند دریافت کنید، از except Exception: استفاده نمایید (except خالی معادل except BaseException: است).
- duplicate-except (W0705)
- Catching previously caught exception type %s هنگامی استفاده میشود که یک except نوعی را دریافت کند که پیشتر توسط یک گردانندهٔ قبلی گرفته شده است.
- try-except-raise (W0706)
- The except handler raises immediately هنگامی استفاده میشود که یک گردانندهٔ except از raise به عنوان اولین یا تنها عملگر خود استفاده کند. این کار بیهوده است زیرا بلافاصله استثنا را دوباره برمیانگیزد. عملگر raise یا کل بلوک try-except-raise را حذف کنید!
- raise-missing-from (W0707)
- Consider explicitly re-raising using %s'%s from %s' زنجیرهسازی استثناها (exception chaining) در Python ردپای پشتهٔ (traceback) استثنای فعلی و همچنین استثنای اصلی را نشان میدهد. هنگامی که پس از دریافت یک استثنا، استثنای جدیدی برمیانگیزید، محتمل است که استثنای دوم بستهبندی مجدد و مناسبتری از استثنای اول باشد. در چنین مواردی، raise from پیوند بهتری را بین دو traceback در خطای نهایی برقرار میکند.
- binary-op-exception (W0711)
- Exception to catch is the result of a binary "%s" operation هنگامی استفاده میشود که استثنای مورد نظر برای دریافت، به فرم "except A or B:" باشد. اگر قصد دریافت چندین استثنا را دارید، آن را به صورت "except (A, B):" بازنویسی کنید.
- raising-format-tuple (W0715)
- Exception arguments suggest string formatting might be intended هنگامی استفاده میشود که چندین آرگومان به سازندهٔ استثنا ارسال شود که نخستین آنها یک لیترال رشتهای حاوی مواردی است که به نظر میرسد جایگزینهایی برای قالببندی باشند.
- wrong-exception-operation (W0716)
- Invalid exception operation. %s هنگامی استفاده میشود که عملیاتی روی یک استثنا انجام شود، اما آن عملیات برای استثنای مد نظر معتبر نباشد. معمولاً هنگام وجود عملیات دودویی میان استثناها در گردانندههای except صادر میشود.
- broad-exception-caught (W0718)
- Catching too general exception %s اگر از یک بند سادهٔ except Exception: استفاده کنید، ممکن است در نهایت استثناهایی غیر از مواردی که انتظارش را دارید دریافت کنید. این کار میتواند باگها را مخفی کند یا با پنهان کردن خطاهای غیرمرتبط، اشکالزدایی برنامهها را دشوارتر سازد.
- broad-exception-raised (W0719)
- Raising too general exception: %s
برانگیختن
استثناهایی
که بیش از
حد عمومی
هستند، شما
را وادار
میکند تا
استثناها
را نیز به
صورت عمومی
دریافت
کنید. این
امر شما را
ناچار به
استفاده از
یک بند
سادهٔ except Exception:
خواهد کرد؛
آنگاه
ممکن است در
نهایت
استثناهایی
به جز موارد
مورد
نظرتان را
دریافت
کنید. این
کار
میتواند
باگها را
مخفی کند یا
با پنهان
کردن
خطاهای
غیرمرتبط،
اشکالزدایی
برنامهها
را دشوارتر
سازد.
نام دقیق این بررسیکننده format است.
همچنین مستندات گزینههای بررسیکننده format را ببینید: <#format-options>
پیامهای بررسیکننده قالببندی (Format checker Messages)
- unnecessary-semicolon (W0301)
- نقطهویرگول غیرضروری زمانی استفاده میشود که یک دستور با نقطهویرگول (";") پایان یابد، که نیازی به آن نیست (این python است، نه C ;).
- bad-indentation (W0311)
- دندانهگذاری نادرست. مقدار %s %s یافت شد، مورد انتظار: %s زمانی استفاده میشود که تعداد غیرمنتظرهای از نویسههای تب یا فاصلههای دندانهگذاری یافت شود.
- line-too-long (C0301)
- خط بسیار طولانی (%s/%s) زمانی استفاده میشود که یک خط از تعداد معینی نویسه طولانیتر باشد.
- too-many-lines (C0302)
- خطوط بیش از حد در پودمان (%s/%s) زمانی استفاده میشود که یک پودمان خطوط بسیار زیادی داشته باشد و خوانایی آن کاهش یابد.
- trailing-whitespace (C0303)
- فاصلههای خالی انتهای خط زمانی استفاده میشود که بین پایان خط و نویسه خط جدید، فاصله خالی وجود داشته باشد.
- missing-final-newline (C0304)
- خط جدید پایانی وجود ندارد زمانی استفاده میشود که آخرین خط یک فایل فاقد خط جدید باشد.
- trailing-newlines (C0305)
- خطهای جدید انتهایی زمانی استفاده میشود که خطوط خالی اضافی در انتهای فایل وجود داشته باشد.
- multiple-statements (C0321)
- بیش از یک دستور در یک خط زمانی استفاده میشود که بیش از یک دستور در یک خط یافت شود.
- superfluous-parens (C0325)
- پرانتزهای غیرضروری پس از کلیدواژه %r زمانی استفاده میشود که یک قلم تنها درون پرانتز پس از کلیدواژههای if، for یا دیگر کلیدواژهها قرار گیرد.
- mixed-line-endings (C0327)
- پایان خطهای ترکیبی LF و CRLF زمانی استفاده میشود که نشانههای خط جدید ترکیبی (LF و CRLF) در یک فایل وجود داشته باشد.
- unexpected-line-ending-format (C0328)
- قالب پایان خط غیرمنتظره. مقدار '%s' وجود دارد در حالی که باید '%s' باشد. زمانی استفاده میشود که پایان خط با مقدار مورد انتظار متفاوت باشد.
بررسیکننده واردسازیها (Imports checker)
نام دقیق این بررسیکننده imports است.
همچنین مستندات گزینههای بررسیکننده imports را ببینید: <#imports-options>
پیامهای بررسیکننده واردسازیها (Imports checker Messages)
- import-error (E0401)
- ناتوان در واردسازی %s زمانی استفاده میشود که pylint نتوانسته باشد یک پودمان را وارد کند.
- relative-beyond-top-level (E0402)
- تلاش برای واردسازی نسبی فراتر از بالاترین سطح بسته زمانی استفاده میشود که یک واردسازی نسبی تلاش کند به سطوحی فراتر از بسته جاری دسترسی یابد.
- wildcard-import (W0401)
- واردسازی با نویسه عمومی %s زمانی استفاده میشود که from module import * شناسایی شود.
- reimported (W0404)
- واردسازی دوباره %r (واردشده در خط %s) زمانی استفاده میشود که یک پودمان بیش از یک بار وارد شود.
- import-self (W0406)
- واردسازی پودمان توسط خودش زمانی استفاده میشود که یک پودمان خودش را وارد کند.
- preferred-module (W0407)
- ترجیح واردسازی %r بهجای %r زمانی استفاده میشود که برای پودمان واردشده یک پودمان جایگزین ترجیحی وجود داشته باشد.
- misplaced-future (W0410)
- واردسازی __future__ نخستین دستور غیر docstring نیست در Python 2.5 و بالاتر الزامی است که واردسازی __future__ نخستین دستور غیر docstring در پودمان باشد.
- shadowed-import (W0416)
- واردسازی پوشاندهشده %r (واردشده در خط %s) زمانی استفاده میشود که یک پودمان با نام مستعاری مشخص شود که واردسازی دیگری را میپوشاند.
- deprecated-module (W4901)
- پودمان منسوخشده %r پودمانی که به عنوان منسوخشده علامتگذاری شده، وارد شده است.
- cyclic-import (R0401)
- واردسازی چرخهای (%s) زمانی استفاده میشود که یک واردسازی چرخهای میان دو یا چند پودمان شناسایی شود.
- consider-using-from-import (R0402)
- بهجای آن از 'from %s import %s' استفاده کنید زمانی صادر میشود که یک زیرپودمان از یک بسته وارد شده و با همان نام مستعار نامگذاری شود؛ برای نمونه بهجای import concurrent.futures as futures از from concurrent import futures استفاده کنید.
- multiple-imports (C0410)
- چندین واردسازی در یک خط (%s) زمانی استفاده میشود که دستور import که چندین پودمان را وارد میکند شناسایی شود.
- wrong-import-order (C0411)
- %s باید پیش از %s قرار گیرد زمانی استفاده میشود که ترتیب واردسازیهای PEP8 رعایت نشده باشد (ابتدا واردسازیهای استاندارد، سپس کتابخانههای شخص ثالث، و در نهایت واردسازیهای محلی).
- ungrouped-imports (C0412)
- واردسازیها از بسته %s گروهبندی نشدهاند زمانی استفاده میشود که واردسازیها بر اساس بستهها گروهبندی نشده باشند.
- wrong-import-position (C0413)
- واردسازی "%s" باید در بالای پودمان قرار گیرد زمانی استفاده میشود که کدها و واردسازیها با یکدیگر آمیخته شده باشند.
- useless-import-alias (C0414)
- نام مستعار واردسازی نام بسته اصلی را تغییر نمیدهد زمانی استفاده میشود که نام مستعار واردسازی با بسته اصلی یکسان باشد؛ برای نمونه، استفاده از import numpy as numpy بهجای import numpy as np.
- import-outside-toplevel (C0415)
- واردسازی خارج از بالاترین سطح (%s) زمانی استفاده میشود که دستور واردسازی در جایی غیر از بالاترین سطح (toplevel) پودمان به کار رفته باشد. این واردسازی را به بالای فایل منتقل کنید.
بررسیکننده Lambda-Expressions
نام دقیق بررسیکننده lambda-expressions است.
پیامهای بررسیکننده Lambda-Expressions
- unnecessary-lambda-assignment (C3001)
- عبارت لامبدا به یک متغیر نسبت داده شده است. در عوض تابعی را با کلیدواژه "def" تعریف کنید. هنگامی استفاده میشود که یک عبارت لامبدا به جای تعریف تابعی استاندارد با کلیدواژه "def"، به یک متغیر نسبت داده شود.
- unnecessary-direct-lambda-call (C3002)
- عبارت لامبدا مستقیماً فراخوانی شده است. به جای آن عبارت را بهصورت درونخطی اجرا کنید. هنگامی استفاده میشود که یک عبارت لامبدا به جای اجرای درونخطی (inline) محتوای آن، بهطور مستقیم فراخوانی شود.
بررسیکننده Logging
نام دقیق بررسیکننده logging است.
همچنین مستندات گزینههای بررسیکننده logging را ببینید: <#logging-options>
پیامهای بررسیکننده Logging
- logging-unsupported-format (E1200)
- کاراکتر قالببندی لاگگیری پشتیبانینشده %r (%#02x) در اندیس %d هنگامی استفاده میشود که یک نویسه قالببندی پشتیبانینشده در رشته قالب یک عبارت لاگگیری به کار رود.
- logging-format-truncated (E1201)
- رشته قالب لاگگیری در میانه مشخصکننده تبدیل پایان یافته است هنگامی استفاده میشود که رشته قالب عبارت لاگگیری پیش از پایان مشخصکننده تبدیل خاتمه یابد.
- logging-too-many-args (E1205)
- آرگومانهای بیش از حد برای رشته قالب لاگگیری هنگامی استفاده میشود که آرگومانهای بیش از اندازهای به رشته قالب لاگگیری داده شود.
- logging-too-few-args (E1206)
- نبود آرگومانهای کافی برای رشته قالب لاگگیری هنگامی استفاده میشود که آرگومانهای بسیار کمی به رشته قالب لاگگیری داده شود.
- logging-not-lazy (W1201)
- استفاده از قالببندی %s در توابع لاگگیری هنگامی استفاده میشود که عبارت لاگگیری شکلی مانند "logging.<logging method>(format_string % (format_args...))" داشته باشد. در عوض از نوع دیگری از قالببندی رشته استفاده کنید. میتوانید از قالببندی % استفاده کنید اما با ارسال پارامترها به عنوان آرگومان، جایگذاری (interpolation) را به تابع لاگگیری بسپارید. اگر logging-fstring- interpolation غیرفعال باشد، میتوانید از قالببندی fstring استفاده کنید. اگر logging- format-interpolation غیرفعال باشد، میتوانید از str.format استفاده کنید.
- logging-format-interpolation (W1202)
- استفاده از قالببندی %s در توابع لاگگیری هنگامی استفاده میشود که عبارت لاگگیری شکلی مانند "logging.<logging method>(format_string.format(format_args...))" داشته باشد. در عوض از نوع دیگری از قالببندی رشته استفاده کنید. میتوانید از قالببندی % استفاده کنید اما با ارسال پارامترها به عنوان آرگومان، جایگذاری (interpolation) را به تابع لاگگیری بسپارید. اگر logging-fstring- interpolation غیرفعال باشد، میتوانید از قالببندی fstring استفاده کنید. اگر logging- not-lazy غیرفعال باشد، میتوانید بهصورت عادی از قالببندی % استفاده کنید.
- logging-fstring-interpolation (W1203)
- استفاده از قالببندی %s در توابع لاگگیری هنگامی استفاده میشود که عبارت لاگگیری شکلی مانند "logging.<logging method>(f"...")" داشته باشد. در عوض از نوع دیگری از قالببندی رشته استفاده کنید. میتوانید از % برای قالببندی استفاده کنید اما با ارسال پارامترها به عنوان آرگومان، جایگذاری را به تابع لاگگیری بسپارید. اگر logging-format-interpolation غیرفعال باشد، میتوانید از str.format استفاده کنید. اگر logging-not-lazy غیرفعال باشد، میتوانید بهصورت عادی از قالببندی % استفاده کنید.
بررسیکننده دستورهای Match
نام دقیق بررسیکننده match_statements است..SS پیامهای بررسیکنندهٔ دستورهای Match
- bare-name-capture-pattern (E1901)
- الگوی تصاحب نام `case %s` باعث غیرقابلدسترس شدن الگوهای بعدی میشود. برای رفع این مشکل از یک نام نقطهدار (مانند یک enum) استفاده کنید. زمانی صادر میشود که یک الگوی تصاحب نام در دستور match استفاده شده و دستورهای case دیگری پس از آن آمده باشند.
- invalid-match-args-definition (E1902)
- `__match_args__` باید یک تاپل از رشتهها باشد. زمانی صادر میشود که __match_args__ تاپلی از رشتههای لازم برای match نباشد.
- too-many-positional-sub-patterns (E1903)
- %s انتظار %d زیرالگوی موقعیتی دارد (%d داده شده است) زمانی صادر میشود که تعداد زیرالگوهای موقعیتی از تعداد مجاز مشخصشده در __match_args__ فراتر رود.
- multiple-class-sub-patterns (E1904)
- چندین زیرالگو برای ویژگی %s مشخص شده است زمانی صادر میشود که بیش از یک زیرالگو برای یک ویژگی مشخص در الگوی کلاس وجود داشته باشد.
- match-class-bind-self (R1905)
- بهجای آن از '%s() as %s' استفاده کنید الگوهای کلاس match زمانی سریعتر اجرا میشوند که انتساب نام برای کل الگو صورت گیرد و از هرگونه جستوجو برای __match_args__ صرفنظر شود.
- match-class-positional-attributes (R1906)
- بهجای ویژگیهای موقعیتی از ویژگیهای کلیدواژهای استفاده کنید (%s) ویژگیهای کلیدواژهای صریحتر و اندکی سریعتر هستند، زیرا CPython میتواند از جستوجوی __match_args__ صرفنظر کند.
بررسیکنندهٔ آرگومانهای متد (Method Args)
نام دقیق این بررسیکننده method_args است.
همچنین مستندات گزینههای بررسیکنندهٔ method_args را ببینید: <#method-args-options>
پیامهای بررسیکنندهٔ آرگومانهای متد (Method Args)
- positional-only-arguments-expected (E3102)
- به `%s()` تعدادی آرگومان فقطموقعیتی بهصورت آرگومان کلیدواژهای داده شده است: %s زمانی صادر میشود که آرگومانهای فقطموقعیتی بهصورت آرگومانهای کلیدواژهای ارسال شده باشند. کلیدواژهها را برای آرگومانهای مربوطه در فراخوانی تابع حذف کنید.
- missing-timeout (W3101)
- نبود آرگومان timeout برای متد '%s' میتواند برنامهٔ شما را به طور نامحدود متوقف کند زمانی استفاده میشود که متدی برای جلوگیری از انتظار طولانیمدت به پارامتر 'timeout' نیاز داشته باشد. اگر هیچ مهلت زمانی بهطور صریح مشخص نشود، مقدار پیشفرض استفاده خواهد شد. برای نمونه در 'requests'، برنامه هرگز منقضی نخواهد شد (یعنی تا ابد قفل میشود).
بررسیکنندهٔ سنجهها (Metrics)
نام دقیق این بررسیکننده metrics است.
گزارشهای بررسیکنندهٔ سنجهها (Metrics)
- RP0701
- سنجههای خام
بررسیکنندهٔ متفرقه (Miscellaneous)
نام دقیق این بررسیکننده miscellaneous است.
همچنین مستندات گزینههای بررسیکنندهٔ miscellaneous را ببینید: <#miscellaneous-options>
پیامهای بررسیکنندهٔ متفرقه (Miscellaneous)
- fixme (W0511)
- زمانی استفاده میشود که یادداشت هشداری مانند FIXME یا XXX تشخیص داده شود.
- use-symbolic-message-instead (I0023)
- زمانی استفاده میشود که پیامی با استفاده از شناسه (id) فعال یا غیرفعال شود.
بررسیکنندهٔ پیمایش تغییریافته (Modified Iteration)
نام دقیق این بررسیکننده modified_iteration است.
پیامهای بررسیکنندهٔ پیمایش تغییریافته (Modified Iteration)
- modified-iterating-dict (E4702)
- dict در حال پیمایش '%s' در بدنهٔ حلقهٔ for در حال تغییر است، بهجای آن یک رونوشت از آن را پیمایش کنید. زمانی صادر میشود که مواردی به دیکشنری (dict) در حال پیمایش اضافه یا از آن حذف شوند. انجام این کار خطای RuntimeError ایجاد میکند.
- modified-iterating-set (E4703)
- set در حال پیمایش '%s' در بدنهٔ حلقهٔ for در حال تغییر است، بهجای آن یک رونوشت از آن را پیمایش کنید. زمانی صادر میشود که مواردی به مجموعه (set) در حال پیمایش اضافه یا از آن حذف شوند. انجام این کار خطای RuntimeError ایجاد میکند.
- modified-iterating-list (W4701)
- list در حال
پیمایش '%s' در
بدنهٔ
حلقهٔ for در
حال تغییر
است،
پیمایش روی
یک رونوشت
از آن را در
نظر
بگیرید.
زمانی صادر
میشود که
مواردی به
لیست (list) در
حال پیمایش
اضافه یا از
آن حذف
شوند. انجام
این کار
میتواند
به رفتار
غیرمنتظره
منجر شود؛
به همین
دلیل بهتر
است از یک
رونوشت از
لیست
استفاده
شود.
نام دقیق بازبین nested_min_max است.
پیامهای بازبین Nested Min Max (Nested Min Max checker Messages)
- nested-min-max (W3301)
- از فراخوانی تودرتوی '%s' استفاده نکنید؛ میتوان بهجای آن از '%s' استفاده کرد فراخوانیهای تودرتوی min(1, min(2, 3)) را میتوان بهصورت min(1, 2, 3) بازنویسی کرد.
بازبین Newstyle (Newstyle checker)
نام دقیق بازبین newstyle است.
پیامهای بازبین Newstyle (Newstyle checker Messages)
- bad-super-call (E1003)
- آرگومان نخست نادرست %r به super() داده شده است زمانی استفاده میشود که آرگومانی غیر از کلاس فعلی بهعنوان نخستین آرگومان به تابع توکار super داده شود.
بازبین Nonascii-Checker (Nonascii-Checker checker)
نام دقیق بازبین nonascii-checker است.
پیامهای بازبین Nonascii-Checker (Nonascii-Checker checker Messages)
- non-ascii-file-name (W2402)
- نام %s با عنوان "%s" شامل یک نویسه غیر ASCII است. در Python 3.5، استاندارد PEP 3131 شناسههای غیر ASCII را مجاز میداند، اما نام فایلهای غیر ASCII را نه. از Python 3.5 به بعد، با وجود اینکه Python از فایلهای UTF-8 پشتیبانی میکند، برخی از ویرایشگرها یا ابزارها اینگونه نیستند.
- non-ascii-name (C2401)
- نام %s با عنوان "%s" شامل یک نویسه غیر ASCII است، تغییر نام آن را در نظر بگیرید. زمانی استفاده میشود که نام دستکم دارای یک نویسه یونیکد غیر ASCII باشد. برای پیشزمینهای دربارهٔ اینکه چرا این موضوع میتواند نامطلوب باشد، https://peps.python.org/pep-0672/#confusing-features را ببینید. اگر شیوهنامه برنامهنویسی شما مشخص کرده است که به زبان انگلیسی کدنویسی میکنید، نباید نیازی به نویسههای غیر ASCII در نامهای Python باشد. در غیر این صورت میتوانید بهسادگی این بررسی را غیرفعال کنید.
- non-ascii-module-import (C2403)
- نام %s با عنوان "%s" شامل یک نویسه غیر ASCII است، برای وارد کردن از یک نام مستعار صرفاً ASCII استفاده کنید. زمانی استفاده میشود که نام دستکم دارای یک نویسه یونیکد غیر ASCII باشد. برای پیشزمینهای درباره اینکه چرا این موضوع میتواند نامطلوب باشد، https://peps.python.org/pep-0672/#confusing-features را ببینید. اگر شیوهنامه برنامهنویسی شما مشخص کرده است که به زبان انگلیسی کدنویسی میکنید، نباید نیازی به نویسههای غیر ASCII در نامهای Python باشد. در غیر این صورت میتوانید بهسادگی این بررسی را غیرفعال کنید.
بازبین Refactoring (Refactoring checker)
نام دقیق بازبین refactoring است.
همچنین مستندات گزینههای بازبین refactoring را در <#refactoring-options> ببینید
پیامهای بازبین Refactoring (Refactoring checker Messages)
- consider-merging-isinstance (R1701)
- ادغام این فراخوانیهای isinstance به isinstance(%s, (%s)) را در نظر بگیرید زمانی استفاده میشود که چندین فراخوانی پیاپی isinstance را بتوان در یکی ادغام کرد.
- too-many-nested-blocks (R1702)
- بلوکهای تودرتوی بیش از حد مجاز (%s/%s) زمانی استفاده میشود که یک تابع یا متد دارای بلوکهای تودرتوی بسیار زیادی باشد. این امر درک و نگهداری کد را دشوارتر میکند.
- simplifiable-if-statement (R1703)
- دستور if میتواند با %s جایگزین شود زمانی استفاده میشود که یک دستور if را بتوان با 'bool(test)' جایگزین کرد.
- redefined-argument-from-local (R1704)
- بازتعریف آرگومان با نام محلی %r زمانی استفاده میشود که یک نام محلی در حال بازتعریف یک آرگومان باشد، که میتواند نشاندهنده یک خطای احتمالی باشد. این موضوع تنها برای تعداد اندکی از عملیات انتساب نام در نظر گرفته میشود، مانند تکرار حلقه for، انتساب در دستور with و انتساب در مدیریتکننده استثنا (exception handler).
- no-else-return (R1705)
- عبارت غیرضروری "%s" پس از "return"، %s بهمنظور مشخص کردن یک بلوک کد غیرضروری پس از یک if یا یک try/except حاوی دستور return استفاده میشود. بدین ترتیب، هنگامی که پس از زنجیرهای از ifها که همگی حاوی دستور return هستند به یک else برخورد کند، هشدار خواهد داد.
- consider-using-ternary (R1706)
- استفاده از عبارت شرطی سهگانه (%s) را در نظر بگیرید زمانی استفاده میشود که یکی از ساختارهای نحوی سهگانه شناختهشده پیش از Python 2.5 استفاده شده باشد.
- trailing-comma-tuple (R1707)
- غیرمجاز بودن چندتایی (tuple) با کامای پایانی در Python، یک tuple در واقع با نماد کاما ایجاد میشود، نه با پرانتزها. متأسفانه ممکن است با قرار دادن نابجای یک کامای پایانی ناخواسته یک tuple ایجاد شود که میتواند منجر به بروز باگهای عجیب بالقوه در کد شما گردد. همواره باید صریحاً از پرانتزها برای ایجاد tuple استفاده کنید.
- stop-iteration-return (R1708)
- استثنای StopIteration را در مولد ایجاد نکنید، بهجای آن از دستور return استفاده کنید طبق PEP 479، ایجاد استثنای StopIteration با دستور raise برای پایان دادن به حلقه یک مولد (generator) ممکن است به باگهایی منجر شود که یافتن آنها دشوار است. این PEP مشخص میکند که raise StopIteration باید با یک دستور return ساده جایگزین گردد
- simplify-boolean-expression (R1709)
- عبارت بولی میتواند به %s ساده شود زمانی صادر میشود که ساختار نحوی سهگانه زائد مربوط به نسخههای پیش از Python 2.5 به کار رفته باشد.
- inconsistent-return-statements (R1710)
- یا تمام دستورهای return در یک تابع باید یک عبارت را برگردانند، یا هیچکدام نباید برگردانند. طبق PEP 8، اگر هر دستور return عبارتی را بازگرداند، تمام دستورهای return دیگری که مقداری برنمیگردانند باید صریحاً این موضوع را بهصورت return None قید کنند، و یک دستور صریح return باید در انتهای تابع (در صورت دردسترس بودن مسیر اجرا) وجود داشته باشد
- useless-return (R1711)
- دستور return بیفایده در انتهای تابع یا متد زمانی صادر میشود که یک دستور تکی "return" یا "return None" در پایان تعریف تابع یا متد یافت شود. این دستور را میتوان با خیال راحت حذف کرد چرا که Python بهطور ضمنی مقدار None را برمیگرداند
- consider-swap-variables (R1712)
- استفاده از باز کردن چندتایی (tuple unpacking) را برای جابهجایی متغیرها در نظر بگیرید برای جابهجا کردن متغیرها نیازی به استفاده از یک متغیر کمکی موقت ندارید. استفاده از "tuple unpacking" برای جابهجایی مستقیم متغیرها مقصود کد را واضحتر میسازد.
- consider-using-join (R1713)
- استفاده از str.join(sequence) را برای الحاق رشتهها از یک شیء تکرارپذیر در نظر بگیرید استفاده از str.join(sequence) در مقایسه با تکرار با حلقه for سریعتر است، حافظه کمتری مصرف میکند و خوانایی را افزایش میدهد.
- consider-using-in (R1714)
- ادغام این مقایسهها با 'in' را با استفاده از '%s %sin (%s)' در نظر بگیرید. در صورتی که عناصر هشپذیر هستند، در عوض از یک مجموعه (set) استفاده کنید. برای بررسی اینکه آیا یک متغیر با یکی از چندین مقدار برابر است یا خیر، مقادیر را در یک set یا tuple ترکیب کرده و بهجای بررسی برابری با تکتک مقادیر، بررسی کنید که آیا متغیر درون آن قرار دارد ("in") یا خیر. این کار سریعتر است و کدنویسی کمتری دارد.
- consider-using-get (R1715)
- استفاده از dict.get را برای گرفتن مقادیر از یک فرهنگلغت (dict) در صورت وجود کلید یا مقدار پیشفرض در صورت نبود آن در نظر بگیرید استفاده از تابع توکار dict.get برای دریافت یک مقدار از دیکشنری در صورت وجود کلید یا یک مقدار پیشفرض در صورت عدم وجود، سادهتر است و روشی اصطلاحیتر (idiomatic) به شمار میرود، اگرچه گاهی اندکی کندتر است
- chained-comparison (R1716)
- سادهسازی مقایسه زنجیرهای میان عملوندها این پیام زمانی صادر میشود که pylint با یک عملیات بولی مانند "a < b and b < c" مواجه شود و پیشنهاد بازنویسی آن را بهصورت "a < b < c" ارائه دهد
- consider-using-dict-comprehension (R1717)
- استفاده از ساخت دیکشنری با درک مطلب (dict comprehension) را در نظر بگیرید زمانی صادر میشود که ایجاد یک دیکشنری با استفاده از فراخوانی dict() و یک لیست موقت تشخیص داده شود. اگرچه از نظر نحوی مشکلی در این کد وجود ندارد، اما خواندن آن دشوار است و میتواند به یک dict comprehension ساده شود. همچنین سریعتر است زیرا نیازی به ایجاد یک لیست موقت دیگر ندارید
- consider-using-set-comprehension (R1718)
- استفاده از ساخت مجموعه با درک مطلب (set comprehension) را در نظر بگیرید اگرچه از نظر نحوی مشکلی در این کد وجود ندارد، اما خواندن آن دشوار است و میتواند به یک set comprehension ساده شود. همچنین سریعتر است چرا که نیازی به ایجاد یک لیست موقت دیگر ندارید
- simplifiable-if-expression (R1719)
- عبارت if میتواند با %s جایگزین شود زمانی استفاده میشود که یک عبارت if بتواند با 'bool(test)' یا در صورت ضمنی بودن تبدیل نوع بولی صرفاً با 'test' جایگزین شود.
- no-else-raise (R1720)
- عبارت غیرضروری "%s" پس از "raise"، %s بهمنظور مشخص کردن یک بلوک کد غیرضروری پس از یک if یا try/except حاوی دستور raise استفاده میشود. بدین ترتیب، هنگامی که پس از زنجیرهای از ifها که همگی حاوی دستور raise هستند به یک else برخورد کند، هشدار خواهد داد.
- unnecessary-comprehension (R1721)
- استفاده غیرضروری از درک مطلب (comprehension)، بهجای آن از %s استفاده کنید. بهجای استفاده از یک comprehension همانی، استفاده از سازنده list، dict یا set را در نظر بگیرید. این کار سریعتر و سادهتر است.
- consider-using-sys-exit (R1722)
- استفاده از 'sys.exit' را بهجای آن در نظر بگیرید برخلاف 'exit()' یا 'quit()'، فراخوانی 'sys.exit' متکی به در دسترس بودن ماژول site نیست (زیرا ماژول 'sys' همواره در دسترس است)..TP no-else-break (R1723) "%s" غیرضروری پس از "break"، %s برای مشخص کردن یک بلوک کد غیرضروری پس از یک if حاوی دستور break به کار میرود. به این ترتیب، هنگامی که پس از زنجیرهای از دستورهای if که همگی دارای دستور break هستند با یک else مواجه شود، هشدار خواهد داد.
- no-else-continue (R1724)
- "%s" غیرضروری پس از "continue"، %s برای مشخص کردن یک بلوک کد غیرضروری پس از یک if حاوی دستور continue به کار میرود. به این ترتیب، هنگامی که پس از زنجیرهای از دستورهای if که همگی دارای دستور continue هستند با یک else مواجه شود، هشدار خواهد داد.
- super-with-arguments (R1725)
- استفاده از ()super به سبک Python 3 بدون آرگومان را در نظر بگیرید هنگام فراخوانی تابع درونی ()super با کلاس و نمونهٔ فعلی صادر میشود. در Python 3 این آرگومانها پیشفرض هستند و میتوان آنها را حذف کرد.
- simplifiable-condition (R1726)
- شرط بولی "%s" ممکن است به "%s" ساده شود هنگامی صادر میشود که یک شرط بولی امکان سادهسازی داشته باشد.
- condition-evals-to-constant (R1727)
- شرط بولی '%s' همواره به '%s' ارزیابی میشود هنگامی صادر میشود که یک شرط بولی بتواند به یک مقدار ثابت سادهسازی شود.
- consider-using-generator (R1728)
- استفاده از یک generator را به جای '%s(%s)' در نظر بگیرید اگر ظرف (container) شما میتواند بزرگ باشد، استفاده از یک generator کارایی بهتری به همراه خواهد داشت.
- use-a-generator (R1729)
- به جای '%s(%s)' از یک generator استفاده کنید استفاده از comprehension درون 'any'، 'all'، 'max'، 'min' یا 'sum' غیرضروری است. یک generator کافی و سریعتر خواهد بود.
- consider-using-min-builtin (R1730)
- استفاده از '%s' را به جای بلوک غیرضروری if در نظر بگیرید استفاده از تابع درونی min به جای یک عبارت شرطی، خوانایی و ایجاز کد را بهبود میبخشد.
- consider-using-max-builtin (R1731)
- استفاده از '%s' را به جای بلوک غیرضروری if در نظر بگیرید استفاده از تابع درونی max به جای یک عبارت شرطی، خوانایی و ایجاز کد را بهبود میبخشد.
- consider-using-with (R1732)
- استفاده از 'with' را برای عملیات تخصیص منابع در نظر بگیرید هنگامی صادر میشود که یک انتساب یا فراخوانی تخصیصدهندهٔ منابع بتواند با یک بلوک 'with' جایگزین شود. با استفاده از 'with' آزادسازی منابع تخصیصیافته حتی در صورت بروز یک استثنا (exception) تضمین میشود.
- unnecessary-dict-index-lookup (R1733)
- جستجوی اندیس دیکشنری غیرضروری است، در عوض از '%s' استفاده کنید هنگام پیمایش روی آیتمهای دیکشنری (جفتهای کلید-مقدار) و دسترسی به مقدار از طریق جستجوی اندیس صادر میشود. میتوان در عوض مستقیماً به مقدار دسترسی داشت.
- use-list-literal (R1734)
- استفاده از [] را به جای ()list در نظر بگیرید هنگام استفاده از ()list برای ایجاد یک لیست خالی به جای لیترال [] صادر میشود. لیترال سریعتر است زیرا از یک فراخوانی تابع اضافی جلوگیری میکند.
- use-dict-literal (R1735)
- استفاده از '%s' را به جای فراخوانی 'dict' در نظر بگیرید. هنگام استفاده از ()dict برای ایجاد یک دیکشنری به جای لیترال '{ ... }' صادر میشود. لیترال سریعتر است زیرا از یک فراخوانی تابع اضافی جلوگیری میکند.
- unnecessary-list-index-lookup (R1736)
- جستجوی اندیس لیست غیرضروری است، در عوض از '%s' استفاده کنید هنگام پیمایش روی یک شمارش (enumeration) و دسترسی به مقدار از طریق جستجوی اندیس صادر میشود. میتوان در عوض مستقیماً به مقدار دسترسی داشت.
- use-yield-from (R1737)
- به جای بازگرداندن تکتک عناصر با yield، مستقیماً از 'yield from' استفاده کنید بازگرداندن مستقیم مقادیر از تکرارکننده (iterator) با yield نسبت به yield کردن تکتک عناصر در حلقه، سریعتر است و بدون شک کد تمیزتری ایجاد میکند.
- unnecessary-negation (C0117)
- تغییر دادن "%s" به "%s" را در نظر بگیرید زمانی به کار میرود که یک عبارت بولی حاوی نقیض غیرضروری باشد؛ برای مثال زمانی که دو عملگر نقیض یکدیگر را خنثی میکنند.
- consider-using-enumerate (C0200)
- استفاده از enumerate را به جای پیمایش با range و len در نظر بگیرید هنگام مواجهه با کدی که با range و len پیمایش میکند صادر میشود. چنین کدی میتواند با استفاده از تابع درونی enumerate سادهسازی شود.
- consider-iterating-dictionary (C0201)
- پیمایش مستقیم دیکشنری را به جای فراخوانی ()keys. در نظر بگیرید هنگامی صادر میشود که کلیدهای یک دیکشنری از طریق متد .keys() پیمایش شوند یا زمانی که .keys() برای بررسی عضویت به کار رود. پیمایش خود دیکشنری کافی است: for key in dictionary. برای بررسیهای عضویت، عبارت if key in dictionary سریعتر است.
- consider-using-dict-items (C0206)
- پیمایش با ()items. را در نظر بگیرید هنگام پیمایش روی کلیدهای یک دیکشنری و دسترسی به مقدار از طریق جستجوی اندیس صادر میشود. با پیمایش با استفاده از متد ()items. دیکشنری، میتوان هم به کلید و هم به مقدار دسترسی داشت.
- use-maxsplit-arg (C0207)
- در عوض از %s استفاده کنید هنگام دسترسی تنها به عنصر اول یا آخر ()str.split صادر میشود. عنصر اول و آخر را میتوان در عوض با استفاده از [0](str.split(sep, maxsplit=1 یا [1-]str.rsplit(sep, maxsplit=1) به دست آورد.
- use-sequence-for-iteration (C0208)
- هنگام پیمایش روی مقادیر از یک نوع دنباله استفاده کنید هنگام پیمایش روی مقادیر، نوعهای دنباله (مانند lists، tuples و ranges) کارآمدتر از sets هستند.
- consider-using-f-string (C0209)
- قالببندی یک رشتهٔ عادی که میتواند یک f-string باشد زمانی به کار میرود که رشتهای تشخیص داده شود که با ()format یا % قالببندی میشود در حالی که میتواند یک f-string باشد. استفاده از f-string ترجیح داده میشود. نیازمند Python 3.6 و py-version >= 3.6 است.
- use-implicit-booleaness-not-len (C1802)
- برای تعیین خالی بودن دنباله، از `len(SEQUENCE)` بدون مقایسه استفاده نکنید دنبالههای خالی در یک بافتار بولی نادرست (false) تلقی میشوند. میتوانید یا فراخوانی 'len' را حذف کنید (if not x) یا طول را در برابر یک مقدار اسکالر بسنجید (if len(x) > 1).
- use-implicit-booleaness-not-comparison (C1803)
- اگر صرفاً یک دنباله باشد، "%s" میتواند به "%s" ساده شود، چرا که یک %s خالی falsey است دنبالههای خالی در یک بافتار بولی نادرست (false) تلقی میشوند. پیروی کورکورانه از این بررسی در پایگاههای کدی با نوعبندی ضعیف (weakly typed) میتواند مشکلاتی ایجاد کند که اشکالزدایی آنها دشوار است. اگر مقدار بتواند چیز دیگری باشد که falsey است اما دنباله نیست (برای مثال None، یک رشتهٔ خالی، یا 0)، کد معادل نخواهد بود.
- use-implicit-booleaness-not-comparison-to-string (C1804)
- اگر صرفاً یک رشته باشد، "%s" میتواند به "%s" ساده شود، چرا که یک رشتهٔ خالی falsey است رشتههای خالی در یک بافتار بولی نادرست (false) تلقی میشوند. پیروی کورکورانه از این بررسی در پایگاههای کدی با نوعبندی ضعیف میتواند مشکلاتی ایجاد کند که اشکالزدایی آنها دشوار است. اگر مقدار بتواند چیز دیگری باشد که falsey است اما رشته نیست (برای مثال None، یک دنبالهٔ خالی، یا 0)، کد معادل نخواهد بود.
- use-implicit-booleaness-not-comparison-to-zero (C1805)
- اگر صرفاً
یک int باشد،
"%s"
میتواند
به "%s" ساده
شود، چرا که
0 falsey است
مقدار 0 در
یک بافتار
بولی
نادرست (false)
تلقی
میشود.
پیروی
کورکورانه
از این
بررسی در
پایگاههای
کدی با
نوعبندی
ضعیف
میتواند
مشکلاتی
ایجاد کند
که
اشکالزدایی
آنها
دشوار است.
اگر مقدار
بتواند چیز
دیگری باشد
که falsey است اما
int نیست (برای
مثال None، یک
رشتهٔ
خالی، یا یک
دنبالهٔ
خالی)، کد
معادل
نخواهد بود.
نام دقیق این بازرس similarities است.
همچنین مستندات گزینههای بازرس شباهتها را ببینید <#similarities-options>
پیامهای بازرس شباهتها (Similarities checker Messages)
- duplicate-code (R0801)
- خطوط مشابه در %s فایل نشان میدهد که مجموعهای از خطوط مشابه میان چندین فایل شناسایی شده است. این مورد معمولاً بدین معناست که برای جلوگیری از این تکرار، کد باید بازنویسی و بازآرایی (refactor) شود.
گزارشهای بازرس شباهتها (Similarities checker Reports)
- RP0801
- همپوشانی و تکرار (Duplication)
بازرس املا (Spelling checker)
نام دقیق این بازرس spelling است.
همچنین مستندات گزینههای بازرس املا را ببینید <#spelling-options>
پیامهای بازرس املا (Spelling checker Messages)
- wrong-spelling-in-comment (C0401)
- املای نادرست کلمه '%s' در یک کامنت: زمانی استفاده میشود که کلمهای در کامنت به درستی نوشته نشده باشد.
- wrong-spelling-in-docstring (C0402)
- املای نادرست کلمه '%s' در یک docstring: زمانی استفاده میشود که کلمهای در docstring به درستی نوشته نشده باشد.
- invalid-characters-in-docstring (C0403)
- نویسههای نامعتبر %r در یک docstring زمانی استفاده میشود که یک کلمه در docstring نتواند توسط enchant بررسی شود.
بازرس کتابخانه استاندارد (Stdlib checker)
نام دقیق این بازرس stdlib است.
پیامهای بازرس کتابخانه استاندارد (Stdlib checker Messages)
- invalid-envvar-value (E1507)
- %s از آرگومانی با نوع %s پشتیبانی نمیکند توابع دستکاری متغیرهای محیطی تنها از آرگومانهای با نوع رشته (str) پشتیبانی میکنند. ببینید https://docs.python.org/3/library/os.html#os.getenv.
- singledispatch-method (E1519)
- دکوراتور singledispatch نباید برای متدها استفاده شود، به جای آن از singledispatchmethod استفاده کنید. دکوراتور singledispatch باید توابع را تزیین کند نه متدهای کلاس یا نمونه را. برای این موارد از singledispatchmethod استفاده کنید.
- singledispatchmethod-function (E1520)
- دکوراتور singledispatchmethod نباید برای توابع استفاده شود، به جای آن از singledispatch استفاده کنید. دکوراتور singledispatchmethod باید متدهای کلاس یا نمونه را تزیین کند نه توابع را. برای این موارد از singledispatch استفاده کنید.
- bad-open-mode (W1501)
- "%s" حالت معتبری برای open نیست. پایتون از حالتهای r، w، a[, x] به همراه گزینههای b، + و U (تنها با r) پشتیبانی میکند. ببینید https://docs.python.org/3/library/functions.html#open
- boolean-datetime (W1502)
- استفاده از datetime.time در بافتار بولی (boolean). استفاده از datetime.time در یک بافتار بولی میتواند زمانی که ساعت مشخصشده با نیمهشب UTC منطبق باشد، باگهای پنهانی ایجاد کند. این رفتار در Python 3.5 برطرف شد. برای اطلاعات بیشتر ببینید https://bugs.python.org/issue13936. هنگام استفاده از Python >= 3.5 این پیام صادر نمیشود.
- redundant-unittest-assert (W1503)
- استفاده زائد از %s با مقدار ثابت %r آرگومان نخست assertTrue و assertFalse یک شرط است. اگر یک مقدار ثابت به عنوان پارامتر ارسال شود، آن شرط همواره صادق خواهد بود. در این حالت باید یک هشدار صادر شود.
- bad-thread-instantiation (W1506)
- کلاس threading.Thread به تابع target نیاز دارد این هشدار زمانی صادر میشود که یک نمونه از کلاس threading.Thread بدون ارسال تابع هدف به عنوان یک kwarg یا به عنوان آرگومان دوم ایجاد شود. بهطور پیشفرض، نخستین پارامتر، پارامتر group است نه پارامتر target.
- shallow-copy-environ (W1507)
- استفاده از copy.copy(os.environ). به جای آن از os.environ.copy() استفاده کنید. شیء os.environ یک شیء dict نیست بلکه یک شیء پروکسی (proxy) است؛ بنابراین کپی سطحی (shallow copy) همچنان بر شیء اصلی اثر میگذارد. برای ارجاع ببینید https://bugs.python.org/issue15373.
- invalid-envvar-default (W1508)
- نوع پیشفرض %s برابر با %s است. انتظار میرفت str یا None باشد. توابع دستکاری متغیرهای محیطی مقادیر None یا str بازمیگردانند. ارسال هر نوع متفاوتی به عنوان مقدار پیشفرض میتواند باعث ایجاد باگ شود. ببینید https://docs.python.org/3/library/os.html#os.getenv.
- subprocess-popen-preexec-fn (W1509)
- استفاده از کلمه کلیدی preexec_fn که ممکن است در حضور ریسهها (threads) ناامن باشد استفاده از پارامتر preexec_fn در صورت حضور ریسهها (threads) در برنامه شما ایمن نیست. فرآیند فرزند ممکن است پیش از فراخوانی exec دچار بنبست (deadlock) شود. اگر ناچار به استفاده از آن هستید، آن را بسیار ساده و سبک نگه دارید! تعداد کتابخانههایی را که فراخوانی میکنید به حداقل برسانید. ببینید https://docs.python.org/3/library/subprocess.html#popen-constructor
- subprocess-run-check (W1510)
- استفاده از 'subprocess.run' بدون تعیین صریح مقدار برای 'check'. کلمه کلیدی check بهطور پیشفرض روی False تنظیم شده است. این بدان معناست که فرآیند اجراشده توسط subprocess.run میتواند با یک کد خروج غیر صفر پایان یابد و در سکوت شکست بخورد. بهتر است آن را بهطور صریح تنظیم کنید تا رفتار مدیریت خطا کاملاً مشخص باشد.
- unspecified-encoding (W1514)
- استفاده از open بدون تعیین صریح یک کدگذاری (encoding) بهتر است هنگام باز کردن اسناد، یک کدگذاری (encoding) را مشخص کنید. استفاده ضمنی از مقدار پیشفرض سیستم میتواند در سایر سیستمهای عامل مشکلاتی ایجاد کند. ببینید https://peps.python.org/pep-0597 این پیام هنگام استفاده از Python >= 3.15 صادر نمیشود.
- forgotten-debug-statement (W1515)
- باقی گذاشتن توابع ایجادکننده نقاط توقف (breakpoints) در کد محیط عملیاتی (production) توصیه نمیشود فراخوانیهای breakpoint()، sys.breakpointhook() و pdb.set_trace() باید از کدی که فعالانه در حال اشکالزدایی نیست حذف شوند.
- method-cache-max-size-none (W1518)
- دستور 'lru_cache(maxsize=None)' یا 'cache' تمام آرگومانهای متد از جمله 'self' را تا ابد زنده نگه میدارد با تزیین یک متد توسط lru_cache یا cache، آرگومان 'self' به تابع پیوند میخورد و بنابراین هرگز توسط زبالهروب (garbage collector) جمعآوری نمیشود. مگر اینکه نمونه شما هرگز نیازی به جمعآوری زباله نداشته باشد (تکنمونه یا singleton)، توصیه میشود برای جلوگیری از این الگو کد را بازآرایی کرده یا یک maxsize به حافظه موقت (cache) اضافه کنید. مقدار پیشفرض برای maxsize برابر با ۱۲۸ است.
- deprecated-method (W4902)
- استفاده از متد منسوخشده %s() این متد به عنوان منسوخشده (deprecated) نشانهگذاری شده است و در آینده حذف خواهد شد.
- deprecated-argument (W4903)
- استفاده از آرگومان منسوخشده %s در متد %s() این آرگومان به عنوان منسوخشده (deprecated) نشانهگذاری شده است و در آینده حذف خواهد شد.
- deprecated-class (W4904)
- استفاده از کلاس منسوخشده %s از ماژول %s این کلاس به عنوان منسوخشده (deprecated) نشانهگذاری شده است و در آینده حذف خواهد شد.
- deprecated-decorator (W4905)
- استفاده از دکوراتور منسوخشده %s() این دکوراتور به عنوان منسوخشده (deprecated) نشانهگذاری شده است و در آینده حذف خواهد شد.
- deprecated-attribute (W4906)
- استفاده
از ویژگی (attribute)
منسوخشده
%r این ویژگی
به عنوان
منسوخشده
(deprecated)
نشانهگذاری
شده است و
در آینده
حذف خواهد
شد.
نام دقیق این بازبین string است.
همچنین مستندات گزینههای بازبین رشته را ببینید: <#string-options>
پیامهای بازبین رشته (String checker Messages)
- bad-format-character (E1300)
- نویسه قالببندی پشتیبانینشده %r (%#02x) در اندیس %d زمانی استفاده میشود که یک نویسه قالببندی پشتیبانینشده در یک رشته قالببندی به کار رفته باشد.
- truncated-format-string (E1301)
- رشته قالببندی در میانه مشخصکننده تبدیل پایان مییابد زمانی استفاده میشود که یک رشته قالببندی پیش از پایان یک مشخصکننده تبدیل خاتمه یابد.
- mixed-format-string (E1302)
- ترکیب مشخصکنندههای تبدیل نامدار و بینام در رشته قالببندی زمانی استفاده میشود که یک رشته قالببندی شامل هر دو نوع مشخصکننده تبدیل نامدار (مانند '%(foo)d') و بینام (مانند '%d') باشد. این پیام همچنین زمانی استفاده میشود که یک مشخصکننده تبدیل نامدار حاوی * برای حداقل عرض فیلد و/یا دقت باشد.
- format-needs-mapping (E1303)
- برای رشته قالببندی نگاشت انتظار میرفت، نه %s زمانی استفاده میشود که یک رشته قالببندی که از مشخصکنندههای تبدیل نامدار استفاده میکند با آرگومانی به کار رود که یک نگاشت نیست.
- missing-format-string-key (E1304)
- کلید %r در دیکشنری رشته قالببندی وجود ندارد زمانی استفاده میشود که یک رشته قالببندی که از مشخصکنندههای تبدیل نامدار استفاده میکند با دیکشنریای به کار رود که شامل تمام کلیدهای مورد نیاز رشته قالببندی نیست.
- too-many-format-args (E1305)
- آرگومانهای بیش از حد برای رشته قالببندی زمانی استفاده میشود که به یک رشته قالببندی که از مشخصکنندههای تبدیل بینام استفاده میکند، بیش از حد آرگومان داده شود.
- too-few-format-args (E1306)
- آرگومانهای ناکافی برای رشته قالببندی زمانی استفاده میشود که به یک رشته قالببندی که از مشخصکنندههای تبدیل بینام استفاده میکند، آرگومانهای بسیار کمی داده شود.
- bad-string-format-type (E1307)
- آرگومان %r با نوع قالب %r همخوانی ندارد زمانی استفاده میشود که نوع مورد نیاز رشته قالببندی برای نوع واقعی آرگومان مناسب نباشد.
- bad-str-strip-call (E1310)
- آرگومان مشکوک در فراخوانی %s.%s آرگومان ارسالشده به فراخوانی str.{l,r,}strip حاوی یک نویسه تکراری است،
- bad-format-string-key (W1300)
- کلید دیکشنری رشته قالببندی باید یک رشته باشد، نه %s زمانی استفاده میشود که یک رشته قالببندی که از مشخصکنندههای تبدیل نامدار استفاده میکند با دیکشنریای به کار رود که تمام کلیدهای آن رشته نیستند.
- unused-format-string-key (W1301)
- کلید استفادهنشده %r در دیکشنری رشته قالببندی زمانی استفاده میشود که یک رشته قالببندی که از مشخصکنندههای تبدیل نامدار استفاده میکند با دیکشنریای به کار رود که شامل کلیدهایی است که مورد نیاز رشته قالببندی نیستند.
- bad-format-string (W1302)
- رشته قالببندی نامعتبر زمانی استفاده میشود که یک رشته قالببندی PEP 3101 نامعتبر باشد.
- missing-format-argument-key (W1303)
- آرگومان کلیدواژهای %r برای رشته قالببندی یافت نشد زمانی استفاده میشود که یک رشته قالببندی PEP 3101 که از فیلدهای نامدار استفاده میکند، یک یا چند کلیدواژه الزامی را دریافت نکند.
- unused-format-string-argument (W1304)
- آرگومان قالببندی استفادهنشده %r زمانی استفاده میشود که یک رشته قالببندی PEP 3101 که از فیلدهای نامدار استفاده میکند با آرگومانی به کار رود که مورد نیاز رشته قالببندی نیست.
- format-combined-specification (W1305)
- رشته قالببندی شامل هر دو نوع شمارهگذاری خودکار فیلد و تعیین دستی فیلد است زمانی استفاده میشود که یک رشته قالببندی PEP 3101 شامل هر دو نوع شمارهگذاری خودکار فیلد (مانند '{}') و تعیین دستی فیلد (مانند '{0}') باشد.
- missing-format-attribute (W1306)
- صفت قالببندی %r در مشخصکننده قالب %r وجود ندارد زمانی استفاده میشود که یک رشته قالببندی PEP 3101 از مشخصکننده صفت ({0.length}) استفاده کند، اما آرگومان ارسالشده برای قالببندی فاقد آن صفت باشد.
- invalid-format-index (W1307)
- استفاده از کلید جستجوی نامعتبر %r در مشخصکننده قالب %r زمانی استفاده میشود که یک رشته قالببندی PEP 3101 از مشخصکننده جستجو ({a[1]}) استفاده کند، اما آرگومان ارسالشده برای قالببندی فاقد آن کلید بوده یا آن را به عنوان یک صفت نداشته باشد.
- duplicate-string-formatting-argument (W1308)
- آرگومان قالببندی رشته تکراری %r، ارسال به عنوان آرگومان نامدار را مد نظر قرار دهید زمانی استفاده میشود که تشخیص دهیم قالببندی رشته به جای استفاده از آرگومانهای رشتهای نامدار، در حال تکرار یک آرگومان است.
- f-string-without-interpolation (W1309)
- استفاده از f-string که هیچ متغیر درونیابیشدهای ندارد زمانی استفاده میشود که یک f-string شناسایی شود که از هیچ متغیر درونیابی استفاده نمیکند، که در این حالت میتواند یا یک رشته معمولی باشد یا یک باگ در کد.
- format-string-without-interpolation (W1310)
- استفاده از قالببندی برای رشتهای که هیچ متغیر درونیابیشدهای ندارد زمانی استفاده میشود که رشتهای شناسایی شود که فاقد هرگونه متغیر درونیابی است، که در این حالت میتواند یا یک رشته معمولی بدون قالببندی باشد یا یک باگ در کد.
- anomalous-backslash-in-string (W1401)
- بکاسلش غیرعادی در رشته: '%s'. ممکن است پیشوند r برای این ثابت رشتهای جا افتاده باشد. زمانی استفاده میشود که یک بکاسلش در یک رشته لفظی قرار دارد اما به عنوان نویسه گریز به کار نرفته است.
- anomalous-unicode-escape-in-string (W1402)
- گریز یونیکد غیرعادی در رشته بایتی: '%s'. ممکن است پیشوند r یا u برای این ثابت رشتهای جا افتاده باشد. زمانی استفاده میشود که با گریزی مانند u در یک رشته بایتی مواجه شویم در حالی که در آنجا هیچ تأثیری ندارد.
- implicit-str-concat (W1404)
- الحاق ضمنی رشته در %s مشاهده شد رشتههای لفظی در تعریف یک شیء تکرارپذیر لفظی به صورت ضمنی الحاق شدهاند : شاید یک کاما جا افتاده باشد؟
- inconsistent-quotes (W1405)
- جداکننده نقلقول %s با بقیه فایل ناسازگار است جداکنندههای نقلقول در سرتاسر یک ماژول به صورت یکنواخت استفاده نشدهاند (با در نظر گرفتن استثناهایی جهت پرهیز از نویسههای گریز غیرضروری).
- redundant-u-string-prefix (W1406)
- پیشوند u
برای
رشتهها در
Python >=3.0 دیگر
ضروری
نیست
زمانی
استفاده
میشود که
رشتهای با
پیشوند u
شناسایی
شود. این
پیشوندها
در Python 2 برای
مشخص کردن
این که یک
رشته
یونیکد است
لازم
بودند، اما
از Python 3.0
رشتهها به
صورت
پیشفرض
یونیکد
هستند.
نام دقیق این بررسیکننده threading است.
پیامهای بررسیکننده Threading
- useless-with-lock (W2101)
- ایجاد مستقیم '%s()' در 'with' هیچ تأثیری ندارد هنگامی استفاده میشود که یک نمونه قفل جدید با استفاده از دستور with ایجاد شود که هیچ تأثیری ندارد. در عوض، باید از یک نمونه موجود برای گرفتن قفل استفاده شود.
بررسیکننده Typecheck
نام دقیق این بررسیکننده typecheck است.
همچنین مستندات گزینههای بررسیکننده typecheck را ببینید <#typecheck-options>
پیامهای بررسیکننده Typecheck
- no-member (E1101)
- %s %r دارای عضو %r نیست%s هنگامی استفاده میشود که به عضوی ناموجود از یک متغیر دسترسی پیدا شود.
- not-callable (E1102)
- %s قابل فراخوانی نیست هنگامی استفاده میشود که شیء فراخوانیشده، بهعنوان شیئی غیرقابلفراخوانی استنتاج شده باشد.
- assignment-from-no-return (E1111)
- انتساب نتیجه فراخوانی تابعی که هیچ بازگشتی ندارد هنگامی استفاده میشود که انتسابی بر روی فراخوانی یک تابع انجام شود اما تابع استنتاجشده هیچ چیزی بازنگرداند.
- no-value-for-parameter (E1120)
- مقداری برای آرگومان %s در فراخوانی %s داده نشده است هنگامی استفاده میشود که یک فراخوانی تابع، آرگومانهای کمتری از حد لازم ارسال کند.
- too-many-function-args (E1121)
- تعداد بیش از حد آرگومانهای موضعی برای فراخوانی %s هنگامی استفاده میشود که یک فراخوانی تابع، بیش از حد آرگومان موضعی ارسال کند.
- unexpected-keyword-arg (E1123)
- آرگومان کلیدواژهای غیرمنتظره %r در فراخوانی %s هنگامی استفاده میشود که در فراخوانی یک تابع، آرگومان کلیدواژهای ارسال شود که با هیچیک از نامهای پارامترهای تابع مطابقت ندارد.
- redundant-keyword-arg (E1124)
- آرگومان %r در فراخوانی %s هم با موقعیت و هم با کلیدواژه ارسال شده است هنگامی استفاده میشود که فراخوانی یک تابع منجر به انتساب چندین مقدار به یک پارامتر تابع شود؛ یک مقدار از طریق آرگومان موضعی و مقدار دیگر از طریق آرگومان کلیدواژهای.
- missing-kwoa (E1125)
- آرگومان کلیدواژهای اجباری %r در فراخوانی %s وجود ندارد هنگامی استفاده میشود که یک فراخوانی تابع، یک آرگومان الزامیِ صرفاً کلیدواژهای را ارسال نکند.
- invalid-sequence-index (E1126)
- اندیس توالی از نوع int، slice یا نمونهای دارای __index__ نیست هنگامی استفاده میشود که یک نوع توالی با نوعی نامعتبر اندیسگذاری شود. انواع معتبر عبارتند از intها، sliceها و اشیایی با متد __index__.
- invalid-slice-index (E1127)
- اندیس برش از نوع int، None یا نمونهای دارای __index__ نیست هنگامی استفاده میشود که اندیس برش یک عدد صحیح، None یا شیئی با متد __index__ نباشد.
- assignment-from-none (E1128)
- انتساب نتیجه فراخوانی یک تابع، در حالی که تابع None بازمیگرداند هنگامی استفاده میشود که انتسابی بر روی فراخوانی یک تابع انجام شود اما تابع استنتاجشده چیزی جز None بازنگرداند.
- not-context-manager (E1129)
- مدیر بافت '%s' متدهای __enter__ و __exit__ را پیادهسازی نکرده است. هنگامی استفاده میشود که یک نمونه در دستور with، پروتکل مدیر بافت (__enter__/__exit__) را پیادهسازی نکرده باشد.
- invalid-unary-operand-type (E1130)
- هنگامی صادر میشود که یک عملوند یگانی روی شیئی استفاده شود که از این نوع عملیات پشتیبانی نمیکند.
- unsupported-binary-operation (E1131)
- هنگامی صادر میشود که یک عملیات حسابی دودویی بین دو عملوند پشتیبانی نشود.
- repeated-keyword (E1132)
- چندین مقدار برای آرگومان کلیدواژهای %r در فراخوانی تابع دریافت شد هنگامی صادر میشود که یک فراخوانی تابع چندین مقدار برای یک کلیدواژه دریافت کند.
- not-an-iterable (E1133)
- مقدار غیرقابلپیمایش %s در یک بافت پیمایشی استفاده شده است هنگامی استفاده میشود که یک مقدار غیرقابلپیمایش در جایی که انتظار شیء قابلپیمایش میرود به کار رود.
- not-a-mapping (E1134)
- مقدار غیرنگاشتی %s در یک بافت نگاشتی استفاده شده است هنگامی استفاده میشود که یک مقدار غیرنگاشتی در جایی که انتظار یک نگاشت میرود به کار رود.
- unsupported-membership-test (E1135)
- مقدار '%s' از آزمون عضویت پشتیبانی نمیکند هنگامی صادر میشود که یک نمونه در عبارت آزمون عضویت، پروتکل عضویت (__contains__/__iter__/__getitem__) را پیادهسازی نکرده باشد.
- unsubscriptable-object (E1136)
- مقدار '%s' اندیسپذیر نیست هنگامی صادر میشود که یک مقدار اندیسگذاریشده از اندیسپذیری پشتیبانی نکند (یعنی متد __getitem__ یا برای یک کلاس متد __class_getitem__ را تعریف نکرده باشد).
- unsupported-assignment-operation (E1137)
- %r از انتساب آیتم پشتیبانی نمیکند هنگامی صادر میشود که یک شیء از انتساب آیتم پشتیبانی نکند (یعنی متد __setitem__ را تعریف نکرده باشد).
- unsupported-delete-operation (E1138)
- %r از حذف آیتم پشتیبانی نمیکند هنگامی صادر میشود که یک شیء از حذف آیتم پشتیبانی نکند (یعنی متد __delitem__ را تعریف نکرده باشد).
- invalid-metaclass (E1139)
- متاکلاس نامعتبر %r استفاده شده است هنگامی صادر میشود که بتوان تشخیص داد یک کلاس چیزی را به عنوان متاکلاس استفاده میکند که برای استفاده به عنوان متاکلاس نامعتبر است.
- dict-iter-missing-items (E1141)
- باز کردن دیکشنری در پیمایش بدون فراخوانی .items() هنگامی صادر میشود که تلاشی برای پیمایش یک dict بدون فراخوانی .items() صورت گیرد.
- await-outside-async (E1142)
- 'await' باید درون یک تابع async استفاده شود هنگامی صادر میشود که await خارج از یک تابع async استفاده شود.
- unhashable-member (E1143)
- '%s' هشناپذیر است و نمیتواند بهعنوان یک %s در یک %s استفاده شود هنگامی صادر میشود که یک کلید dict یا عضو set هشپذیر نباشد (یعنی متد __hash__ را تعریف نکرده باشد).
- invalid-slice-step (E1144)
- گام برش نمیتواند ۰ باشد هنگامی استفاده میشود که گام یک برش ۰ باشد و شیء متد سفارشی __getitem__ را پیادهسازی نکرده باشد.
- async-context-manager-with-regular-with (E1145)
- مدیر بافت '%s' ناهمگام است و باید با 'async with' استفاده شود. هنگامی استفاده میشود که یک مدیر بافت ناهمگام به جای 'async with' با دستور معمولی 'with' استفاده شود.
- keyword-arg-before-vararg (W1113)
- آرگومان کلیدواژهای قبل از فهرست آرگومانهای موضعی متغیر در تعریف تابع %s هنگام تعریف یک آرگومان کلیدواژهای قبل از آرگومانهای موضعی متغیر، در صورتی که متد با آرگومانهای کلیدواژهای فراخوانی شود، ممکن است چندین مقدار برای پارامتر مذکور ارسال گردد.
- arguments-out-of-order (W1114)
- به نظر میرسد ترتیب آرگومانهای موضعی نامرتب است هنگامی صادر میشود که نامهای آرگومانهای فراخواننده کاملاً با نامهای پارامترها در امضای تابع مطابقت داشته باشند اما ترتیب یکسانی نداشته باشند.
- non-str-assignment-to-dunder-name (W1115)
- مقدار غیررشتهای به __name__ انتساب داده شده است هنگامی صادر میشود که یک مقدار غیررشتهای به __name__ انتساب یابد.
- isinstance-second-argument-not-valid-type (W1116)
- آرگومان دوم isinstance یک نوع نیست هنگامی صادر میشود که آرگومان دوم در فراخوانی isinstance یک نوع (type) نباشد.
- kwarg-superseded-by-positional-arg (W1117)
- %r در %r گنجانده خواهد شد زیرا پارامتری صرفاً موضعی با این نام از قبل وجود دارد هنگامی صادر میشود که تابعی با یک آرگومان کلیدواژهای فراخوانی شود که همنام با یک پارامتر صرفاً موضعی است و تابع دارای یک دیکشنری از پارامترهای متغیر کلیدواژهای باشد.
- c-extension-no-member (I1101)
- %s %r دارای عضو
%r نیست%s، اما
کد منبع در
دسترس نیست.
اگر
میخواهید
تحلیل بر
اساس
دروننگری
اشیاء زنده
در زمان
اجرا انجام
شود،
افزودن این
ماژول به
extension-pkg-allow-list را در
نظر
بگیرید.
هنگامی
استفاده
میشود که
به عضوی
ناموجود از
یک افزونه C
دسترسی
پیدا شود.
به دلیل در
دسترس
نبودن کد
منبع،
تحلیل
ایستا
غیرممکن
است، اما
میتواند
با
دروننگری
اشیاء زنده
در زمان
اجرا انجام
شود.
نام دقیق این بررسیکننده unicode_checker است.
پیامهای بررسیکننده Unicode Checker
- invalid-unicode-codec (E2501)
- کدکهای 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 (E2502)
- شامل نویسههای کنترلی است که میتوانند اجازه دهند کد مبهم، متفاوت از آنچه نمایش داده میشود اجرا شود نویسههای یونیکد دوجهته (bidirectional unicode) معمولاً نویسههای نمایشدادهنشدهای هستند که برای نمایش درست خطوط راستبهچپ (RTL) (یعنی چینی، ژاپنی، عربی، عبری و...) لازماند. بنابراین آیا میتوانید به این کد اعتماد کنید؟ آیا مطمئن هستید که در تمام ویرایشگرها به درستی نمایش داده میشود؟ اگر شما آن را ننوشتهاید یا زبان شما RTL نیست، این نویسههای خاص را حذف کنید؛ زیرا میتوانند برای فریب دادن شما جهت اجرای کدی به کار روند که کاری متفاوت از ظاهرش انجام میدهد. اطلاعات بیشتر: https://en.wikipedia.org/wiki/Bidirectional_text https://trojansource.codes
- invalid-character-backspace (E2510)
- نویسهٔ backspace نامعتبر و بدون گریز، در عوض از "b" استفاده کنید. مکاننما را به عقب بازمیگرداند، بنابراین نویسهٔ پس از آن، روی نویسهٔ قبلی بازنویسی میشود.
- invalid-character-carriage-return (E2511)
- نویسهٔ carriage-return نامعتبر و بدون گریز، در عوض از "r" استفاده کنید. مکاننما را به ابتدای خط میبرد؛ نویسههای بعدی ابتدای خط را بازنویسی میکنند.
- invalid-character-sub (E2512)
- نویسهٔ sub نامعتبر و بدون گریز، در عوض از "x1A" استفاده کنید. کلید Ctrl+Z یا "End of text" در Windows. برخی برنامهها (مانند type) باقیماندهٔ فایل پس از آن را نادیده میگیرند.
- invalid-character-esc (E2513)
- نویسهٔ esc نامعتبر و بدون گریز، در عوض از "x1B" استفاده کنید. معمولاً کدهای گریز (escape codes) را آغاز میکند که امکان کنترل دلخواه ترمینال را فراهم میسازند.
- invalid-character-nul (E2514)
- نویسهٔ nul نامعتبر و بدون گریز، در عوض از "0" استفاده کنید. غالباً در python به معنای پایان ورودی است.
- invalid-character-zero-width-space (E2515)
- نویسهٔ zero-width-space نامعتبر و بدون گریز، در عوض از "u200B" استفاده کنید. نویسهٔ فاصلهٔ نامرئی میتواند اجرای واقعی کد را پنهان کند.
- bad-file-encoding (C2503)
- PEP8 کدگذاری UTF-8 را برای فایلهای Python توصیه میکند استاندارد PEP8 کدگذاری پیشفرض UTF-8 را برای فایلهای Python توصیه میکند. ببینید: https://peps.python.org/pep-0008/#source-file-encoding
بررسیکننده Unnecessary-Dunder-Call
نام دقیق این بررسیکننده unnecessary-dunder-call است.
پیامهای بررسیکننده Unnecessary-Dunder-Call
- unnecessary-dunder-call (C2801)
- فراخوانی غیرضروری متد داندر (dunder) %s. %s. زمانی استفاده میشود که یک متد dunder بهجای استفاده از تابع/متد/عملگر متناظر، به صورت دستی فراخوانی شود.
بررسیکننده Unnecessary Ellipsis
نام دقیق این بررسیکننده unnecessary_ellipsis است.
پیامهای بررسیکننده Unnecessary Ellipsis
- unnecessary-ellipsis (W2301)
- ثابت سه
نقطه (ellipsis)
غیرضروری
زمانی
استفاده
میشود که
با ثابت ellipsis
مواجه شده و
امکان
اجتناب از
آن وجود
دارد. یک خط
کد متشکل از
یک ellipsis
غیرضروری
است اگر یک
docstring در خط
قبلی وجود
داشته باشد
یا دستوری
در همان
حوزه (scope)
موجود باشد.
نام دقیق این بازبین unsupported_version است.
پیامهای بازبین نسخههای پشتیبانینشده (Unsupported Version)
- using-f-string-in-unsupported-version (W2601)
- رشتههای f-string توسط همه نسخههای موجود در تنظیم py-version پشتیبانی نمیشوند زمانی استفاده میشود که py-version تعیینشده توسط کاربر کمتر از 3.6 باشد و pylint با یک f-string مواجه شود.
- using-final-decorator-in-unsupported-version (W2602)
- قابلیت typing.final توسط همه نسخههای موجود در تنظیم py-version پشتیبانی نمیشود زمانی استفاده میشود که py-version تعیینشده توسط کاربر کمتر از 3.8 باشد و pylint با دکوراتور typing.final مواجه شود.
- using-exception-groups-in-unsupported-version (W2603)
- گروههای استثنا (Exception groups) توسط همه نسخههای موجود در تنظیم py-version پشتیبانی نمیشوند زمانی استفاده میشود که py-version تعیینشده توسط کاربر کمتر از 3.11 باشد و pylint با except* یا ExceptionGroup` مواجه شود.
- using-generic-type-syntax-in-unsupported-version (W2604)
- نحو نوع عمومی (Generic type syntax براساس PEP 695) توسط همه نسخههای موجود در تنظیم py-version پشتیبانی نمیشود زمانی استفاده میشود که py-version تعیینشده توسط کاربر کمتر از 3.12 باشد و pylint با نحو نوع عمومی مواجه شود.
- using-assignment-expression-in-unsupported-version (W2605)
- عبارت انتساب (Assignment expression) توسط همه نسخههای موجود در تنظیم py-version پشتیبانی نمیشود زمانی استفاده میشود که py-version تعیینشده توسط کاربر کمتر از 3.8 باشد و pylint با عملگر عبارت انتساب (walrus) مواجه شود.
- using-positional-only-args-in-unsupported-version (W2606)
- آرگومانهای فقطموقعیتی (Positional-only) توسط همه نسخههای موجود در تنظیم py-version پشتیبانی نمیشوند زمانی استفاده میشود که py-version تعیینشده توسط کاربر کمتر از 3.8 باشد و pylint با آرگومانهای فقطموقعیتی مواجه شود.
بازبین متغیرها (Variables)
نام دقیق این بازبین variables است.
همچنین مستندات گزینههای بازبین variables را ببینید <#variables-options>
پیامهای بازبین متغیرها (Variables)
- used-before-assignment (E0601)
- استفاده از متغیر %r پیش از مقداردهی زمانی صادر میشود که به یک متغیر محلی پیش از مقداردهی آن دسترسی پیدا شود. فرض میشود که مقداردهیها در بلوکهای try هنگام ارزیابی بلوکهای مرتبط except/finally رخ ندادهاند. همچنین فرض میشود مقداردهیها در بلوکهای except هنگام ارزیابی دستورات خارج از بلوک رخ ندادهاند، مگر زمانی که بلوک try مرتبط حاوی دستور return باشد.
- undefined-variable (E0602)
- متغیر تعریفنشده %r زمانی استفاده میشود که به یک متغیر تعریفنشده دسترسی پیدا شود.
- undefined-all-variable (E0603)
- نام متغیر تعریفنشده %r در __all__ زمانی استفاده میشود که در __all__ به نام یک متغیر تعریفنشده ارجاع داده شود.
- invalid-all-object (E0604)
- شیء نامعتبر %r در __all__، باید تنها شامل رشتهها باشد زمانی استفاده میشود که یک شیء نامعتبر (غیررشتهای) در __all__ قرار گیرد.
- invalid-all-format (E0605)
- قالب نامعتبر برای __all__، باید چندتایی (tuple) یا لیست باشد زمانی استفاده میشود که __all__ قالب نامعتبری داشته باشد.
- possibly-used-before-assignment (E0606)
- احتمال استفاده از متغیر %r پیش از مقداردهی زمانی صادر میشود که به یک متغیر محلی پیش از مقداردهی آن در هر دو شاخه یک ساختار شرطی if/else دسترسی پیدا شود.
- no-name-in-module (E0611)
- نام %r در ماژول %r وجود ندارد زمانی استفاده میشود که نامی در یک ماژول پیدا نشود.
- unpacking-non-sequence (E0633)
- تلاش برای بازکردن (unpack) یک شیء غیردنبالهای%s زمانی استفاده میشود که چیزی که یک توالی (sequence) نیست در یک انتساب بازکردن استفاده شود.
- potential-index-error (E0643)
- اندیس نامعتبر برای طول شیء تکرارپذیر زمانی صادر میشود که یک اندیسِ استفادهشده روی یک شیء تکرارپذیر (iterable)، فراتر از طول آن شیء برود.
- global-variable-undefined (W0601)
- متغیر سراسری %r در سطح ماژول تعریف نشده است زمانی استفاده میشود که متغیری از طریق دستور "global" مشخص شود اما آن متغیر در حوزه (scope) ماژول تعریف نشده باشد.
- global-variable-not-assigned (W0602)
- استفاده از global برای %r اما هیچ مقداردهی انجام نشده است هنگامی که متغیری در حوزه سراسری تعریف شده و در حوزهای درونی تغییر داده میشود، کلیدواژه 'global' در حوزه درونی تنها در صورتی لازم است که یک عملیات مقداردهی در آن حوزه درونی انجام شود.
- global-statement (W0603)
- استفاده از دستور global زمانی استفاده میشود که از دستور "global" برای بهروزرسانی یک متغیر سراسری استفاده کنید. Pylint استفاده از آن را توصیه نمیکند؛ این به این معنی نیست که نمیتوانید از آن استفاده کنید!
- global-at-module-level (W0604)
- استفاده از دستور global در سطح ماژول زمانی استفاده میشود که از دستور "global" در سطح ماژول استفاده کنید، چرا که هیچ تأثیری ندارد.
- unused-import (W0611)
- مورد استفادهنشده %s زمانی استفاده میشود که یک ماژول یا متغیر واردشده (imported) مورد استفاده قرار نگیرد.
- unused-variable (W0612)
- متغیر استفادهنشده %r زمانی استفاده میشود که یک متغیر تعریف شده باشد اما استفاده نشود.
- unused-argument (W0613)
- آرگومان استفادهنشده %r زمانی استفاده میشود که آرگومان یک تابع یا متد مورد استفاده قرار نگیرد.
- unused-wildcard-import (W0614)
- مورد(های) واردشده استفادهنشده %s از واردسازی عمومی (wildcard) متعلق به %s زمانی استفاده میشود که یک ماژول یا متغیر واردشده از طریق شیوه واردسازی 'from X import *' مورد استفاده قرار نگیرد.
- redefined-outer-name (W0621)
- تعریف مجدد نام %r از حوزه بیرونی (خط %s) زمانی استفاده میشود که نام یک متغیر، نام تعریفشده در یک حوزه بیرونی یا گرداننده except را بپوشاند.
- redefined-builtin (W0622)
- تعریف مجدد شناسه توکار %r زمانی استفاده میشود که یک متغیر یا تابع، یک شناسه توکار (built-in) را بازنویسی کند.
- undefined-loop-variable (W0631)
- استفاده از متغیر حلقه احتمالاً تعریفنشده %r زمانی استفاده میشود که یک متغیر حلقه (یعنی متغیری که توسط حلقه for، تعریف فشرده لیست یا عبارت مولد تعریف شده) در خارج از حلقه استفاده شود.
- unbalanced-tuple-unpacking (W0632)
- احتمال بازکردن نامتوازن چندتایی با دنباله %s: سمت چپ دارای %d برچسب%s و سمت راست دارای %d مقدار%s است زمانی استفاده میشود که در انتساب، بازکردن نامتوازن چندتایی (tuple) رخ دهد.
- cell-var-from-loop (W0640)
- متغیر سلولی %s در حلقه تعریف شده است متغیری که در یک بستار (closure) استفاده شده، در یک حلقه تعریف شده است. این امر باعث میشود که تمام بستارها از مقدار یکسانی برای متغیر محصورشده استفاده کنند.
- possibly-unused-variable (W0641)
- متغیر احتمالاً استفادهنشده %r زمانی استفاده میشود که متغیری تعریف شده باشد اما ممکن است استفاده نشود. این احتمال از این واقعیت ناشی میشود که تابع locals() ممکن است استفاده شده باشد، که میتواند متغیر مذکور را مصرف کند یا نکند.
- self-cls-assignment (W0642)
- مقداردهی نامعتبر به %s در متد مقداردهی نامعتبر به self یا cls به ترتیب در متد نمونه یا کلاسی.
- unbalanced-dict-unpacking (W0644)
- احتمال
بازکردن
نامتوازن
دیکشنری با
%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
بررسیکننده Broad Try Clause
این بررسیکننده توسط pylint.extensions.broad_try_clause ارائه میشود. نام دقیق این بررسیکننده broad_try_clause است.
همچنین مستندات گزینههای بررسیکننده broad_try_clause را ببینید <#broad-try-clause-options>
پیامهای بررسیکننده Broad Try Clause
- too-many-try-statements (W0717)
- بند try شامل دستورهای بسیار زیادی است.
بررسیکننده Code Style
این بررسیکننده توسط pylint.extensions.code_style ارائه میشود. نام دقیق این بررسیکننده code_style است..SS مستندات بررسیکننده Code Style
بررسیکنندههایی که میتوانند یکدستی کد را بهبود ببخشند. به همین دلیل، آنها لزوماً بهبودی در عملکرد ایجاد نمیکنند و اغلب اوقات سلیقهای هستند.
همچنین مستندات گزینههای بررسیکننده code_style را در <#code-style-options> ببینید.
پیامهای بررسیکننده Code Style
- consider-using-namedtuple-or-dataclass (R6101)
- استفاده از namedtuple یا dataclass را برای مقادیر دیکشنری در نظر بگیرید هنگامی صادر میشود که مقادیر دیکشنری بتوانند با نمونههای namedtuple یا dataclass جایگزین شوند.
- consider-using-tuple (R6102)
- استفاده از یک tuple درجا بهجای list را در نظر بگیرید صرفاً برای یکدستی شیوهنگارش! هنگامی صادر میشود که یک list تعریفشده بهصورت درجا بتواند با یک tuple جایگزین شود. به دلیل بهینهسازیهای CPython، این کار هیچ مزیت عملکردی ندارد.
- consider-using-assignment-expr (R6103)
- بهجای آن از '%s' استفاده کنید هنگامی صادر میشود که یک انتساب if بلافاصله توسط یک دستور if دنبال شود و هر دو بتوانند با استفاده از عبارت انتساب := ترکیب شوند. نیازمند Python 3.8 و py-version >= 3.8 است.
- consider-using-augmented-assign (R6104)
- از '%s' برای انجام مستقیم انتساب افزوده استفاده کنید هنگامی صادر میشود که یک انتساب به همان شیئی ارجاع دهد که در حال تخصیص به آن است. این مورد میتواند به یک انتساب افزوده تغییر یابد. بهطور پیشفرض غیرفعال است!
- prefer-typing-namedtuple (R6105)
- 'typing.NamedTuple' را به 'collections.namedtuple' ترجیح دهید 'typing.NamedTuple' از کلیدواژه شناختهشده 'class' به همراه type-hintها برای خوانایی بهتر استفاده میکند (همچنین سریعتر است زیرا از یک فراخوانی درونی exec جلوگیری میکند). بهطور پیشفرض غیرفعال است!
- consider-math-not-float (R6106)
- استفاده از %smath.%s را بهجای %s در نظر بگیرید استفاده از math.inf یا math.nan امکان بهرهمندی از تعیین نوع (typing) را فراهم میکند و تا ۴ برابر سریعتر از فراخوانی float است (پس از درونریزی اولیه math). این بررسی همچنین خطاهای نگارشی در فراخوانیهای float را بهعنوان یک اثر جانبی شناسایی میکند.
بررسیکننده Comparison-Placement
این بررسیکننده توسط pylint.extensions.comparison_placement ارائه میشود. نام دقیق بررسیکننده comparison-placement است.
پیامهای بررسیکننده Comparison-Placement
- misplaced-comparison-constant (C2201)
- مقایسه باید به صورت %s باشد هنگامی استفاده میشود که مقدار ثابت در سمت چپ یک مقایسه قرار گیرد. معمولاً از نظر بیان منظور، قرار دادن آن در سمت راست مقایسه واضحتر است.
بررسیکننده Confusing Elif
این بررسیکننده توسط pylint.extensions.confusing_elif ارائه میشود. نام دقیق بررسیکننده confusing_elif است.
پیامهای بررسیکننده Confusing Elif
- confusing-consecutive-elif (R5601)
- elifهای متوالی با سطح تورفتگی متفاوت؛ ایجاد یک تابع را برای جداسازی elif داخلی در نظر بگیرید هنگامی استفاده میشود که یک دستور elif بلافاصله پس از یک بلوک دارای تورفتگی بیاید که خودش با if یا elif پایان یافته است. ممکن است مشخص نباشد که تورفتگی دستور elif از روی قصد برداشته شده یا به اشتباه. استخراج دستور if دارای تورفتگی در یک تابع مجزا میتواند از سردرگمی جلوگیری کرده و مانع بروز خطا شود.
بررسیکننده Consider-Using-Any-Or-All
این بررسیکننده توسط pylint.extensions.for_any_all ارائه میشود. نام دقیق بررسیکننده consider-using-any-or-all است.
پیامهای بررسیکننده Consider-Using-Any-Or-All
- consider-using-any-or-all (C0501)
- حلقه `for`
میتواند `%s`
باشد یک
حلقه for که
شرطی را
بررسی
میکند و
مقدار bool
برمیگرداند،
میتواند
با any یا all
جایگزین
شود.
این بررسیکننده توسط pylint.extensions.consider_refactoring_into_while_condition ارائه میشود. نام دقیق بررسیکننده consider_refactoring_into_while است.
پیامهای بررسیکننده Consider Refactoring Into While
- consider-refactoring-into-while-condition (R3501)
- استفاده از 'while %s' به جای 'while %s:'، یک 'if' و یک 'break' را مد نظر قرار دهید هنگامی صادر میشود که حلقهٔ while True: استفاده شده باشد و اولین دستور آن یک شرط break باشد. اگر بررسی معکوس شده و به دستور while منتقل شود، ساختار if / break را میتوان حذف کرد.
بررسیکننده Consider Ternary Expression
این بررسیکننده توسط pylint.extensions.consider_ternary_expression ارائه میشود. نام دقیق بررسیکننده consider_ternary_expression است.
پیامهای بررسیکننده Consider Ternary Expression
- consider-ternary-expression (W0160)
- بازنویسی به عنوان یک عبارت سهتایی را مد نظر قرار دهید دستورهای انتساب متعددی که در بلوکهای if/else پراکنده شدهاند را میتوان با یک انتساب واحد و عبارت سهتایی بازنویسی کرد.
بررسیکننده Deprecated Builtins
این بررسیکننده توسط pylint.extensions.bad_builtin ارائه میشود. نام دقیق بررسیکننده deprecated_builtins است.
مستندات بررسیکننده 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>
پیامهای بررسیکننده Deprecated Builtins
- bad-builtin (W0141)
- از تابع توکار %s استفاده شده است هنگامی به کار میرود که یک تابع توکار غیرمجاز استفاده شود (گزینهٔ bad-function را ببینید). توابع غیرمجاز معمول مواردی مانند map یا filter هستند که امروزه پایتون جایگزینهای تمیزتری مانند فهم لیست (list comprehension) را برای آنها ارائه میدهد.
بررسیکننده Design
این بررسیکننده توسط pylint.extensions.mccabe ارائه میشود. نام دقیق بررسیکننده design است.
مستندات بررسیکننده 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
- too-complex (R1260)
- %s بیش از حد پیچیده است. امتیاز مککیب %d است زمانی استفاده میشود که یک متد یا تابع بر اساس پیچیدگی سیکلوماتیک مککیب (McCabe) بیش از حد پیچیده باشد.
بررسیکنندهٔ Dict-Init-Mutate
این بررسیکننده توسط pylint.extensions.dict_init_mutate ارائه میشود. نام دقیق بررسیکننده dict-init-mutate است.
پیامهای بررسیکنندهٔ Dict-Init-Mutate
- dict-init-mutate (C3401)
- هنگام مقداردهی اولیه دیکشنری، تمام کلید/مقدارهای شناختهشده را تعریف کنید. دیکشنریها را میتوان با یک دستور واحد با استفاده از نحو لیترال دیکشنری مقداردهی اولیه کرد.
بررسیکنندهٔ Docstyle
این بررسیکننده توسط pylint.extensions.docstyle ارائه میشود. نام دقیق بررسیکننده docstyle است.
پیامهای بررسیکنندهٔ Docstyle
- bad-docstring-quotes (C0198)
- علامتهای نقلقول داکاسترینگ نادرست در %s، مقدار مورد انتظار """ بود ولی %s داده شد زمانی استفاده میشود که یک داکاسترینگ (docstring) سه علامت نقلقول دوتایی نداشته باشد.
- docstring-first-line-empty (C0199)
- خط اول در داکاسترینگ %s خالی است زمانی استفاده میشود که یک خط خالی در ابتدای یک داکاسترینگ یافت شود.
بررسیکنندهٔ Dunder
این بررسیکننده توسط pylint.extensions.dunder ارائه میشود. نام دقیق بررسیکننده dunder است.
همچنین مستندات گزینههای بررسیکنندهٔ dunder را ببینید: <#dunder-options>
پیامهای بررسیکنندهٔ Dunder
- bad-dunder-name (W3201)
- نام متد داندر %s نادرست است یا غلط املایی دارد. زمانی استفاده میشود که نام یک متد داندر (dunder method) دارای غلط املایی باشد یا با نامی خارج از فهرست از پیش تعریفشدهٔ نامهای داندر تعریف شده باشد.
بررسیکنندهٔ Else If Used
این بررسیکننده توسط pylint.extensions.check_elif ارائه میشود. نام دقیق بررسیکننده else_if_used است.
پیامهای بررسیکنندهٔ Else If Used
- else-if-used (R5501)
- برای حذف یک سطح تورفتگی، استفاده از "elif" را به جای "else" و سپس "if" در نظر بگیرید زمانی استفاده میشود که بلافاصله پس از یک دستور else دستور if بیاید و شامل دستورهای نامرتبط با آن نباشد.
بررسیکنندهٔ Empty-Comment
این بررسیکننده توسط pylint.extensions.empty_comment ارائه میشود. نام دقیق بررسیکننده empty-comment است.
پیامهای بررسیکنندهٔ Empty-Comment
- empty-comment (R2044)
- خط با کامنت خالی زمانی استفاده میشود که نماد # در خطی ظاهر شود که پس از آن توضیح (کامنت) واقعی نیامده باشد.
بررسیکنندهٔ Eq-Without-Hash
این بررسیکننده توسط pylint.extensions.eq_without_hash ارائه میشود. نام دقیق بررسیکننده eq-without-hash است.
پیامهای بررسیکنندهٔ Eq-Without-Hash
- eq-without-hash (W1641)
- پیادهسازی
__eq__ بدون
پیادهسازی
همزمان __hash__
زمانی
استفاده
میشود که
یک کلاس __eq__ را
پیادهسازی
کند اما __hash__
را خیر. در
صورتی که
اشیاء متد __eq__
را
پیادهسازی
کرده
باشند،
مقدار None را
به عنوان
پیادهسازی
پیشفرض __hash__
خود دریافت
خواهند کرد.
این بررسیکننده توسط pylint.extensions.private_import ارائه میشود. نام دقیق این بررسیکننده import-private-name است.
پیامهای بررسیکننده Import-Private-Name
- import-private-name (C2701)
- Imported private %s (%s) زمانی استفاده میشود که یک ماژول یا شیء خصوصی با پیشوند _ وارد شود. راهنمای PEP8 در مورد قراردادهای نامگذاری بیان میکند که مشخصههای عمومی با زیرخط آغازین باید خصوصی در نظر گرفته شوند.
بررسیکننده Magic-Value
این بررسیکننده توسط pylint.extensions.magic_value ارائه میشود. نام دقیق این بررسیکننده magic-value است.
همچنین مستندات گزینههای بررسیکننده magic-value را ببینید <#magic-value-options>
پیامهای بررسیکننده Magic-Value
- magic-value-comparison (R2004)
- Consider using a named constant or an enum instead of '%s'. استفاده از ثابتهای نامدار به جای مقادیر جادویی به بهبود خوانایی و نگهداریپذیری کد شما کمک میکند؛ سعی کنید در مقایسهها از آنها اجتناب کنید.
بررسیکننده Multiple Types
این بررسیکننده توسط pylint.extensions.redefined_variable_type ارائه میشود. نام دقیق این بررسیکننده multiple_types است.
پیامهای بررسیکننده Multiple Types
- redefined-variable-type (R0204)
- Redefinition of %s type from %s to %s زمانی استفاده میشود که نوع یک متغیر درون یک متد یا تابع تغییر کند.
بررسیکننده No Self Use
این بررسیکننده توسط pylint.extensions.no_self_use ارائه میشود. نام دقیق این بررسیکننده no_self_use است.
پیامهای بررسیکننده No Self Use
- no-self-use (R6301)
- Method could be a function زمانی استفاده میشود که یک متد از نمونه مقید (bound instance) خود استفاده نمیکند، و بنابراین میتواند به صورت یک تابع نوشته شود.
بررسیکننده Overlap-Except
این بررسیکننده توسط pylint.extensions.overlapping_exceptions ارائه میشود. نام دقیق این بررسیکننده overlap-except است.
پیامهای بررسیکننده Overlap-Except
- overlapping-except (W0714)
- Overlapping exceptions (%s) زمانی استفاده میشود که استثناها در گرداننده (handler) همپوشانی داشته یا یکسان باشند.
بررسیکننده Parameter Documentation
این بررسیکننده توسط pylint.extensions.docparams ارائه میشود. نام دقیق این بررسیکننده parameter_documentation است.
مستندات بررسیکننده 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
پارامترهای سازنده (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
- multiple-constructor-doc (W9005)
- "%s" دارای پارامترهای سازنده مستندشده در کلاس و __init__ است لطفاً اعلانهای پارامتر را در کلاس یا سازنده حذف کنید.
- missing-raises-doc (W9006)
- پرتاب شدن "%s" مستند نشده است لطفاً برای تمام انواع استثناهای پرتابشده، استثناها را مستند کنید.
- redundant-returns-doc (W9008)
- مستندات بازگشت (returns) زائد است لطفاً مستندات return/rtype را از این متد حذف کنید.
- redundant-yields-doc (W9010)
- مستندات yields زائد است لطفاً مستندات yields را از این متد حذف کنید.
- missing-return-doc (W9011)
- مستندات بازگشت (return) وجود ندارد لطفاً مستنداتی درباره آنچه این متد بازمیگرداند اضافه کنید.
- missing-return-type-doc (W9012)
- مستندات نوع بازگشتی وجود ندارد لطفاً نوع بازگرداندهشده توسط این متد را مستند کنید.
- missing-yield-doc (W9013)
- مستندات yield وجود ندارد لطفاً مستنداتی درباره آنچه این مولد (generator) تولید میکند اضافه کنید.
- missing-yield-type-doc (W9014)
- مستندات نوع yield وجود ندارد لطفاً نوع تولیدشده (yielded) توسط این متد را مستند کنید.
- missing-param-doc (W9015)
- "%s" در مستندات پارامترها وجود ندارد لطفاً اعلانهای پارامتر را برای همه پارامترها اضافه کنید.
- missing-type-doc (W9016)
- "%s" در مستندات نوع پارامتر وجود ندارد لطفاً اعلانهای نوع پارامتر را برای همه پارامترها اضافه کنید.
- differing-param-doc (W9017)
- "%s" در مستندات پارامتر مغایرت دارد لطفاً نامهای پارامترها را در اعلانها بررسی کنید.
- differing-type-doc (W9018)
- "%s" در مستندات نوع پارامتر مغایرت دارد لطفاً نامهای پارامترها را در اعلانهای نوع بررسی کنید.
- useless-param-doc (W9019)
- مستندات بیاستفاده برای پارامتر نادیدهگرفتهشده "%s" لطفاً مستندات پارامتر نادیدهگرفتهشده را حذف کنید.
- useless-type-doc (W9020)
- مستندات نوع بیاستفاده برای پارامتر نادیدهگرفتهشده "%s" لطفاً مستندات نوع پارامتر نادیدهگرفتهشده را حذف کنید.
- missing-any-param-doc (W9021)
- هیچ مستنداتی در "%s" وجود ندارد لطفاً مستندات پارامتر و/یا نوع را اضافه کنید.
بررسیکننده Redefined-Loop-Name
این بررسیکننده توسط pylint.extensions.redefined_loop_name ارائه میشود. نام دقیق این بررسیکننده redefined-loop-name است.
پیامهای بررسیکننده Redefined-Loop-Name
- redefined-loop-name (W2901)
- تعریف دوباره %r از حلقه (خط %s) زمانی استفاده میشود که متغیر حلقه در بدنهٔ حلقه بازنویسی شود.
بررسیکننده Set Membership
این بررسیکننده توسط pylint.extensions.set_membership ارائه میشود. نام دقیق این بررسیکننده set_membership است.
پیامهای بررسیکننده Set Membership
- use-set-for-membership (R6201)
- استفاده
از set را برای
آزمون
عضویت در
نظر
بگیرید
آزمونهای
عضویت
زمانی که
روی یک
ساختار
داده
بهینهشده
برای جستجو
مانند sets
انجام
شوند،
کارآمدتر
هستند.
این بررسیکننده توسط pylint.extensions.typing ارائه میشود. نام دقیق بررسیکننده typing است.
مستندات بررسیکننده Typing
یافتن مشکلات مرتبط با نشانهگذاریهای نوع (type annotations).
همچنین مستندات گزینههای بررسیکننده typing را ببینید <#typing-options>
پیامهای بررسیکننده Typing
- broken-noreturn (E6004)
- 'NoReturn' درون نوعهای مرکب در نسخههای 3.7.0 / 3.7.1 دچار مشکل است استفاده از typing.NoReturn درون نوعهای مرکب در پایتون 3.7.0 و 3.7.1 دچار مشکل است. در صورتی که به دروننگری زمان اجرا (runtime introspection) وابسته نیستید، به جای آن از نشانهگذاری رشتهای استفاده کنید. برای نمونه: Callable[..., 'NoReturn']. https://bugs.python.org/issue34921
- 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
- deprecated-typing-alias (W6001)
- '%s' منسوخ شده است، به جای آن از '%s' استفاده کنید هنگامی صادر میشود که از یک نام مستعار منسوخشدهٔ نوعبندی استفاده شده باشد.
- consider-using-alias (R6002)
- '%s' در PY39 منسوخ خواهد شد، استفاده از '%s' را به جای آن در نظر بگیرید%s تنها در صورتی صادر میشود که 'runtime-typing=no' باشد و یک نام مستعار منسوخشدهٔ نوعبندی در زمینهٔ نشانهگذاری نوع در پایتون 3.7 یا 3.8 به کار رفته باشد.
- consider-alternative-union-syntax (R6003)
- استفاده از نحو جایگزین اجتماع را به جای '%s' در نظر بگیرید%s هنگامی صادر میشود که typing.Union یا typing.Optional به جای نحو خلاصهشدهٔ اجتماع به کار رود. برای نمونه، Union[int, float] به جای int | float. استفاده از نحو خلاصهشده برای اجتماعها با توصیههای نوعبندی پایتون همخوانی دارد، نیاز به وارد کردن ماژولها را رفع میکند و مانع از سردرگمی در امضای توابع میشود.
- redundant-typehint-argument (R6006)
- نوع `%s` بیش از یک بار در نشانهگذاری نوع اجتماع به کار رفته است. راهنماهای نوع اضافی را حذف کنید. آرگومانهای نوع تکراری توسط ابزار mypy نادیده گرفته خواهند شد، بنابراین برای جلوگیری از سردرگمی باید حذف شوند.
- unnecessary-default-type-args (R6007)
- نوع `%s` دارای آرگومانهای نوع پیشفرض غیرضروری است. آن را به `%s` تغییر دهید. هنگامی صادر میشود که نوعها دارای آرگومانهای نوع پیشفرضی باشند که میتوان از آنها صرفنظر کرد. بهطور عمده برای typing.Generator و typing.AsyncGenerator کاربرد دارد.
بررسیکننده While Used
این بررسیکننده توسط pylint.extensions.while_used ارائه میشود. نام دقیق بررسیکننده while_used است.
پیامهای بررسیکننده While Used
- while-used (W0149)
- استفاده از حلقهٔ `while` حلقههای نامحدود while اغلب میتوانند به صورت حلقههای محدود for بازنویسی شوند. مواردی همچون حلقههای رویداد (event loops)، شنوندهها (listeners) و غیره میتوانند استثنا باشند.
رابط برنامهنویسی (API)
به لطف رابطهای برنامهنویسی، میتوانید 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()
نحوه نوشتن یک بررسیکننده (How to Write a Checker)
میتوانید چند نمونه ساده را در توزیع بیابید (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) کد آسانتر شود.
نوشتن یک بررسیکننده AST (Writing an AST Checker)
بیایید یک بررسیکننده پیادهسازی کنیم تا مطمئن شویم همه گرههای 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 را در 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))
اکنون آمادهایم تا بررسیکنندهٔ خود را اشکالزدایی و آزمایش کنیم!
اشکالزدایی یک بررسیکننده (Debugging a Checker)
رسیدن به نقطهای که بتوانیم از 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)
اکنون میتوانیم بررسیکنندهٔ خود را اشکالزدایی کنیم!
نکته:
همچنین، ماژول افزونه میتواند با قرار دادن دایرکتوری والد این ماژول در متغیر محیطی 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 تنظیم شود.
موازیسازی یک بررسیکننده (Parallelize a Checker)
کلاس BaseChecker دارای دو متد به نامهای get_map_data و reduce_map_data است که امکان موازیسازی بررسیها را هنگام استفاده از گزینه -j فراهم میکنند. اگر یک بررسیکننده واقعاً به تجمیع و کاهش دادهها (reduce) نیاز داشته باشد، باید متد get_map_data را طوری تعریف کند که مقداری غیر از None برگرداند و اجازه دهد متد reduce_map_data آن، فهرستی از نوعهای بازگرداندهشده توسط get_map_data را مدیریت و پردازش کند.
یک نمونه از این مورد را میتوان در pylint/checkers/similar.py مشاهده کرد.
آزمایش یک بررسیکننده (Testing a Checker)
ابزار 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)
چرا یک پلاگین بنویسیم؟ (Why write a plugin?)
ابزار Pylint یک ابزار تحلیل ایستا است و Python زبانی با نوعبندی پویا میباشد. بنابراین مواردی پیش خواهد آمد که Pylint نمیتواند فایلها را بهدرستی تحلیل کند (این مشکل در زبانهایی با نوعبندی ایستا نیز در صورت استفاده از بازتاب یا ارزیابی پویا میتواند رخ دهد).
پلاگینها روشی هستند برای اینکه به Pylint بگوییم چگونه با چنین مواردی برخورد کند، زیرا تنها کاربر میداند چه کاری باید انجام شود. آنها معمولاً در سطح AST عمل میکنند و با دستکاری یا اصلاح آن، درک کد را برای Pylint سادهتر میسازند.
مثال (Example)
بیایید 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 برای درک این ساختار با مشکل مواجه خواهد شد.
ورود پلاگین (Enter Plugin)
میتوانیم یک پلاگین تبدیل بنویسیم تا به 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 مرجع فنی
راهاندازی و کلاس Linter
دو کلاس اصلی در pylint.lint عبارتند از .pylint.lint.Run و .pylint.lint.PyLinter.
شیء .pylint.lint.Run مسئول راهاندازی pylint است. این شیء بررسیهای اولیهای روی گزینههای خط فرمان دادهشده انجام میدهد تا قلاب (hook) اولیه را برای اجرا پیدا کند، فایل پیکربندی مورد استفاده را بیابد، و مشخص کند چه افزایههایی تعیین شدهاند. سپس میتواند نمونهٔ اصلی .pylint.lint.PyLinter را ایجاد کرده و آن را با فایل پیکربندی و افزایههایی که هنگام پیشپردازش گزینههای خط فرمان شناسایی شدهاند مقداردهی اولیه کند. در نهایت شیء .pylint.lint.Run هرگونه linter فرزند را برای کارهای موازی اجرا کرده و فرایند بررسی کد (linting) را آغاز مینماید.
شیء .pylint.lint.PyLinter مسئول هماهنگسازی فرایند بررسی کد است. این شیء پیکربندی را تجزیه کرده و آن را برای بررسیکنندهها و سایر افزایهها فراهم میکند، پیامهای صادرشده توسط بررسیکنندهها را پردازش مینماید، گزارشدهی خروجی را مدیریت میکند، و بررسیکنندهها را راهاندازی میکند.
بررسیکنندهها (Checkers)
تمام بررسیکنندههای پیشفرض pylint در pylint.checkers وجود دارند. بخش عمدهٔ هوش pylint در این قسمت قرار دارد. بیشتر بررسیکنندهها مبتنی بر AST هستند و بنابراین از astroid استفاده میکنند. ماژول pylint.checkers.utils تعداد زیادی متد کمکی برای کار با astroid فراهم میکند.
مشارکت در pylint
راهنمای مشارکتکنندگان در صورتی که بخواهید در خود pylint مشارکت کنید به شما کمک خواهد کرد.
مشارکت
یافتن کاری برای انجام دادن
میخواهید در pylint مشارکت کنید؟ کارهای زیادی وجود دارد که میتوانید انجام دهید. در اینجا فهرستی از پیوندها بر اساس آنچه که میخواهید انجام دهید آمده است:
- پرسیدن سؤال در دیسکورد https://discord.com/invite/qYxpadCgkx، یا در گیتهاب https://github.com/pylint-dev/pylint/issues/new/choose
- باز کردن یک issue در <https://github.com/pylint-dev/pylint/issues/new?assignees=&labels=Needs+triage+%3Ainbox_tray%3A&template=BUG-REPORT.yml>
- بهبود مستندات https://github.com/pylint-dev/pylint/issues?q=is%3Aopen+is%3Aissue+label%3A%22Documentation+%3Agreen_book%3A%22
- بهبود پیامهای خطا https://github.com/pylint-dev/pylint/issues?q=is%3Aopen%20is%3Aissue%20project%3Apylint-dev%2Fpylint%2F4
- بازآفرینی باگها و تأیید معتبر بودن issueها https://github.com/pylint-dev/pylint/issues?q=is%3Aopen+is%3Aissue+label%3A%22Needs+reproduction+%3Amag%3A%22%2C%22Cannot+reproduce+%F0%9F%A4%B7%22
- بررسی یا اشکالزدایی مسائل پیچیده https://github.com/pylint-dev/pylint/issues?q=is%3Aopen+is%3Aissue+label%3A%22Needs+investigation+%F0%9F%94%AC%22
- طراحی یا مشخصسازی یک راهحل https://github.com/pylint-dev/pylint/issues?q=is%3Aopen+is%3Aissue+label%3A%22Needs+design+proposal+%3Alock%3A%22%2C%22Needs+specification+%3Aclosed_lock_with_key%3A%22
- ارائهٔ دیدگاه دربارهٔ بحثهای جاری https://github.com/pylint-dev/pylint/issues?q=is%3Aopen+is%3Aissue+label%3A%22Needs+decision+%3Alock%3A%22
- رفع باگها و کرشها https://github.com/pylint-dev/pylint/issues?q=is%3Aopen+is%3Aissue+label%3A%22Bug+%3Abeetle%3A%22%2C%22Crash+%F0%9F%92%A5%22
- رفع مثبتهای کاذب (False Positives) https://github.com/pylint-dev/pylint/issues?q=is%3Aopen+is%3Aissue+label%3A%22False+Positive+%F0%9F%A6%9F%22
- ایجاد قابلیتهای جدید یا رفع منفیهای کاذب (False Negatives) https://github.com/pylint-dev/pylint/issues?q=is%3Aopen+is%3Aissue+label%3A%22False+Negative+%F0%9F%A6%8B%22%2C%22Enhancement+%E2%9C%A8%22
- بازبینی pull requestها https://github.com/pylint-dev/pylint/pulls?q=is%3Aopen+is%3Apr+label%3A%22Needs+review+%F0%9F%94%8D%22
اگر یکی از نگهدارندگان pylint هستید، این موارد نیز وجود دارد:
- تریاژ و اولویتبندی issueها https://github.com/pylint-dev/pylint/issues?q=is%3Aopen+is%3Aissue+label%3A%22Needs+triage+%3Ainbox_tray%3A%22
- برچسبگذاری issueهایی که هنوز برچسب اقدامپذیری ندارند https://github.com/pylint-dev/pylint/issues?q=is%3Aopen+is%3Aissue+-label%3A%22Needs+astroid+Brain+%F0%9F%A7%A0%22+-label%3A%22Needs+astroid+update%22+-label%3A%22Needs+backport%22+-label%3A%22Needs+decision+%3Alock%3A%22+-label%3A%22Needs+investigation+%F0%9F%94%AC%22+-label%3A%22Needs+PR%22+-label%3A%22Needs+reproduction+%3Amag%3A%22+-label%3A%22Needs+review+%F0%9F%94%8D%22+-label%3A%22Needs+triage+%3Ainbox_tray%3A%22+-label%3A%22Waiting+on+author%22+-label%3A%22Work+in+progress%22+-label%3AMaintenance+sort%3Aupdated-desc+-label%3A%22Needs+specification+%3Aclosed_lock_with_key%3A%22+-label%3A%22Needs+design+proposal+%3Alock%3A%22
- آمادهسازی انتشار وصلهٔ بعدی https://github.com/pylint-dev/pylint/issues?q=is%3Aopen+is%3Aissue+label%3A%22Needs+backport%22
- بررسی وضعیت pull requestهای راکد و قدیمی https://github.com/pylint-dev/pylint/pulls?q=is%3Aopen+is%3Apr+label%3A%22Work+in+progress%22%2C%22Needs+astroid+update%22%2C%22Waiting+on+author%22
ایجاد یک Pull Request
تغییری برای 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 بهخوبی آزمایش شده و پوشش کد بالایی دارد. مشارکتهای جدید تا زمانی که شامل آزمونها نباشند پذیرفته نمیشوند.
نصب برای مشارکتکنندگان
نصب اولیه
توسعه 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
از آنجا که برای اجرای آزمونها از 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 را نصب کرده و آزمونها را با استفاده از بسته 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 پیدا کنید.
نوشتن آزمونها (Writing tests)
برنامه Pylint از سه نوع آزمون استفاده میکند: آزمونهای واحد (unittests)، آزمونهای عملکردی (functional tests) و آزمونهای primer.
- آزمونهای واحد (unittests) را میتوان در pylint/tests یافت. مگر اینکه روی بخشهای درونی pylint کار کنید، احتمالاً نیازی به نوشتن آنها نخواهید داشت.
- آزمونهای عملکردی سراسری (Global functional tests) در pylint/tests/functional قرار دارند. آنها عمدتاً برای آزمایش این که آیا Pylint پیامهای درستی صادر میکند یا خیر به کار میروند.
- آزمونهای عملکردی پیکربندی را میتوان در pylint/tests/config/functional یافت. آنها برای آزمایش نحوه بارگذاری پیکربندی Pylint استفاده میشوند.
- در آزمونهای primer <#primer-tests> میتوانید یک مخزن خارجی جدید را برای بررسی پیشنهاد دهید، اما در بیشتر مواقع کاری برای انجام دادن وجود ندارد.
آزمونهای واحد (Unittest tests)
بیشتر آزمونهای دیگر در دایرکتوری '/pylint/test' قرار دارند. این آزمونهای واحد را میتوان برای آزمایش تقریباً تمام قابلیتهای درون Pylint استفاده کرد. یک گام مناسب پیش از نوشتن هر آزمون واحد جدید، نگاه کردن به آزمونهایی است که کارکرد مشابهی را آزمایش میکنند. این کار اغلب میتواند به نوشتن آزمونهای جدید کمک کند.
اگر آزمون جدید شما به هرگونه فایل اضافی نیاز دارد، میتوانید آنها را در دایرکتوری /pylint/test/regrtest_data قرار دهید. این دایرکتوری محلی است که ما برای ذخیره دادههای مورد نیاز برای آزمونهای واحد استفاده میکنیم.
آزمونهای عملکردی (Functional tests)
این آزمونها در /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، که پیشفرض برای سایر نسخههای پایتون خواهد بود.
نکته:
محل قرارگیری فایلهای آزمون عملکردی
برای بررسیکنندههای موجود، موارد آزمون جدید ترجیحاً باید به فایل آزمون موجود ضمیمه شوند. برای بررسیکنندههای جدید، باید یک فایل جدید به نام 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]"
آزمونهای کارکردی برای پیکربندیها (Functional tests for configurations)
برای آزمایش روشهای مختلف پیکربندی 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} باشد.
پروفایلسازی و تحلیل کارایی (Profiling and performance analysis)
تحلیل کارایی برای Pylint (Performance analysis for Pylint)
برای تحلیل کارایی 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
نمای کلی پلتفرم
سرویس 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) و نامزدهای بالقوه برای اهداف فازینگ آینده مفید است.
گزارش باگها (Bug reports)
گزارشهای باگ برای خرابیهای جدید بهطور خودکار در ردیاب باگ OSS-Fuzz با برچسب astroid ثبت میشوند https://issues.oss-fuzz.com/issues?q=project:astroid%20status:open. اطمینان حاصل کنید که برای مشاهدهٔ تمام مسائل (issues) موجود، وارد سیستم شدهاید.
نگهداری ساخت (Build maintenance)
گوگل اهداف فازینگ کامپایلشده را روی ماشینهای مجازی Google Compute Engine اجرا میکند. این معماری نیازمند این است که هر پروژه یک Dockerfile و اسکریپت build.sh برای دانلود کد، پیکربندی وابستگیها، کامپایل اهداف فازینگ و بستهبندی فایلهای corpus ارائه دهد.
فایلهای ساخت و کد اهداف فازینگ مربوط به astroid را میتوان در مخزن OSS-Fuzz یافت https://github.com/google/oss-fuzz/blob/master/projects/astroid.
اگر وابستگیها تغییر کنند یا اهداف فازینگ جدیدی اضافه شوند، ممکن است لازم باشد فایلهای ساخت را تغییر دهید و یک ایمیج Docker جدید برای OSS-Fuzz بسازید.
ساخت یک ایمیج (Building an image)
دستورهای زیر را برای ساخت ایمیج 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 ارسال شود.
اشکالزدایی شکستهای ساخت (Debugging build failures)
میتوانید شکستهای ساخت در مرحلهٔ 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 داخل کانتینر قرار خواهد داشت.
پیوندهای سریع (Quick links)
- داشبورد OSS-Fuzz https://oss-fuzz.com
- فایلهای پیکربندی، اسکریپتهای ساخت و اهداف فازینگ OSS-Fuzz برای astroid https://github.com/google/oss-fuzz/tree/master/projects/astroid
- تمام باگهای باز OSS-Fuzz برای astroid https://issues.oss-fuzz.com/issues?q=project:astroid%20status:open
- مستندات OSS-Fuzz گوگل https://google.github.io/oss-fuzz
انتشار یک نسخه pylint (Releasing a pylint version)
خب، میخواهید نسخهٔ X.Y.Z از pylint را منتشر کنید؟
انتشار یک نسخه اصلی یا فرعی (Releasing a major or minor version)
پیش از انتشار یک نسخه اصلی یا فرعی، بررسی کنید آیا کامیتهای منتشرنشدهای در شاخهٔ نگهداری (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) منتشر کنید
انتشار یک نسخه وصله (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)
مدیریت milestoneها
مواردی (issues) را که انجام نشدهاند به milestone بعدی منتقل میکنیم و تنها در صورتی انتشار را متوقف (block) میکنیم که issueهای بازی با برچسب blocker وجود داشته باشند.
راهبری (Governance)
چگونه بخشی از پروژه شویم؟
چگونه یک مشارکتکننده شویم؟
- منشور اخلاقی را رعایت کنید
- پیش از درخواست کمک، خودتان جستجو کنید
- یک issue باز کنید
- یک issue را بررسی کرده و یافتههای خود را گزارش دهید
- اگر احساس میکنید تغییری مورد توافق همگان است، مستقیماً یک درخواست ادغام باز کنید
گزارش دادن یک باگ، خود به تنهایی به معنای مشارکتکننده بودن است..SS چگونه یک triager شویم؟
- •
- یک افزونه pylint ایجاد کنید، سپس آن را به سازمان گیتهاب 'pylint-dev' انتقال دهید.
یا:
- در بیش از ۳ انتشار بهطور مستمر مشارکت داشته باشید.
- بیش از حد متعصب نباشید، از مرامنامه اخلاقی (code of conduct) بدون تحمیل بار روانی بر نگهدارندگان پیروی کنید. این بدان معنا نیست که اختلافنظر ناممکن است، بلکه صرفاً استدلالها باید فنی و منطقی باقی بمانند تا گفتگو محترمانه و سازنده باشد.
- یکی از نگهدارندگان بدون آنکه خودتان درخواست کرده باشید، پیشنهاد دهد که triager شوید
- تأیید به اتفاق آرا یا موافقت خنثی (بدون مخالفت) را از نگهدارندگان فعلی به دست آورید.
چگونه یک نگهدارنده (maintainer) شویم؟
- •
- مسئولیت بخشی از کد را بر عهده بگیرید که در حال حاضر به خوبی نگهداری نمیشود یا خودتان شخصاً در آن مشارکت داشتهاید (اگر احساس کنیم نمیتوانیم چیزی را بدون بازبینی شما ادغام کنیم، بهزودی قادر خواهید بود خودتان آنها را ادغام کنید).
یا:
- دو درخواست ادغام (merge request) بزرگِ کد را در طول چندین انتشار ارائه دهید (برای مثال یک checker در نسخه 2.13 و باگ متعاقب آن پس از انتشار، و یک رفع باگ پیچیده در 2.14). در غیر این صورت، مشارکت مستمر در بیش از ۳ انتشار همراه با مهارتهای فنی و فردی عالی.
- ارزیابی گزارشها (triage) به مدت چندین ماه (بستن موارد تکراری، مرتبسازی مسائل، پاسخ به پرسشها...).
- یکی از مدیران (admin) بدون آنکه خودتان درخواست کرده باشید، پیشنهاد دهد که maintainer شوید
- تأیید به اتفاق آرا یا موافقت خنثی را از نگهدارندگان فعلی به دست آورید.
چگونه یک مدیر (admin) شویم؟
- با چندصد کامیت در یک دوره زمانی طولانی همراه با مهارتهای ارتباطی عالی و کیفیت کد بالا مشارکت کنید.
- نگهداری از pylint به مدت چندین سال (بازبینی کد، تریاژ و وظایف نگهداری).
- در این مقطع، احتمالاً باید مدیر دیگری پروژه را ترک کرده باشد یا برای سالها غیرفعال شده باشد.
- یکی از مدیران بدون آنکه خودتان درخواست کرده باشید، پیشنهاد دهد که admin شوید.
- تأیید به اتفاق آرا یا موافقت خنثی را از مدیران فعلی به دست آورید.
تصمیمگیریها چگونه انجام میشوند؟
از همگان انتظار میرود از مرامنامه اخلاقی پیروی کنند. pylint یک عملسالاری (do-ocracy) / مردمسالاری است. شما مجاز نیستید به صرف مشارکت زیاد، رفتار نامناسبی داشته باشید. اما اگر قرار نیست در آینده کارهای نگهداری را انجام دهید، ممکن است نظرات معتبر شما توسط کسانی که تحت تأثیر آن قرار میگیرند در نظر گرفته نشود.
اصول بنیادین توسعه pylint چیستند؟
عمومی:
- ما درستی (صحت) را بر عملکرد ترجیح میدهیم، زیرا pylint در وهله اول بهخاطر عملکردش استفاده نمیشود. کارایی همچنان مهم است و باید از همان آغاز مد نظر قرار گیرد.
- سپس اگر دستیابی به درستی ناممکن باشد، منفیهای کاذب را بر مثبتهای کاذب ترجیح میدهیم.
- ما تلاش میکنیم پیکربندی را معقول نگه داریم، اما اگر نیاز به اتخاذ تصمیم دشواری باشد، یک گزینه اضافه میکنیم تا pylint (پس از پیکربندی) با شرایط گوناگون سازگار شود (multiple sizes fit all).
مکان افزودن یک checker یا پیام جدید:
- پیامهای خطا (مواردی که در صورت اجرا منجر به خطا خواهند شد) باید بررسیهای توکار (builtin) باشند که بهطور پیشفرض فعال هستند
- پیامهایی که حتی اندکی سلیقهای (opinionated) هستند، باید اختیاری (opt-in) باشند (به عنوان افزونه اضافه شوند <#plugins>)
- ما از
بررسیهای
سلیقهای
(مانند while checker)
رویگردان
نیستیم،
اما چیزی به
نام «بیش از
حد
سلیقهای»
وجود دارد؛
اگر چیزی
بیش از حد
سلیقهای
باشد باید
یک افزونه
خارجی pylint
باشد <#plugins>.
هنگامی که درباره موضوعی توافق نظر وجود نداشته باشد، کاربران، نگهدارندگان و مدیران تا رسیدن به توافق گفتگو میکنند.
بسته به دشواری گفتگو و اهمیت تصمیمگیری سریع، تصمیم میتواند به روشهای زیر اتخاذ شود:
- بهصورت متفقالقول میان شرکتکنندگان در گفتگو، مشارکتکنندگان و نگهدارندگان (ترجیحاً)
- با نظرسنجی از شرکتکنندگان در گفتگو با استفاده از ایموجی در issue و سپس اعمال نظر اکثریت، در صورتی که هیچ نگهدارندهای نظر سرسختانهای در مورد موضوع نداشته باشد.
- با نظر اکثریت مدیران، در صورتی که هیچ مدیری نظر سرسختانهای در مورد موضوع نداشته باشد.
- با نظرسنجی از همه کاربران در یک issue جدید که برای چندین ماه سنجاق (pin) خواهد شد، پیش از تصمیمگیری، در صورتی که دو مدیر نظرات متضاد و سرسختانهای نسبت به موضوع داشته باشند. هنگامی که نتیجه مشخص شد، تصمیم اکثریت دیگر جای بحث نخواهد داشت.
Pyreverse
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 برای تحلیل است.
گزینههای موجود در دستهبندیهای زیر سازماندهی شدهاند:
- فیلترسازی و محدوده - کنترل اینکه کدام کلاسها و روابط در نمودارهای شما ظاهر شوند
- گزینههای نمایش - سفارشیسازی ظاهر بصری شامل رنگها و برچسبها
- کنترل خروجی - انتخاب قالبهای خروجی و تنظیم دایرکتوری مقصد
- پیکربندی پروژه - تعیین تنظیمات پروژه مانند ریشههای سورس و فایلهای نادیدهگرفتهشده
--all-ancestors
نمایش تمام نیاکان (اجداد) همهٔ کلاسها در <projects>.
پیشفرض: None
--all-associated
نمایش تمام کلاسهای مرتبط با کلاسهای هدف، شامل وابستگیهای غیرمستقیم.
پیشفرض: None
--class
ایجاد یک نمودار کلاس با تمام کلاسهای مرتبط با <class>؛ این گزینه بهطور پیشفرض از گزینههای -ASmy استفاده میکند.
پیشفرض: None
--filter-mode
فیلتر کردن ویژگیها و توابع مطابق با <mode>. حالتهای معتبر عبارتند از: 'PUB_ONLY' فیلتر کردن تمام ویژگیهای غیرعمومی [پیشفرض]، معادل PRIVATE+SPECIAL 'ALL' بدون فیلتر 'SPECIAL' فیلتر کردن توابع خاص پایتون به جز سازنده (constructor) 'OTHER' فیلتر کردن ویژگیهای محافظتشده و خصوصی
پیشفرض: PUB_ONLY
--max-depth
حداکثر عمق بستهها/پیمانهها برای گنجاندن در نمودار، نسبت به عمیقترین بستهٔ مشخصشده. عمق ۰ تنها بستهها/پیمانههای مشخصشده را نشان میدهد، در حالی که ۱ فرزندان بیواسطهٔ آنها را در بر میگیرد و به همین ترتیب. هنگام مشخص کردن بستههای تو در تو، عمق از عمیقترین سطح بسته محاسبه میشود. در صورت عدم تعیین، تمام بستهها/پیمانهها در سلسلهمراتب نمایش داده میشوند.
پیشفرض: None
--show-ancestors
نمایش <ancestor> نسل از کلاسهای نیا که در <projects> نیستند.
پیشفرض: None
--show-associated
نمایش <association_level> سطح از کلاسهای مرتبط که در <projects> نیستند.
پیشفرض: None
--show-builtin
گنجاندن اشیاء توکار (builtin) در نمایش کلاسها.
پیشفرض: False
--show-stdlib
گنجاندن اشیاء کتابخانهٔ استاندارد در نمایش کلاسها.
پیشفرض: False
گزینههای نمایش (Display Options)
--color-palette
فهرستی از رنگها جداشده با ویرگول برای رنگآمیزی بر اساس عمق بسته.
پیشفرض: ('#77AADD', '#99DDFF', '#44BB99', '#BBCC33', '#AAAA00', '#EEDD88', '#EE8866', '#FFAABB', '#DDDDDD')
--colorized
استفاده از خروجی رنگی. کلاسها/پیمانههای متعلق به یک بسته رنگ یکسانی دریافت میکنند.
پیشفرض: False
--max-color-depth
استفاده از رنگهای جداگانه تا عمق بستهٔ <depth>. در اعماق بیشتر مجدداً از رنگها استفاده خواهد شد.
پیشفرض: 2
--module-names
گنجاندن نام پیمانه در نمایش کلاسها.
پیشفرض: None
--no-standalone
تنها نمایش گرههای دارای اتصال.
پیشفرض: False
--only-classnames
عدم نمایش ویژگیها و متدها در کادرهای کلاس؛ این گزینه مقادیر -f را غیرفعال میکند.
پیشفرض: False.SS کنترل خروجی (Output Control)
--output
در صورت در دسترس بودن قالب، یک فایل خروجی *.<format> ایجاد میکند. قالبهای در دسترس عبارتند از: .dot، .puml، .plantuml، .mmd، .html. برای هر قالب دیگری تلاش میشود با استفاده از ابزار خط فرمان 'dot' ایجاد گردد، که نیازمند نصب graphviz است. در این حالت، این قالبهای اضافی در دسترس خواهند بود (ببینید: `قالبهای خروجی Graphviz https://graphviz.org/docs/outputs`_).
پیشفرض: dot
--output-directory
مسیر دایرکتوری خروجی را تنظیم میکند.
پیشفرض: ""
پیکربندی پروژه (Project Configuration)
--ignore
فایلها یا دایرکتوریهایی که باید نادیده گرفته شوند. این موارد باید نام پایه باشند، نه مسیر.
پیشفرض: ('CVS',)
--project
نام پروژه را تعیین میکند. این نام بعداً به انتهای نام فایلهای خروجی افزوده خواهد شد.
پیشفرض: ""
--source-roots
مسیرهایی را به فهرست ریشههای سورس (source roots) اضافه میکند. از الگوهای تطبیق (globbing) پشتیبانی میکند. ریشه سورس، یک مسیر مطلق یا مسیری نسبت به دایرکتوری کاری فعلی است که برای تعیین فضای نام بسته برای ماژولهای مستقر ذیل ریشه سورس به کار میرود.
پیشفرض: ()
--verbose
خروجی pyreverse را پرجزئیاتتر (verbose) میکند. عمدتاً برای اشکالزدایی مفید است.
پیشفرض: False
نمونه خروجی (Example Output)
نمودارهای نمونه تولیدشده با قالب خروجی .puml در زیر نشان داده شدهاند.
نمودار بسته (Package Diagram)
[تصویر: نمودار بسته تولیدشده توسط pyreverse] [تصویر]
نمودار کلاس (Class Diagram)
[تصویر: نمودار کلاس تولیدشده توسط pyreverse] [تصویر]
ایجاد نمودار کلاس برای کلاسهای خاص (Creating Class Diagrams for Specific Classes)
در بسیاری از موارد، ایجاد یک نمودار واحد که همه کلاسهای موجود در پروژه را به تصویر بکشد، به نموداری غولپیکر و دشوار برای مدیریت منجر میشود. در حالی که محدود کردن مسیر ورودی به یک بسته یا ماژول منفرد میتواند تا حد زیادی به کوچکتر کردن دامنه کمک کند، گزینه -c روش دیگری برای ایجاد نمودار کلاس با تمرکز بر یک کلاس منفرد و وابستگیهای همکار آن (collaborators) ارائه میدهد. برای مثال، اجرای:
pyreverse -ASmy -c pylint.checkers.classes.ClassChecker pylint
نمودارهای کامل کلاس و بسته را برای pylint تولید میکند، اما علاوه بر آن فایلی با نام pylint.checkers.classes.ClassChecker.dot را نیز ایجاد خواهد کرد: [تصویر: نمودار بسته تولیدشده توسط pyreverse] [تصویر]
Symilar
اسکریپت کنسولی 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 بر اساس دستهبندی است.
تازههای Pylint 4.0
:انتشار: 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)
در Pylint 4.0.6 چه مواردی جدید است؟
تاریخ انتشار: 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)
چه مواردی در Pylint 4.0.5 جدید است؟ (What's new in Pylint 4.0.5?)
تاریخ انتشار: 2026-02-20
مثبتهای کاذب برطرفشده (False Positives Fixed)
- رفع مثبت
کاذب 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)
سایر رفع اشکالها (Other Bug Fixes)
- رفع نادیده
گرفته شدن
پیکربندی
--known_third_party.
بستن #10801 (#10801 https://github.com/pylint-dev/pylint/issues/10801)
- رفع نگاشت
پویای رنگ
برای
پیامهای
"fail-on" هنگام
استفاده از
چند قالب
reporter/خروجی.
بستن #10825 (#10825 https://github.com/pylint-dev/pylint/issues/10825)
- وابستگی به
isort اکنون روی
<9 تنظیم شده
است که
امکان
استفاده از
isort 8 را فراهم
میکند.
بستن #10857 (#10857 https://github.com/pylint-dev/pylint/issues/10857)
چه مواردی در Pylint 4.0.4 جدید است؟ (What's new in Pylint 4.0.4?)
تاریخ انتشار: 2025-11-30
مثبتهای کاذب برطرفشده (False Positives Fixed)
- رفع مثبت
کاذب برای
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)
چه مواردی در Pylint 4.0.3 جدید است؟ (What's new in Pylint 4.0.3?)
تاریخ انتشار: 2025-11-13
مثبتهای کاذب برطرفشده (False Positives Fixed)
- افزودن
متدهای 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)
- گزینهٔ 'ignore'
دوباره طبق
انتظار کار
میکند.
بستهشده در #10669 (#10669 https://github.com/pylint-dev/pylint/issues/10669)
- رفع کرش
برای consider-using-assignment-expr
هنگامی که
حاشیهنویسی
متغیر بدون
انتساب به
عنوان
عبارت
آزمون if
استفاده
میشود.
بستهشده در #10707 (#10707 https://github.com/pylint-dev/pylint/issues/10707)
- رفع کرش
برای prefer-typing-namedtuple و
consider-math-not-float هنگام
فراخوانی
یک شیء slice.
بستهشده در #10708 (#10708 https://github.com/pylint-dev/pylint/issues/10708)
چه مواردی در Pylint 4.0.2 جدید است؟
تاریخ انتشار: 2025-10-20
موارد مثبت کاذب رفعشده (False Positives Fixed)
- رفع مثبت
کاذب برای
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)
چه مواردی در Pylint 4.0.1 جدید است؟
تاریخ انتشار: 2025-10-14
موارد مثبت کاذب رفعشده (False Positives Fixed)
- مستثنی
کردن __all__ و
__future__.annotations از
بررسی unused-variable.
بستهشده در #10019 (#10019 https://github.com/pylint-dev/pylint/issues/10019)
- رفع مثبت
کاذب برای
bare-name-capture-pattern در
صورت
استفاده از
case guard.
بستهشده در #10647 (#10647 https://github.com/pylint-dev/pylint/issues/10647)
- بررسی enumهای
ایجادشده
با نحو
تابعی Enum()
جهت مطابقت
با --class-rgx برای
بررسی invalid-name / C0103
<#invalid-name>،
همانند
سایر enumها.
بستهشده در #10660 (#10660 https://github.com/pylint-dev/pylint/issues/10660)
چه مواردی در Pylint 4.0.0 جدید است؟
تاریخ انتشار: 2025-10-12
تغییرات ساختارشکن (Breaking Changes)
- بررسی 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)
- •
- comparison-of-constants اکنون بهجای قالببندی مجدد از مقادیر گره، از یونیکد حاصل از ast استفاده میکند تا از
- برخی قالببندیهای نادرست ناشی از محدودیت 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)
بررسیهای جدید (New Checks)
- افزودن
بررسیکننده
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)
منفیهای کاذب برطرفشده (False Negatives Fixed)
- رفع منفی
کاذب برای
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)
سایر رفع اشکالها (Other Bug Fixes)
- هنگام
نمایش
یونیکدهای
دارای
جانشین (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)
تغییرات داخلی (Internal Changes)
- •
- اصلاح
چارچوب
آزمون جهت
امکانپذیر
ساختن
خروجیهای
آزمون
متفاوت
برای
نسخههای
مختلف Python.
ارجاع به #10382 (#10382 https://github.com/pylint-dev/pylint/issues/10382)
3.x
این فهرست کامل تغییرات در نسخههای فرعی (minor) pylint 3.x بر اساس دستهبندی است.
تازههای Pylint 3.3 (What's New in Pylint 3.3)
:انتشار: 3.3 :تاریخ: 2024-09-20
خلاصه -- نکات برجسته انتشار (Summary -- Release highlights)
تازههای Pylint 3.3.9 (What's new in Pylint 3.3.9?)
تاریخ انتشار: 2025-10-05
موارد مثبت کاذب رفعشده (False Positives Fixed)
- رفع مورد
used-before-assignment / E0601 <#used-before-assignment>
برای
نامهای
مستعار نوع
(type aliases) و
پارامترهای
PEP 695.
بسته شد: #9815 (#9815 https://github.com/pylint-dev/pylint/issues/9815)
- توابع
منسوخنشده
در importlib.resources
دیگر به
عنوان
منسوخ
علامتگذاری
نمیشوند.
بسته شد: #10593 (#10593 https://github.com/pylint-dev/pylint/issues/10593)
- رفع مثبت
کاذب inconsistent-return-statements
هنگام
استفاده از
توابع quit() یا
exit().
بسته شد: #10508 (#10508 https://github.com/pylint-dev/pylint/issues/10508)
- رفع مثبت
کاذب undefined-variable (E0602)
برای
الگوهای
سایهاندازی
متغیر در
حلقه for
مانند for item in item:
زمانی که
متغیر از
پیش تعریف
شده باشد.
بسته شد: #10562 (#10562 https://github.com/pylint-dev/pylint/issues/10562)
رفع سایر باگها (Other Bug Fixes)
- •
- رفع خرابی (crash)
در unnecessary-list-index-lookup
هنگام آغاز
شمارش با
استفاده از
منفی طول یک
پیمایشپذیر
(iterable) درون یک dict
comprehension، در
وضعیتی که
فراخوانی len
تنها در
همین dict comprehension
انجام شده
بود و نه در
جای دیگر.
همچنین
رویکرد
تغییر کرد
تا در تمام
حالات به جز
موارد ساده
از استنتاج
(inference) استفاده
شود، تا
نیازی
نباشد
خرابیها
را یکییکی
برای
عبارتهای
با پیچیدگی
دلخواه در
enumerate رفع کنیم.
بسته شد: #10510 (#10510 https://github.com/pylint-dev/pylint/issues/10510)
تازههای Pylint 3.3.8 (What's new in Pylint 3.3.8?)
تاریخ انتشار: 2025-08-09
این انتشار وصلهای (patch release) شامل یک رفع مشکل استثنایی برای یک مورد منفی کاذب (false negative) است. برای جزئیات، ببینید: https://github.com/pylint-dev/pylint/pull/10482#issuecomment-3164514082
موارد مثبت کاذب رفعشده (False Positives Fixed)
- رفع موارد
مثبت کاذب
برای possibly-used-before-assignment / E0606
<#possibly-used-before-assignment>
زمانی که
متغیرها به
طور جامع
درون یک
بلوک match
https://docs.python.org/3/reference/compound_stmts.html#match
مقداردهی
شده باشند.
بسته شد: #9668 (#9668 https://github.com/pylint-dev/pylint/issues/9668)
- رفع مثبت
کاذب برای
missing-raises-doc / W9006 <#missing-raises-doc> و
missing-yield-doc / W9013 <#missing-yield-doc>
هنگامی که
طول متد
کمتر از docstring-min-length
باشد.
ارجاع به #10104 (#10104 https://github.com/pylint-dev/pylint/issues/10104)
- رفع یک مورد
مثبت کاذب
برای unused-variable / W0612
<#unused-variable> زمانی
که چندین
گرداننده except
نام یکسانی
را تحت یک
بلوک try مقید
(bind) میکنند.
بسته شد: #10426 (#10426 https://github.com/pylint-dev/pylint/issues/10426)
موارد منفی کاذب رفعشده (False Negatives Fixed)
- •
- رفع منفی
کاذب برای
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)
تازههای Pylint 3.3.7
تاریخ انتشار: 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)
تازههای Pylint 3.3.6
تاریخ انتشار: 2025-03-20
رفع مثبتهای کاذب
- •
- رفع یک مثبت
کاذب برای
used-before-assignment / E0601 <#used-before-assignment>
هنگامی که
نوع
بازگشتی
مشخصشده
برای یک
تابع
درونی،
کلاسی
تعریفشده
در سطح
ماژول (module scope)
باشد.
بستن #9391 (#9391 https://github.com/pylint-dev/pylint/issues/9391)
تازههای Pylint 3.3.5
تاریخ انتشار: 2025-03-09
رفع مثبتهای کاذب
- رفع
مثبتهای
کاذب برای
use-implicit-booleaness-not-comparison / C1803
<#use-implicit-booleaness-not-comparison>،
use-implicit-booleaness-not-comparison-to-string / C1804
<#use-implicit-booleaness-not-comparison-to-string> و
use-implicit-booleaness-not-comparison-to-zero / C1805
<#use-implicit-booleaness-not-comparison-to-zero>
هنگام
بررسی
مقایسههای
زنجیرهای.
بستن #10065 (#10065 https://github.com/pylint-dev/pylint/issues/10065)
- رفع یک مثبت
کاذب برای
invalid-getnewargs-ex-returned / E0313
<#invalid-getnewargs-ex-returned>
هنگامی که tuple
یا dict به یک
نام منتسب
شده باشد.
بستن #10208 (#10208 https://github.com/pylint-dev/pylint/issues/10208)
- حذف getopt
https://docs.python.org/3/library/getopt.html#module-getopt
و optparse
https://docs.python.org/3/library/optparse.html#module-optparse
از فهرست
ماژولهای
منسوخشده.
بستن #10211 (#10211 https://github.com/pylint-dev/pylint/issues/10211)
سایر رفع باگها
- رفع مشکلی
که در آن
وارد کردن
شرطی x.y باعث
ایجاد مثبت
کاذب possibly-used-before-assignment / E0606
<#possibly-used-before-assignment>
میشد.
بستن #10081 (#10081 https://github.com/pylint-dev/pylint/issues/10081)
- رفع خرابی (crash)
زمانی که در
مدیریتکننده
except چیزی به جز
کلاس یافت
شود.
بستن #10106 (#10106 https://github.com/pylint-dev/pylint/issues/10106)
- رفع صدور
پیام خطای
invalid-name / C0103 <#invalid-name>
هنگام
استفاده از
camelCase برای
متدهای
خصوصی
دارای دو خط
زیرین
آغازین.
بستن #10189 (#10189 https://github.com/pylint-dev/pylint/issues/10189)
- •
- بارگذاری
فایلهای
انتشار در PyPI
از طریق Trusted Publishing.
بستن #10256 (#10256 https://github.com/pylint-dev/pylint/issues/10256)
چه مواردی در Pylint 3.3.4 جدید است؟
تاریخ انتشار: 2025-01-28
رفع سایر باگها
- رفع اشکال
در محاسبه
تعداد "skipped files"؛
در روش
پیشین عددی
دلخواه
نمایش داده
میشد.
بستن #10073 (#10073 https://github.com/pylint-dev/pylint/issues/10073)
- رفع کرشی که
هنگام
اجرای pylint
درون یک
کانتینر
روی
میزبانی با
cgroupsv2 و دارای
محدودیت در
مصرف CPU رخ
میداد.
بستن #10103 (#10103 https://github.com/pylint-dev/pylint/issues/10103)
- تعدیل
نیازمندیهای
isort تا pylint
بتواند از isort 6
بهرهمند
شود.
بستن #10203 (#10203 https://github.com/pylint-dev/pylint/issues/10203)
چه مواردی در Pylint 3.3.3 جدید است؟
تاریخ انتشار: 2024-12-23
رفع مثبتهای کاذب
- رفع
مثبتهای
کاذب برای
undefined-variable / E0602 <#undefined-variable> در
کلاسهایی
که از نحو
انواع
جنریک در Python 3.12
استفاده
میکنند.
بستن #9335 (#9335 https://github.com/pylint-dev/pylint/issues/9335)
- رفع یک مثبت
کاذب برای
use-implicit-booleaness-not-len / C1802
<#use-implicit-booleaness-not-len>.
نباید هیچ
هشدار lint
برای
مولدها
صادر شود (len()
https://docs.python.org/3/library/functions.html#len
برای
مولدها
تعریف نشده
است).
ارجاع به #10100 (#10100 https://github.com/pylint-dev/pylint/issues/10100)
رفع سایر باگها
- •
- رفع خطای Unable to
import 'collections.abc' (import-error) در Python
3.13.1.
بستن #10112 (#10112 https://github.com/pylint-dev/pylint/issues/10112)
چه مواردی در Pylint 3.3.2 جدید است؟
تاریخ انتشار: 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)
چه مواردی در Pylint 3.3.1 جدید است؟
تاریخ انتشار: 2024-09-24
رفع مثبتهای کاذب
- •
- رفع
پسرفتی (regression)
که باعث
میشد برخی
f-strings به عنوان
رشته
استنتاج
نشوند.
بستن #9947 (#9947 https://github.com/pylint-dev/pylint/issues/9947)
چه مواردی در Pylint 3.3.0 جدید است؟
تاریخ انتشار: 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)
منفیهای کاذب رفعشده
- رفع
محاسبهٔ
تابع
بازنگرداننده
(never-returning): افزون
بر typing.NoReturn
https://docs.python.org/3/library/typing.html#typing.NoReturn،
عبارت typing.Never
https://docs.python.org/3/library/typing.html#typing.Never
نیز
پشتیبانی
میشود، و
اولویت به
گزینهٔ
صریح --never-returning-functions
داده شده
است.
بستن #7565. (#7565 https://github.com/pylint-dev/pylint/issues/7565)
- رفع یک مورد
منفی کاذب
برای await-outside-async / E1142
<#await-outside-async> زمانی
که await درون Lambda
قرار دارد.
ارجاع به #9653 (#9653 https://github.com/pylint-dev/pylint/issues/9653)
- رفع یک مورد
منفی کاذب
برای duplicate-argument-name / E0108
<#duplicate-argument-name> با
گنجاندن
آرگومانهای
positional-only، *args و **kwargs
در این
بررسی.
بستن #9669 (#9669 https://github.com/pylint-dev/pylint/issues/9669)
- رفع منفی
کاذب برای
multiple-statements / C0321 <#multiple-statements> در
حالتی که
چندین
دستور در
خطوط else
https://docs.python.org/3/reference/compound_stmts.html#else
و finally
https://docs.python.org/3/reference/compound_stmts.html#finally
از بلوک try
https://docs.python.org/3/reference/compound_stmts.html#try
وجود داشته
باشند.
ارجاع به #9759 (#9759 https://github.com/pylint-dev/pylint/issues/9759)
- رفع موارد
منفی کاذب
هنگامی که
:py:func::isinstance
دقیقاً دو
آرگومان
ندارد.
اکنون pylint
برای
فراخوانیهای
isinstance()
https://docs.python.org/3/library/functions.html#isinstance،
به تناسب
خطای too-many-function-args / E1121
<#too-many-function-args> یا no-value-for-parameter /
E1120 <#no-value-for-parameter> را
صادر
میکند.
بستن #9847 (#9847 https://github.com/pylint-dev/pylint/issues/9847)
رفع سایر باگها
- استفاده از
--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)
- حذف
پشتیبانی
از اجرای pylint
با Python 3.8. کدی که
از Python 3.8
پشتیبانی
میکند
همچنان
میتواند
با تنظیم
--py-version=3.8 تحلیل (lint)
شود.
ارجاع به #9774 (#9774 https://github.com/pylint-dev/pylint/issues/9774)
- افزودن
پشتیبانی
از Python 3.13.
ارجاع به #9852 (#9852 https://github.com/pylint-dev/pylint/issues/9852)
تغییرات داخلی
- تمام
متغیرها،
کلاسها،
توابع و
نامهای
فایلی که
شامل واژهٔ
'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)
تغییرات جدید در Pylint 3.2
- انتشار
- 3.2
- تاریخ
- اعلام خواهد شد (TBA)
خلاصه -- نکات برجسته انتشار
تغییرات جدید در Pylint 3.2.7؟
تاریخ انتشار: 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)
تغییرات جدید در Pylint 3.2.6؟
تاریخ انتشار: 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)
- رفع خطای
AssertionError ناشی از
ویژگیهایی
(property) که توابع
جزئی (partial functions)
بازمیگردانند.
بسته شد #9214 (#9214 https://github.com/pylint-dev/pylint/issues/9214)
- رفع کرش
هنگامی که
یک زیرکلاس
__slots__ را گسترش
میدهد.
بسته شد #9814 (#9814 https://github.com/pylint-dev/pylint/issues/9814)
تازههای Pylint 3.2.5
تاریخ انتشار: 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)
تازههای Pylint 3.2.4
تاریخ انتشار: 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)
تازههای Pylint 3.2.3
تاریخ انتشار: 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)
تازههای Pylint 3.2.2
تاریخ انتشار: 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)
در Pylint 3.2.0 چه مواردی جدید است؟
تاریخ انتشار: 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)
مثبتهای کاذب برطرفشده (False Positives Fixed)
اکنون pylint مقادیر بازگشتی دکوراتور @overload را بهتر درک میکند.
بسته شدن #4696 (#4696 https://github.com/pylint-dev/pylint/issues/4696) ارجاع به #9606 (#9606 https://github.com/pylint-dev/pylint/issues/9606)
بهبودهای کارایی (Performance Improvements)
- ماژولهای
نادیدهگرفتهشده
اکنون
بهجای
اینکه
ابتدا
بررسی و سپس
نادیده
گرفته
شوند، دیگر
اصلاً
بررسی
نمیشوند.
این امر
باید سرعت
تحلیل
پایگاهکدهای
بزرگی را که
دارای
ماژولهای
نادیدهگرفتهشده
هستند،
افزایش دهد.
بسته شدن #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)
تازههای Pylint 3.1 (What's New in Pylint 3.1)
- انتشار
- 3.1
- تاریخ
- 2024-02-25
خلاصه -- نکات برجسته انتشار (Summary -- Release highlights)
دو بررسی جدید -- use-yield-from، deprecated-attribute -- و تعدادی رفع اشکال.
تازههای Pylint 3.1.1 (What's new in Pylint 3.1.1)؟
تاریخ انتشار: 2024-05-13
مثبتهای کاذب برطرفشده (False Positives Fixed)
- در نظر
گرفتن 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)
تازههای Pylint 3.1.0 (What's new in Pylint 3.1.0)؟
تاریخ انتشار: 2024-02-25
قابلیتهای جدید (New Features)
- صرفنظر
کردن از
بررسی consider-using-join
برای
جداکنندههای
غیرخالی در
صورتی که
گزینه
suggest-join-with-non-empty-separator روی
no تنظیم
شده باشد.
بسته شدن #8701 (#8701 https://github.com/pylint-dev/pylint/issues/8701)
- شناسایی
فایلهای
.pyi هنگام
بررسی کد (linting).
این فایلها را میتوان با استفاده از تنظیمات ignore-patterns نادیده گرفت.
بسته شدن #9097 (#9097 https://github.com/pylint-dev/pylint/issues/9097)
- بررسی
گرههای TypeAlias
و TypeVar (PEP 695) برای
invalid-name.
ارجاع به #9196 (#9196 https://github.com/pylint-dev/pylint/issues/9196)
- پشتیبانی
از یافتن
فایلهای
خارجی toml با
نامهای pylintrc.toml
و .pylintrc.toml.
بسته شدن #9228 (#9228 https://github.com/pylint-dev/pylint/issues/9228)
- بررسی
فراخوانی
متدهای .clear،
.discard، .pop و remove
روی یک
مجموعه (set) در
حین پیمایش
آن.
بسته شدن #9334 (#9334 https://github.com/pylint-dev/pylint/issues/9334)
- پیام جدید
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)
رفع موارد مثبت کاذب (False Positives Fixed)
- رفع مثبت
کاذب برای
inherit-non-class در Protocolهای
عمومی (generic).
بسته شدن #9106 (#9106 https://github.com/pylint-dev/pylint/issues/9106)
- معاف شدن TypedDict
از بسته typing_extensions
از
بررسیهای
too-many-ancestor.
ارجاع به #9167 (#9167 https://github.com/pylint-dev/pylint/issues/9167)
رفع موارد منفی کاذب (False Negatives Fixed)
- گسترش
پیامهای
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)
سایر رفع اشکالها (Other Bug Fixes)
- •
- بهبود پیام
ارائهشده
برای بررسی
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)
سایر تغییرات (Other Changes)
- چاپ تعداد
فایلهای
بررسیشده
در حالت
پرگو (verbose).
بسته شدن #8935 (#8935 https://github.com/pylint-dev/pylint/issues/8935)
- رفع خرابی (crash)
هنگامی که
یک کلاس enum که
با
دکوراتور
dataclasses.dataclass تزیین
شده است
تعریف
میشود.
بسته شدن #9100 (#9100 https://github.com/pylint-dev/pylint/issues/9100)
تغییرات داخلی (Internal Changes)
- •
- بهروزرسانی
نسخه astroid به 3.1.0.
ارجاع به #9457 (#9457 https://github.com/pylint-dev/pylint/issues/9457)
تازههای Pylint 3.0 (What's New in Pylint 3.0)
- انتشار (Release)
- 3.0.0
- تاریخ (Date)
- 2023-10-02
خلاصه -- نکات برجسته انتشار (Summary -- Release highlights)
ابزار 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
هشدارهای نادرست برطرفشده (False Positives Fixed)
- هشدار 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)
سایر باگهای برطرفشده (Other Bug Fixes)
- •
- گرفتن خطای
نادرست 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)
تازههای Pylint 3.0.3 چیست؟
تاریخ انتشار: 2023-12-11
هشدارهای نادرست برطرفشده (False Positives Fixed)
- رفع هشدار
نادرست
برای 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)
سایر باگهای برطرفشده (Other Bug Fixes)
- •
- رفع باگی که
در آن 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)
سایر رفع اشکالها
- گریز دادن (escape)
نمادهای
خاص و خطوط
جدید در
پیامها.
بستهشده در #7874 (#7874 https://github.com/pylint-dev/pylint/issues/7874)
- اصلاح
پیشنهاد
برای nested-min-max در
عبارتهای
دارای
عملگرهای
جمعی، و
جامعسازهای
فهرست و
دیکشنری (list and dict
comprehensions).
بستهشده در #8524 (#8524 https://github.com/pylint-dev/pylint/issues/8524)
- اصلاح
نادیده
گرفتن
واردکردنهای
شرطی با ignore-imports=y.
بستهشده در #8914 (#8914 https://github.com/pylint-dev/pylint/issues/8914)
- صدور inconsistent-quotes
برای f-stringها در
مفسر 3.12 تنها
در صورتی که
نسخههای
پیش از 3.12 هدف
باشند.
بستهشده در #9113 (#9113 https://github.com/pylint-dev/pylint/issues/9113)
تازههای Pylint 3.0.1
تاریخ انتشار: 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)
تازههای Pylint 3.0.0
تاریخ انتشار: 2023-10-02
تغییرات ناسازگار (Breaking Changes)
- •
- فعالسازی
یا
غیرفعالسازی
پیامهای
مجزا اکنون
حتی در
صورتی که به
دنبال
آنها --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)
قابلیتهای جدید (New Features)
- یک
گزارشگر
جدید 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)
افزونهها (Extensions)
- •
- افزودن
پیام جدید
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)
موارد مثبت کاذب رفعشده (False Positives Fixed)
- گسترش
مفهوم
"ابهام
تابع" (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)
سایر رفع باگها (Other Bug Fixes)
- پشتیبانی
از پیام 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)
- اکنون Pylint
حاشیهنویسیهای
نوع (type annotations) خود
را ارائه
میدهد.
بسته شدن #5488 و #2079 (#5488 https://github.com/pylint-dev/pylint/issues/5488)
- جستوجوی
بازگشتی
برای pyproject.toml در
دایرکتوریهای
والد تا
ریشهٔ
پروژه یا
ریشهٔ
سیستمفایل.
ارجاع به #7163، بسته شدن #3289 (#7163 https://github.com/pylint-dev/pylint/issues/7163)
- تمام کدهای
مربوط به
تجزیهٔ
پیکربندی optparse
حذف
شدهاند.
ارجاع به #8405 (#8405 https://github.com/pylint-dev/pylint/issues/8405)
- اکنون Pylint از python
3.12 پشتیبانی
میکند.
ارجاع به #8718 (#8718 https://github.com/pylint-dev/pylint/issues/8718)
- افزودن یک
فایل CITATION.cff به
ریشهٔ مخزن
شامل
فرادادههای
لازم برای
استناد به Pylint.
بسته شدن #8760 (#8760 https://github.com/pylint-dev/pylint/issues/8760)
- تغییر نام
خطای "unneeded-not / C0113
<#unneeded-not>" به
"unnecessary_negation" برای
وضوح بیشتر.
بسته شدن #8789 (#8789 https://github.com/pylint-dev/pylint/issues/8789)
تغییرات داخلی (Internal Changes)
- تابع 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)
2.x
از زمان آغاز pylint تا نگارش 2.14.0 (شامل آن)، سیاههٔ تغییراتی وجود داشت که دربردارندهٔ تمام تغییرات غیربدیهی Pylint بود؛ از جمله تغییراتی که برای کاربر ملموس نبودند، یعنی تغییراتی که تنها در صورتی ممکن بود برای شما جالب باشند که توسعهدهندهای باشید که روی pylint یا افزایههای pylint کار میکند یا یک تاریخنگار متنباز باشید.
از pylint 1.6.0 تا 2.14.0، علاوه بر سیاههٔ کامل تغییرات، خلاصهای از تغییرات (عمدتاً ملموس برای کاربر) نیز وجود داشت.
تازههای Pylint 2.17
- انتشار
- 2.17
- تاریخ
- 2023-03-08
خلاصه -- نکات برجستهٔ انتشار
نگارش 2.17 یک انتشار کوچک است و نخستین نگارشی به شمار میرود که با افزودن گرههای TryStar، بهطور رسمی از python 3.11 پشتیبانی میکند.
همچنان دو بررسی پیشفرض جدید وجود دارد: bad-chained-comparison و implicit-flag-alias، که یکی از آنها پیشتر باگی شناسایینشده را در sentry برطرف کرده است.
به لطف تلاش جامعهٔ کاربری، مستندات ما تقریباً کامل شده است و اکنون همهٔ پیامها باید دارای مستندات مناسبی باشند. یک تشکر بزرگ از تمام کسانی که مشارکت کردند!
انتشار بعدی 3.0.0 خواهد بود که تغییرات ساختارشکن (breaking changes) به همراه دارد و موارد منسوخی را که از مدتها پیش اعلام شده بودند اجرایی میکند. پیش از انتشار رسمی، نسخههای بتای متعددی عرضه خواهد شد؛ همگان میتوانند این نسخههای بتا را آزمایش کنند تا مشکلات را پیش از انتشار نهایی شناسایی کنیم.
تازههای Pylint 2.17.7
تاریخ انتشار: 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)
تازههای Pylint 2.17.6
تاریخ انتشار: 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)
رفع سایر باگها
- رفع خرابی
هنگامی که
یک
فراخوانی
به super() پس از
یک عملگر
(مانند not)
قرار
میگرفت.
بستن #8554 (#8554 https://github.com/pylint-dev/pylint/issues/8554)
- رفع خرابی
بررسیکنندهٔ
modified-while-iterating هنگام
حذف اعضای
یک dict
بازگرداندهشده
از یک
فراخوانی.
بستن #8598 (#8598 https://github.com/pylint-dev/pylint/issues/8598)
- رفع خرابی
در بررسی
invalid-metaclass هنگامی
که یک metaclass
دارای
پایههای
تکراری بود.
بستن #8698 (#8698 https://github.com/pylint-dev/pylint/issues/8698)
- اجتناب از
هشدار consider-using-f-string
در modulo با وجود
براکت در
الگو.
بستن #8720. (#8720 https://github.com/pylint-dev/pylint/issues/8720)
- رفع خرابی
هنگامی که
__all__ وجود
دارد اما
قابل
استنتاج
نیست.
بستن #8740 (#8740 https://github.com/pylint-dev/pylint/issues/8740)
- رفع خرابی
هنگامی که
یک متغیر به
یک مشخصهٔ
کلاس با نام
یکسان
انتساب
داده
میشود.
بستن #8754 (#8754 https://github.com/pylint-dev/pylint/issues/8754)
- رفع خرابی
هنگام
فراخوانی
copy.copy() بدون
آرگومان.
بستن #8774 (#8774 https://github.com/pylint-dev/pylint/issues/8774)
سایر تغییرات
- •
- رفع خرابی
هنگامی که
یک nonlocal در سطح
ماژول
تعریف شده
باشد.
بستن #8735 (#8735 https://github.com/pylint-dev/pylint/issues/8735)
موارد جدید در Pylint 2.17.4
تاریخ انتشار: 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
مثبتهای کاذب رفعشده
- رفع مثبت
کاذب unused-argument
هنگامی که
__new__ از تمام
آرگومانهای
__init__ استفاده
نمیکند.
بسته شد #3670 (#3670 https://github.com/pylint-dev/pylint/issues/3670)
- رفع مثبت
کاذب unused-import
برای
استفاده از
six.with_metaclass.
بسته شد #7506 (#7506 https://github.com/pylint-dev/pylint/issues/7506)
- پیام 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>
هنگامی که
انواع union
شامل None
هستند.
بسته شد #8424 (#8424 https://github.com/pylint-dev/pylint/issues/8424)
- اصلاح 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)
- رفع مثبت
کاذب برای
positional-only-arguments-expected
هنگامی که
یک تابع هم
شامل یک
پارامتر positional-only
با مقدار
پیشفرض، و
هم شامل **kwargs
باشد.
بسته شد #8555 (#8555 https://github.com/pylint-dev/pylint/issues/8555)
- رفع مثبت
کاذب برای
keyword-arg-before-vararg
هنگامی که
یک پارامتر
positional-only با یک
مقدار
پیشفرض،
پیش از *args
قرار
میگیرد.
بسته شد #8570 (#8570 https://github.com/pylint-dev/pylint/issues/8570)
سایر اشکالات رفعشده
- •
- بهبود
خروجی پیام
consider-using-generator برای
فراخوانیهای
min() با کلمه
کلیدی default.
بسته شد #8563 (#8563 https://github.com/pylint-dev/pylint/issues/8563)
تازههای Pylint 2.17.2
تاریخ انتشار: 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
رفع مثبتهای کاذب (False Positives)
- •
- افزودن 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)
چه چیزهایی در Pylint 2.17.0 جدید است؟
تاریخ انتشار: 2023-03-08
ویژگیهای جدید
- ابزار pyreverse
اکنون با
گزینهٔ --color-palette
از
پالتهای
رنگی
سفارشی
پشتیبانی
میکند.
بستن #6738 (#6738 https://github.com/pylint-dev/pylint/issues/6738)
- افزودن
بررسی invalid-name
برای
نامهای TypeAlias.
بستن #7081. (#7081 https://github.com/pylint-dev/pylint/issues/7081)
- پذیرش
مقادیری به
شکل <class name>.<attribute name>
برای فهرست
exclude-protected.
بستن #7343 (#7343 https://github.com/pylint-dev/pylint/issues/7343)
- افزودن
گزینهٔ --version
به pyreverse.
ارجاع #7851 (#7851 https://github.com/pylint-dev/pylint/issues/7851)
- افزودن
قابلیت
جدید با
پیکربندی
preferred-modules برای
تشخیص
زیرپیمانهها.
ارجاع #7957 (#7957 https://github.com/pylint-dev/pylint/issues/7957)
- پشتیبانی
از
بستههای
فضای نام
ضمنی (PEP 420).
بستن #8154 (#8154 https://github.com/pylint-dev/pylint/issues/8154)
- افزودن
پشتیبانی
از الگوهای
تطبیق مسیر
(globbing) برای --source-roots.
بستن #8290 (#8290 https://github.com/pylint-dev/pylint/issues/8290)
- پشتیبانی
از الگوهای
تطبیق مسیر
هنگام
تعیین
فایل/دایرکتوری/پیمانه
مورد نظر
برای تحلیل
(lint).
بستن #8310 (#8310 https://github.com/pylint-dev/pylint/issues/8310)
- اکنون pylint از
گرههای TryStar
در Python 3.11
پشتیبانی
میکند و
باید
بهطور
کامل با Python 3.11
سازگار
باشد.
بستن #8387 (#8387 https://github.com/pylint-dev/pylint/issues/8387)
- افزودن
بررسی 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)
رفع موارد مثبت کاذب (False Positives Fixed)
- رفع چندین
مورد مثبت
کاذب برای
توابعی که
مستقیماً
از
حالتهای
تطبیق
الگوی
ساختاری (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)
رفع موارد منفی کاذب (False Negatives Fixed)
- رفع یک منفی
کاذب برای
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)
سایر رفع باگها (Other Bug Fixes)
- رفع مثبت
کاذب used-before-assignment
هنگامی که
عملگر
والروس (walrus operator)
همراه با یک
عملگر
سهتایی در
مقداردهی
اولیه
کلید/مقدار
دیکشنری
استفاده
میشود.
بستن #8125 (#8125 https://github.com/pylint-dev/pylint/issues/8125)
- رفع مثبت
کاذب no-name-in-module که
هنگام
تعریف
متغیری
همنام با
یکی از
زیرماژولهای
بسته رخ
میداد.
بستن #8148 (#8148 https://github.com/pylint-dev/pylint/issues/8148)
- رفع یک
فروپاشی (crash)
در مفسر python < 3.9
پس از یک
بهروزرسانی
ناموفق typing.
بستن #8161 (#8161 https://github.com/pylint-dev/pylint/issues/8161)
- اصلاح پیام
پیشنهادی
nested-min-max برای
نشان دادن
امکان باز
کردن (splat)
شیءهای
تکرارپذیر
(iterable).
بستن #8168 (#8168 https://github.com/pylint-dev/pylint/issues/8168)
- رفع یک
فروپاشی که
هنگام منفی
کردن یک صفت
کلاس در
آرگومان start
یک enumerate رخ
میداد.
بستن #8207 (#8207 https://github.com/pylint-dev/pylint/issues/8207)
- جلوگیری از
صدور invalid-name
برای خطی که
در آن دستور
global اعلان
شده است.
بستن #8307 (#8307 https://github.com/pylint-dev/pylint/issues/8307)
- بهروزرسانی
توضیحات
مربوط به
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)
تازههای Pylint 2.16
- انتشار
- 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) پیوستند؛ به تیم خوش آمدید!
تازههای Pylint 2.16.4؟
تاریخ انتشار: 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)
تازههای Pylint 2.16.3؟
تاریخ انتشار: 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)
چه مواردی در Pylint 2.16.1 جدید است؟
تاریخ انتشار: 2023-02-02
سایر رفع اشکالها
- •
- رفع یک
فروپاشی
برای مفسر python
نسخهٔ کمتر
از 3.9
بهدنبال
یک
بهروزرسانی
ناموفق typing.
بستن #8161 (#8161 https://github.com/pylint-dev/pylint/issues/8161)
چه مواردی در Pylint 2.16.0 جدید است؟
تاریخ انتشار: 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)
افزونهها (Extensions)
- افزودن
بررسیکننده
افزونه
جدید 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)
- رفع مثبت
کاذب برای
unused-variable و unused-import
هنگامی که
یک نام تنها
در یک
یادداشت
نوع لیترال
رشتهای
استفاده
شده باشد.
بستن #3299 (#3299 https://github.com/pylint-dev/pylint/issues/3299)
- مستندسازی
یک مثبت
کاذب
شناختهشده
برای useless-suppression
هنگام
غیرفعالسازی
line-too-long در
ماژولی که
فقط حاوی
کامنت است و
کدی ندارد.
بستن #3368 (#3368 https://github.com/pylint-dev/pylint/issues/3368)
- هشدار trailing-whitespaces
دیگر درون
رشتهها
گزارش
نمیشود.
بستن #3822 (#3822 https://github.com/pylint-dev/pylint/issues/3822)
- رفع مثبت
کاذب برای
global-variable-not-assigned
هنگامی که
یک متغیر
سراسری از
طریق یک گره
ImportFrom مجدداً
مقداردهی
میشود.
بستن #4809 (#4809 https://github.com/pylint-dev/pylint/issues/4809)
- رفع مثبت
کاذب برای
use-maxsplit-arg با متد split
سفارشی.
بستن #4857 (#4857 https://github.com/pylint-dev/pylint/issues/4857)
- رفع مثبت
کاذب logging-fstring-interpolation
صادرشده
هنگام
لاگگیری و
f-string با
قالببندی
%s.
بستن #4984 (#4984 https://github.com/pylint-dev/pylint/issues/4984)
- رفع مثبت
کاذب برای
used-before-assignment در
انطباق
الگو (pattern matching)
همراه با یک
محافظ (guard).
بستن #5327 (#5327 https://github.com/pylint-dev/pylint/issues/5327)
- رفع use-sequence-for-iteration
هنگام باز
کردن
بستهبندی
یک مجموعه (set)
با *.
بستن #5788 (#5788 https://github.com/pylint-dev/pylint/issues/5788)
- رفع مثبت
کاذب deprecated-method
زمانی که
نام مستعار
یک متد،
مشابه نام
متد
منسوخشده
باشد.
بستن #5886 (#5886 https://github.com/pylint-dev/pylint/issues/5886)
- رفع مثبت
کاذب assigning-non-slot
هنگامی که
یک صفت کلاس
مجدداً
مقداردهی
میشود.
بستن #6001 (#6001 https://github.com/pylint-dev/pylint/issues/6001)
- رفع مثبت
کاذب برای
too-many-function-args
هنگامی که
فراخوانی
یک تابع
درون کلاسی
که تابع در
آن تعریف
شده، به یک
صفت کلاس
نسبت داده
میشود.
بستن #6592 (#6592 https://github.com/pylint-dev/pylint/issues/6592)
- رفع مثبت
کاذب abstract-method در
کلاسهای Protocol.
بستن #7209 (#7209 https://github.com/pylint-dev/pylint/issues/7209)
- اکنون Pylint
آرگومان
کلیدواژهای
kw_only را برای
dataclass تشخیص
میدهد.
بستن #7290، بستن #6550، بستن #5857 (#7290 https://github.com/pylint-dev/pylint/issues/7290)
- رفع مثبت
کاذب برای
undefined-loop-variable در
حلقههای
for-else که از
تابعی با
یادداشت
نوع
بازگشتی NoReturn
یا Never
استفاده
میکنند.
بستن #7311 (#7311 https://github.com/pylint-dev/pylint/issues/7311)
- رفع used-before-assignment
برای
توابع/کلاسهای
تعریفشده
درون محافظ
بررسی نوع (type
checking guard).
بستن #7368 (#7368 https://github.com/pylint-dev/pylint/issues/7368)
- رفع مثبت
کاذب برای
unhashable-member هنگام
ایجاد
زیرکلاس از
dict و
استفاده از
آن زیرکلاس
بهعنوان
کلید
دیکشنری.
بستن #7501 (#7501 https://github.com/pylint-dev/pylint/issues/7501)
- اصلاح پیام
برای unnecessary-dunder-call
برای __aiter__ و
__aneext__. همچنین
تنها زمانی
هشدار صادر
شود که py-version >= 3.10
باشد.
بستن #7529 (#7529 https://github.com/pylint-dev/pylint/issues/7529)
- رفع مثبت
کاذب used-before-assignment
هنگامی که
شاخه else تابع
sys.exit یا توابع
پایاندهنده
مشابه را
فراخوانی
میکند.
بستن #7563 (#7563 https://github.com/pylint-dev/pylint/issues/7563)
- رفع مثبت
کاذب برای
used-before-assignment برای
درونریزیهای
محافظتشده
با typing.TYPE_CHECKING که
بعداً در
یادداشتهای
متغیر
استفاده
میشوند.
بستن #7609 (#7609 https://github.com/pylint-dev/pylint/issues/7609)
- رفع مثبت
کاذب برای
simplify-boolean-expression
هنگامی که
مقادیر
چندگانهای
برای یک
مقدار ثابت
استنتاج
میشود.
بستن #7626 (#7626 https://github.com/pylint-dev/pylint/issues/7626)
- اگر enumerate با start
فراخوانی
شود، unnecessary-list-index-lookup
دیگر به
اشتباه
صادر
نخواهد شد.
بستن #7682 (#7682 https://github.com/pylint-dev/pylint/issues/7682)
- عدم صدور
هشدار
درباره
stop-iteration-return هنگام
استفاده از
next() روی itertools.cycle.
بستن #7765 (#7765 https://github.com/pylint-dev/pylint/issues/7765)
- رفع مثبت
کاذب used-before-assignment
هنگامی که
عملگر
والروس در
یک عملگر
سهگانه
استفاده
میشود.
بستن #7779 (#7779 https://github.com/pylint-dev/pylint/issues/7779)
- رفع مثبت
کاذب missing-param-doc
زمانی که
پارامتر
تابع دارای
یک زیرخط
اسکیپشده
باشد.
بستن #7827 (#7827 https://github.com/pylint-dev/pylint/issues/7827)
- رفع مثبت
کاذب method-cache-max-size-none
برای
متدهایی که
از Enum به ارث
میرسند.
بستن #7857 (#7857 https://github.com/pylint-dev/pylint/issues/7857)
- multiple-statements دیگر
برای کدهای
توخالی
تابع (stubs) که از
...
درونخطی
استفاده
میکنند،
فعال
نمیشود.
بستن #7860 (#7860 https://github.com/pylint-dev/pylint/issues/7860)
- رفع یک مثبت
کاذب برای
used-before-assignment زمانی
که نامی
محافظتشده
با if TYPE_CHECKING: به
عنوان
یادداشت
نوع در بدنه
تابع
استفاده
شود و بعداً
در همان
دامنه
مجدداً
درونریزی
گردد.
بستن #7882 (#7882 https://github.com/pylint-dev/pylint/issues/7882)
- جلوگیری از
used-before-assignment
هنگامی که
درونریزیهای
محافظتشده
با if TYPE_CHECKING در
زمان
استفاده
دوباره
محافظت
شوند.
بستن #7979 (#7979 https://github.com/pylint-dev/pylint/issues/7979)
- رفع مثبت
کاذب برای
try-except-raise با
چندین
استثنا در
یک دستور except
در صورتی که
استثناها
در فضای نام
متفاوتی
باشند.
بستن #8051 (#8051 https://github.com/pylint-dev/pylint/issues/8051)
- رفع خطاهای
invalid-name برای
typing_extension.TypeVar.
ارجاع به #8089 (#8089 https://github.com/pylint-dev/pylint/issues/8089)
- رفع مثبت
کاذب no-kwoa
برای
مدیران
زمینه (context managers).
بستن #8100 (#8100 https://github.com/pylint-dev/pylint/issues/8100)
- رفع یک مثبت
کاذب برای
redefined-variable-type هنگام
وجود
متدهای async.
بستن #8120 (#8120 https://github.com/pylint-dev/pylint/issues/8120)
- کد پس از
فراخوانی
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)
سایر رفع اشکالها (Other Bug Fixes)
- رفع اشکال
در تشخیص
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)
- اکنون Pylint
پشتیبانی
اولیهای
از Python 3.11 فراهم
میکند.
بسته شدن #5920 (#5920 https://github.com/pylint-dev/pylint/issues/5920)
- بهروزرسانی
پیام برای
abstract-method جهت
گنجاندن
نام کلاس
فرزند.
بسته شدن #7124 (#7124 https://github.com/pylint-dev/pylint/issues/7124)
- بهروزرسانی
چاپگرهای dot
و plantuml در Pyreverse
برای تشخیص
انتزاعی
بودن
متدهای
کلاس و
نمایش
آنها با
قلم مورب (italic).
برای چاپگر
dot، برچسب
بهروز شد
تا از نحو
شبه-HTML
استفاده
کند.
بسته شدن #7346 (#7346 https://github.com/pylint-dev/pylint/issues/7346)
- افزونهی
docparams اکنون
مشخص کردن
نوع (typing) در
رشتههای
مستندات
سبک Numpy را به
عنوان
"مستندسازی"
برای پیام
missing-param-doc در نظر
میگیرد.
ارجاع به #7398 (#7398 https://github.com/pylint-dev/pylint/issues/7398)
- هشدارهای
منسوخشدگی
(DeprecationWarnings) مرتبط
اکنون با
stacklevel=2 صادر
میشوند،
بنابراین
محل
فراخوانی
در پیام
پیوست شده
است.
بسته شدن #7463 (#7463 https://github.com/pylint-dev/pylint/issues/7463)
- افزودن
گزینه minimal به
pylint-config و مولد toml
آن.
بسته شدن #7485 (#7485 https://github.com/pylint-dev/pylint/issues/7485)
- افزودن نام
متد به
پیامهای
خطای no-method-argument و
no-self-argument.
بسته شدن #7507 (#7507 https://github.com/pylint-dev/pylint/issues/7507)
- جلوگیری از
باقی ماندن
حافظه موقت
(cache) نصب pip در
تصویر Docker.
ارجاع به #7544 (#7544 https://github.com/pylint-dev/pylint/issues/7544)
- افزودن یک
آرگومان
فقطکلیدواژهای
compare_constants به safe_infer.
ارجاع به #7626 (#7626 https://github.com/pylint-dev/pylint/issues/7626)
- افزودن
گزینه default_enabled
به دیکشنری
پیامهای
اختیاری.
گزینهای
برای
غیرفعال
کردن یک
پیام
بررسیکننده
به صورت
پیشفرض
فراهم
میکند. جهت
استفاده از
یک پیام
غیرفعال،
کاربر باید
آن را به
صراحت با
افزودن
پیام به
گزینه enable
فعال کند.
ارجاع به #7629 (#7629 https://github.com/pylint-dev/pylint/issues/7629)
- مرتبسازی
خروجی --generated-rcfile.
ارجاع به #7655 (#7655 https://github.com/pylint-dev/pylint/issues/7655)
- ابزار epylint
اکنون
منسوخ شده
است و در pylint 3.0.0
حذف خواهد
شد. تمام
فایلهای
مرتبط با emacs و
flymake حذف شدند و
پشتیبانی
آنها از
این پس در
یک مخزن
خارجی
انجام
خواهد گرفت:
https://github.com/emacsorphanage/pylint.
بسته شدن #7737 (#7737 https://github.com/pylint-dev/pylint/issues/7737)
- افزودن
آزمون برای
قابلیتهای
پیکربندی
موجود preferred-modules.
ارجاع به #7957 (#7957 https://github.com/pylint-dev/pylint/issues/7957)
تغییرات داخلی (Internal Changes)
- •
- افزودن و
اصلاح
آزمونهای
رگرسیون
برای
بارگذاری
افزونهها.
این کار آزمونهایی را که بارگذاری افزونههای سفارشیِ متأثر از هرگونه تغییر ایجادشده در sys.path هنگام اجرای یک init-hook را پوشش میدهند، تقویت میکند. با توجه به قرارداد موجود مبنی بر مجاز بودن بارگذاری افزونهها از طریق تغییر مسیر به این شیوه، اکنون این آخرین بخش از کار مورد نیاز برای بستن مسئله GitHub #7264 است.
بسته شدن #7264 (#7264 https://github.com/pylint-dev/pylint/issues/7264)
- انتشار (Release)
- 2.15
- تاریخ (Date)
- 2022-08-26
خلاصه -- نکات برجسته انتشار (Summary -- Release highlights)
در 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 به جمع نگهدارندگان پیوست، به تیم خوش آمدید!
تازههای Pylint 2.15.10 (What's new in Pylint 2.15.10?)
تاریخ انتشار: 2023-01-09
رفع مثبتهای کاذب (False Positives Fixed)
- رفع use-sequence-for-iteration
هنگام باز
کردن (unpacking) یک
مجموعه (set) با
*.
بسته شدن #5788 (#5788 https://github.com/pylint-dev/pylint/issues/5788)
- رفع مثبت
کاذب assigning-non-slot
هنگامی که
یک صفت کلاس
مجدداً
انتساب
مییابد.
بسته شدن #6001 (#6001 https://github.com/pylint-dev/pylint/issues/6001)
- رفع مثبت
کاذب used-before-assignment
هنگامی که
عملگر
والروس (walrus operator)
در یک عملگر
سهتایی
استفاده
میشود.
بسته شدن #7779 (#7779 https://github.com/pylint-dev/pylint/issues/7779)
- جلوگیری از
used-before-assignment
هنگامی که
وارداتهای
محافظتشده
با if TYPE_CHECKING در
زمان
استفاده
نیز مجدداً
محافظت
شدهاند.
بسته شدن #7979 (#7979 https://github.com/pylint-dev/pylint/issues/7979)
سایر رفع باگها (Other Bug Fixes)
- •
- استفاده از
آکولادهای
سفارشی در
msg-template اکنون
به درستی
کار خواهد
کرد.
بسته شدن #5636 (#5636 https://github.com/pylint-dev/pylint/issues/5636)
تازههای Pylint 2.15.9 (What's new in Pylint 2.15.9?)
تاریخ انتشار: 2022-12-17
رفع مثبتهای کاذب (False Positives Fixed)
- •
- رفع مثبت
کاذب برای
used-before-assignment در
تطبیق الگو
(pattern matching) همراه
با گارد (guard).
بسته شدن #5327 (#5327 https://github.com/pylint-dev/pylint/issues/5327)
سایر رفع باگها (Other Bug Fixes)
- چنانچه یک
کار موازی
متوقف (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
مثبتهای کاذب برطرفشده
- مستندسازی
یک مثبت
کاذب
شناختهشده
برای useless-suppression
هنگام
غیرفعالسازی
line-too-long در
ماژولی که
فقط دارای
کامنت بوده
و کدی
ندارد.
بستن #3368 (#3368 https://github.com/pylint-dev/pylint/issues/3368)
- رفع مثبت
کاذب logging-fstring-interpolation
که هنگام
لاگ کردن با
f-string حاوی
قالببندی
%s رخ
میداد.
بستن #4984 (#4984 https://github.com/pylint-dev/pylint/issues/4984)
- رفع مثبت
کاذب abstract-method در
کلاسهای Protocol.
بستن #7209 (#7209 https://github.com/pylint-dev/pylint/issues/7209)
- رفع مثبت
کاذب missing-param-doc
هنگامی که
پارامتر
تابع دارای
یک خط زیرین
گریز
دادهشده (escaped
underscore) باشد.
بستن #7827 (#7827 https://github.com/pylint-dev/pylint/issues/7827)
- هشدار multiple-statements
دیگر برای
stubهای تابعی
که از ...
درونخطی
استفاده
میکنند
فعال
نمیشود.
بستن #7860 (#7860 https://github.com/pylint-dev/pylint/issues/7860)
چه مواردی در Pylint 2.15.7 جدید است؟
تاریخ انتشار: 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)
چه مواردی در Pylint 2.15.6 جدید است؟
تاریخ انتشار: 2022-11-19
مثبتهای کاذب برطرفشده
- رفع مثبت
کاذب برای
unhashable-member هنگام
ایجاد
زیرکلاس از
dict و
استفاده از
آن زیرکلاس
به عنوان
کلید
دیکشنری.
بستن #7501 (#7501 https://github.com/pylint-dev/pylint/issues/7501)
- اگر enumerate
همراه با start
فراخوانی
شود، هشدار
unnecessary-list-index-lookup به
اشتباه
صادر
نخواهد شد.
بستن #7682 (#7682 https://github.com/pylint-dev/pylint/issues/7682)
- عدم نمایش
هشدار
درباره
stop-iteration-return هنگام
استفاده از
next() روی itertools.cycle.
بستن #7765 (#7765 https://github.com/pylint-dev/pylint/issues/7765)
- پیامهای
ارسالشده
به گزارشگر
اکنون
رونوشت
میشوند تا
یک گزارشگر
نتواند
پیامی را که
برای سایر
گزارشگران
ارسال شده
تغییر دهد.
بسته شد #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)
تازههای Pylint 2.15.5
تاریخ انتشار: 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)
سایر تغییرات
- افزودن
آرگومان
فقطکلیدواژهای
compare_constants به safe_infer.
ارجاع به #7626 (#7626 https://github.com/pylint-dev/pylint/issues/7626)
- مرتبسازی
خروجی --generated-rcfile.
ارجاع به #7655 (#7655 https://github.com/pylint-dev/pylint/issues/7655)
تازههای Pylint 2.15.4
تاریخ انتشار: 2022-10-10
رفع موارد مثبت کاذب
- •
- اصلاح پیام
برای unnecessary-dunder-call
در مورد __aiter__
و __anext__.
همچنین
انتشار
هشدار فقط
زمانی
انجام
میشود که
py-version >= 3.10 باشد.
بسته شد #7529 (#7529 https://github.com/pylint-dev/pylint/issues/7529)
سایر رفع باگها
- رفع باگ در
تشخیص unused-variable
هنگام
پیمایش روی
متغیر.
بسته شد #3044 (#3044 https://github.com/pylint-dev/pylint/issues/3044)
- رفع مدیریت
-- به عنوان
جداکننده
میان
آرگومانهای
مکانی و
پرچمها.
این مشکل در
عمل در 2.14.5 رفع
نشده بود.
بسته شد #7003، ارجاع به #7096 (#7003 https://github.com/pylint-dev/pylint/issues/7003)
- گزارش no-self-argument
به جای no-method-argument
برای
متدهایی با
آرگومانهای
متغیر (variadic).
بسته شد #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) و
محافظت از
وارد
کردنها
تحت 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)
- رفع باگ در
پویش
نامهای
درون
آرگومانهای
typing.Literal. برای
جزئیات به
https://peps.python.org/pep-0586/#literals-enums-and-forward-references
مراجعه
کنید.
ارجاع به #3299 (#3299 https://github.com/pylint-dev/pylint/issues/3299)
- •
- افزودن نام
متد به
پیامهای
خطای no-method-argument و
no-self-argument.
بسته شد: #7507 (#7507 https://github.com/pylint-dev/pylint/issues/7507)
چه مواردی در Pylint 2.15.3 جدید است؟
تاریخ انتشار: 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)
چه مواردی در Pylint 2.15.2 جدید است؟
تاریخ انتشار: 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 جایگزین شد.
چه مواردی در Pylint 2.15.0 جدید است؟
بررسیهای جدید (New Checks)
- •
- بررسیکننده
جدید missing-timeout
برای هشدار
درباره
مقادیر
پیشفرض
وقفه (timeout) که
ممکن است
باعث معلق
ماندن
نامحدود
برنامه
شوند،
اضافه شد.
ارجاع: #6780 (#6780 https://github.com/pylint-dev/pylint/issues/6780)
رفع مثبتهای کاذب (False Positives Fixed)
- عدم گزارش
super-init-not-called برای
متدهای
انتزاعی __init__.
بستن #3975 (#3975 https://github.com/pylint-dev/pylint/issues/3975)
- عدم گزارش
unsupported-binary-operation در Python <= 3.9
هنگام
استفاده از
عملگر | با
انواع
داده، در
صورتی که یک
متاکلاس
متدهای __or__
یا __ror__ را به
نحو مقتضی
سربارگذاری
کرده باشد.
بستن #4951 (#4951 https://github.com/pylint-dev/pylint/issues/4951)
- عدم گزارش
no-value-for-parameter برای
فیلدهای dataclasses
حاشیهنویسیشده
با KW_ONLY.
بستن #5767 (#5767 https://github.com/pylint-dev/pylint/issues/5767)
- اصلاح
استنتاج Enums
هنگامی که
تحت یک نام
مستعار (alias)
وارد
میشوند.
بستن #5776 (#5776 https://github.com/pylint-dev/pylint/issues/5776)
- جلوگیری از
مثبتهای
کاذب هنگام
دسترسی به
PurePath.parents از طریق
اندیس (نه
برش) در Python 3.10+.
بستن #5832 (#5832 https://github.com/pylint-dev/pylint/issues/5832)
- بررسی
unnecessary-list-index-lookup
اکنون برای
اجتناب از
مثبتهای
کاذب
بالقوه،
محافظهکارانهتر
عمل میکند.
بستن #6896 (#6896 https://github.com/pylint-dev/pylint/issues/6896)
- رفع صدور
مضاعف trailing-whitespace
برای
رشتههای
مستندسازی
(docstrings) چندخطی.
بستن #6936 (#6936 https://github.com/pylint-dev/pylint/issues/6936)
- بررسی import-error
اکنون به
درستی
حفاظهای
contextlib.suppress را روی
دستورات import
بررسی
میکند.
بستن #7270 (#7270 https://github.com/pylint-dev/pylint/issues/7270)
- رفع مثبت
کاذب برای
no-self-argument/no-method-argument
هنگامی که
یک staticmethod روی یک
تابع اعمال
شده اما از
نام
متفاوتی
استفاده
میکند.
بستن #7300 (#7300 https://github.com/pylint-dev/pylint/issues/7300)
- رفع undefined-loop-variable با
دستورات break
و continue در
بلوکهای
else.
ارجاع: #7311 (#7311 https://github.com/pylint-dev/pylint/issues/7311)
- بهبود
عبارت
باقاعده (regex)
پیشفرض
برای نام TypeVar.
عدم مجاز
بودن
نامهایی
با پیشوند
T. به عنوان
مثال،
استفاده از
AnyStrT به جای TAnyStr.
ارجاع: #7322 (#7322 https://github.com/pylint-dev/pylint/issues/7322`_)
رفع منفیهای کاذب (False Negatives Fixed)
- صدور used-before-assignment
هنگام اتکا
به نامی که
بعداً در
همان تابع
دوباره
وارد (reimport) شده
است.
بستن #4624 (#4624 https://github.com/pylint-dev/pylint/issues/4624)
- صدور used-before-assignment
برای
عبارات
نامگذاریشده
خودارجاع
(:=) فاقد
انتساب
قبلی.
بستن #5653 (#5653 https://github.com/pylint-dev/pylint/issues/5653)
- صدور used-before-assignment
برای
انتسابهای
خودارجاع
تحت شرایط if.
بستن #6643 (#6643 https://github.com/pylint-dev/pylint/issues/6643)
- صدور modified-iterating-list و
پیامهای
مشابه برای
dictها و setها
هنگام
پیمایش
مقادیر
لیتِرال
(literals)، یا
هنگام
استفاده از
کلمه کلیدی
del.
بستن #6648 (#6648 https://github.com/pylint-dev/pylint/issues/6648)
- صدور used-before-assignment
هنگام
فراخوانی
توابع تو در
تو قبل از
انتساب.
بستن #6812 (#6812 https://github.com/pylint-dev/pylint/issues/6812)
- صدور nonlocal-without-binding
هنگامی که
یک نام nonlocal در
نقطهای
بعدی در
همان دامنه
(scope) انتساب
داده شده
باشد.
بستن #6883 (#6883 https://github.com/pylint-dev/pylint/issues/6883)
- صدور using-constant-test
هنگام
آزمایش
مقدار
درستی (truth value) یک
متغیر یا
نتیجه
فراخوانی
حاوی یک
ژنراتور (generator).
بستن #6909 (#6909 https://github.com/pylint-dev/pylint/issues/6909)
- تغییر نام
unhashable-dict-key به unhashable-member
و صدور آن
هنگام
ایجاد setها و
dictها، نه فقط
هنگام
دسترسی به
dictها.
بستن #7034، بستن #7055 (#7034 https://github.com/pylint-dev/pylint/issues/7034)
- رفع خطای
بررسی کُد (lint)
بستههای
دارای __init__.py
واقع در
دایرکتوریهای
فاقد __init__.py.
بسته شد #1667 (#1667 https://github.com/pylint-dev/pylint/issues/1667)
- رفع
فروپاشی
مربوط به syntax-error /
E0001 <#syntax-error> که
هنگام
تعیین
کدگذاری utf-9
برای یک
فایل به
درستی
مدیریت
نمیشد.
بسته شد #3860 (#3860 https://github.com/pylint-dev/pylint/issues/3860)
- رفع
فروپاشی در
بررسی not-callable
در مواردی
که پیرامون
ارسال
نادرست یک
نمونه به __new__()
ابهام وجود
دارد.
بسته شد #7109 (#7109 https://github.com/pylint-dev/pylint/issues/7109)
- رفع
فروپاشی
هنگام
پرتاب
استثنای re.error
توسط
گزینهٔ regex.
بسته شد #7202 (#7202 https://github.com/pylint-dev/pylint/issues/7202)
- رفع خطای
undefined-loop-variable از
عملگر walrus در
آزمون comprehension.
بسته شد #7222 (#7222 https://github.com/pylint-dev/pylint/issues/7222)
- بررسی <cwd>
پیش از حذف
نخستین
مورد از sys.path
در modify_sys_path.
بسته شد #7231 (#7231 https://github.com/pylint-dev/pylint/issues/7231)
- رفع آلودگی
sys.path در حالت
موازی.
بسته شد #7246 (#7246 https://github.com/pylint-dev/pylint/issues/7246)
- جلوگیری از
useless-parent-delegation هنگام
واگذاری به
یک توکار (builtin)
نوشتهشده
به زبان C
(مانند Exception.__init__)
با
آرگومانهای
غیر self.
بسته شد #7319 (#7319 https://github.com/pylint-dev/pylint/issues/7319)
سایر تغییرات (Other Changes)
- نام bad-exception-context به
bad-exception-cause تغییر
یافت، زیرا
این مورد به
علت (cause) مربوط
است نه به
زمینه (context).
بسته شد #3694 (#3694 https://github.com/pylint-dev/pylint/issues/3694)
- پیام مربوط
به literal-comparison
اکنون در
مورد مشکل و
راهحل آن
صریحتر
است.
بسته شد #5237 (#5237 https://github.com/pylint-dev/pylint/issues/5237)
- نام useless-super-delegation به
منظور
جامعتر
بودن به
useless-parent-delegation تغییر
یافت.
بسته شد #6953 (#6953 https://github.com/pylint-dev/pylint/issues/6953)
- ابزار Pylint
اکنون از towncrier
برای ایجاد
گزارش
تغییرات (changelog)
استفاده
میکند.
ارجاع #6974 (#6974 https://github.com/pylint-dev/pylint/issues/6974)
- بهروزرسانی
astroid به نسخهٔ
2.12.
ارجاع #7153 (#7153 https://github.com/pylint-dev/pylint/issues/7153)
- رفع
فروپاشی
هنگام
اعلان یک __slots__
با
حاشیهنویسی
نوع (type-annotated) و
بدون مقدار.
بسته شد #7280 (#7280 https://github.com/pylint-dev/pylint/issues/7280)
تغییرات داخلی (Internal Changes)
- رفع مشکلی
که در آن
هنگام
غیرقابل
تجزیه بودن
خروجی
فعلی،
بهروزرسانی
خروجی
آزمونهای
کاربردی (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
افزونهها (Extensions)
- •
- RedefinedLoopNameChecker
- •
- افزودن افزونهٔ اختیاری redefined-loop-name برای صدور پیام هنگام بازتعریف یک متغیر در بدنهٔ حلقه.
بستن #5072
- •
- DocStringStyleChecker
- •
- فعالسازی مجدد بررسیکنندهٔ bad-docstring-quotes برای Python <= 3.7.
بستن #6087
- •
- NoSelfUseChecker
- •
- افزودن بررسی no-self-use که پیشتر بهطور پیشفرض فعال بود.
بستن #5502
تغییرات دیگر (Other Changes)
- نادیده
گرفتن خط
زیرین (_) به
عنوان یک
متغیر محلی
برای 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
موارد منسوخشده (Deprecations)
- گزینهٔ
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
تازههای Pylint 2.14.5
تاریخ انتشار: 2022-07-17
- رفع خرابی
در بررسی
undefined-loop-variable
هنگامی که
از enumerate() در یک
عبارت
سهتایی
استفاده
میشود.
بستن #7131
- رفع مشکل
کار با -- به
عنوان
جداکننده
میان
آرگومانهای
مکانی و
پرچمها.
بستن #7003
- رفع مشکل غیرفعالسازی fixme و تعامل آن با useless-suppression.
- مجاز شدن
فهرستهایی
از مقادیر
پیشفرض در
مستندسازی
پارامترها
برای سبک Numpy.
بستن #4035
تازههای Pylint 2.14.4
تاریخ انتشار: 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
تازههای Pylint 2.14.3
تاریخ انتشار: 2022-06-18
- رفع دو مورد
مثبت کاذب
در bad-super-call برای
فراخوانیهایی
که به یک
والد
غیرمستقیم
ارجاع
میدهند.
بستن #4922، بستن #2903
- رفع مثبت
کاذب در
useless-super-delegation برای
زیرکلاسهایی
که تعداد
پارامترها
را در برابر
والدی که از
آرگومان
متغیر (variadic)
استفاده
میکند
مشخص
میکنند.
بستن #2270
- امکان نادیدهگیری undefined-loop-variable و undefined-variable بدون برانگیختن useless-suppression.
- رفع مثبت
کاذب در
undefined-variable برای
__class__ در
متدهای
درونی.
بستن #4032
تازههای Pylint 2.14.2
تاریخ انتشار: 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
تازههای Pylint 2.14.0
تاریخ انتشار: 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.13 (What's New in Pylint 2.13)
از آغاز pylint تا نگارش 2.14.0 (شامل آن)، ما گزارش تغییراتی (changelog) داشتیم که حاوی تمام تغییرات غیرجزئی در Pylint بود، از جمله تغییراتی که برای کاربر ملموس نبودند؛ یعنی تغییراتی که ممکن است تنها برای توسعهدهندهای که روی pylint یا پلاگینهای آن کار میکند یا یک تاریخنگار دنیای متنباز جالب باشد.
از pylint 1.6.0 تا 2.14.0، علاوه بر گزارش تغییرات کامل، خلاصهای از تغییرات (عمدتاً کاربرمحور) نیز ارائه میشد.
خلاصه -- نکات برجسته انتشار (Summary -- Release highlights)
در نگارش 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 فرا رسید.
بررسیکنندههای جدید (New checkers)
- •
- افزودن چندین بررسیکننده (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
افزونهها (Extensions)
- افزونهی
جدید 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
سایر تغییرات (Other Changes)
- گنجاندن
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
گزارش کامل تغییرات (Full changelog)
تازههای Pylint 2.13.9 (What's New in Pylint 2.13.9?)
تاریخ انتشار: 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
تازههای Pylint 2.13.7 (What's New in Pylint 2.13.7?)
تاریخ انتشار: 2022-04-20
- •
- رفع کرش
ناشی از
استفاده از
پیکربندی
جدید نسخهٔ
2.14.0 در کدهای 2.13.x.
بسته شد #6408
تازههای Pylint 2.13.6 (What's New in Pylint 2.13.6?)
تاریخ انتشار: 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
تازههای Pylint 2.13.5 (What's New in Pylint 2.13.5?)
تاریخ انتشار: 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
چه مواردی در Pylint 2.13.3 جدید است؟
تاریخ انتشار: 2022-03-29
- رفع مثبت
کاذب برای
unnecessary-ellipsis هنگام
استفاده از
سهنقطه (ellipsis)
به عنوان
آرگومان
پیشفرض.
بستن #5973
- رفع کرش
مربوط به
بازگشایی
نامتوازن
تاپل (unbalanced tuple unpacking).
بستن #5998
- رفع مثبت
کاذب برای
nonexistent-operator / E0107 <#nonexistent-operator>'
هنگامی که
نویسههای
تکراری '-' از
هم جدا
شدهاند
(مثلاً با
پرانتز).
بستن #5769
چه مواردی در Pylint 2.13.2 جدید است؟
تاریخ انتشار: 2022-03-27
- رفع کرش
هنگام
ایجاد
زیرکلاس از
یک namedtuple.
بستن #5982
- رفع مثبت
کاذب برای
superfluous-parens در
الگوهایی
مانند "return (a or b) in
iterable".
بستن #5803
- رفع پسرفت
منفی کاذب
در نسخه 2.13.0 که
در آن protected-access
برای توابع
صادر
نمیشد.
بستن #5989
- پیامهای
خطای بهتر
در صورت
کرش،
هنگامی که pylint
قادر به
نوشتن
الگوی
گزارش مشکل
نیست.
ارجاع به #5987
چه مواردی در Pylint 2.13.1 جدید است؟
تاریخ انتشار: 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.12 (What's New in Pylint 2.12)
از آغاز کار pylint تا نسخهٔ 2.14.0 (شامل این نسخه)، ما گزارش تغییراتی داشتیم که شامل تمام تغییرات غیرجزئی Pylint میشد؛ از جمله تغییراتی که کاربر با آنها مواجه نمیشد، یعنی تغییراتی که ممکن بود تنها در صورتی برای شما جالب باشد که توسعهدهندهای باشید که روی pylint یا افزونههای pylint کار میکند یا یک تاریخنگار پروژههای متنباز.
از pylint نسخهٔ 1.6.0 تا 2.14.0، علاوه بر گزارش تغییرات کامل، خلاصهای از تغییرات (عمدتاً مرتبط با کاربر) نیز وجود داشت.
خلاصه -- نکات برجسته نسخه (Summary -- Release highlights)
در نسخهٔ 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 مشارکت شده است، به تیم خوش آمدید!
بررسیکنندههای جدید (New checkers)
- •
- بررسیکنندهٔ
missing-any-param-doc اضافه
شد که وقتی
تابعی نه
برای
پارامترها
و نه برای
نوع
پارامترها
مستندسازی
نداشته
باشد فعال
میشود.
پارامترهای
فاقد
مستندات
اکنون به
درستی
شناسایی
میشوند.
اگر missing-param-doc و
missing-type-doc
غیرفعال
شده بودند،
ممکن است
هشداری به
طور
غیرمنتظره
ظاهر شود،
زیرا پیام
جدید missing-any-param-doc
به جای
آنها صادر
خواهد شد.
بسته شدن #3799
typing.final
- افزودن 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
سایر تغییرات (Other Changes)
- اصلاح پیام 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
چه مواردی در Pylint 2.12.2 جدید است؟
تاریخ انتشار: 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
چه مواردی در Pylint 2.12.1 جدید است؟
تاریخ انتشار: 2021-11-25
- •
- الزام
پایتون 3.6.2
برای اجرای
pylint.
بسته شدن #5065
چه مواردی در Pylint 2.12.0 جدید است؟
تاریخ انتشار: 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
تازههای Pylint 2.11
از آغاز به کار 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
بررسیکننده CodeStyleChecker
- •
- افزوده شدن
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
چه چیزهایی در Pylint 2.11.1 جدید است؟
تاریخ انتشار: 2021-09-16
- •
- بررسیکننده
unspecified-encoding اکنون
کدگذاریِ
pathlib.Path() را
بهدرستی
بررسی
میکند
بسته شدن #5017
چه چیزهایی در Pylint 2.11.0 جدید است؟
تاریخ انتشار: 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)، علاوه بر گزارش کامل تغییرات، خلاصهای از تغییرات (عمدتاً تغییرات مربوط به کاربران) نیز ارائه میشد.
خلاصه -- نکات برجسته انتشار (Summary -- Release highlights)
در نسخه 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 بررسی کنید :)
بررسیکنندههای جدید (New checkers)
- افزوده شدن
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
افزونهها (Extensions)
- •
- CodeStyleChecker
- محدود کردن صدور consider-using-tuple تنها برای lists تعریفشده به صورت درجا (in-place).
- صدور consider-using-tuple حتی اگر لیست شامل یک عبارت ستارهدار (starred) باشد.
- افزوده شدن
افزونه
اختیاری
consider-ternary-expression:
هرگاه در هر
دو شاخه یک
بلوک if/else به یک
متغیر
مقداردهی
شود، صادر
میشود.
بسته شدن # 4366
- افزوده شدن
افزونه
اختیاری
while-used: هرگاه
یک حلقه while
استفاده
شود صادر
میشود.
بسته شدن # 4367
سایر تغییرات (Other Changes)
- ابزار 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
تازههای Pylint 2.10.2
تاریخ انتشار: 2021-08-21
- اکنون از platformdirs
بهجای appdirs
استفاده
میشود
زیرا بسته
اخیر دیگر
نگهداری
نمیشود.
بسته شد #4886
- رفع
فروپاشی در
بررسیکنندهای
که هنگام
شکست در
استنتاج
روی copy.copy خطای
shallow-copy-environ را
ایجاد
میکرد
بسته شد #4891
تازههای Pylint 2.10.1
تاریخ انتشار: 2021-08-20
- •
- ابزار pylint
هنگامی که
PYLINT_HOME وجود
ندارد،
دچار
فروپاشی
نمیشود.
بسته شد #4883
تازههای Pylint 2.10.0
تاریخ انتشار: 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.9
از آغاز کار 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) که یک مدیر زمینه برمیگرداند به یک آیتم از لیست یا دیکشنری اختصاص داده میشد.
چه مواردی در Pylint 2.9.6 جدید است؟
تاریخ انتشار: 2021-07-28
- •
- رفع مثبت
کاذب undefined-variable
هنگامی که
نام متغیر
در
دکوراتور
با آرگومان
تابع
مطابقت
دارد
بستن #3791
چه مواردی در Pylint 2.9.5 جدید است؟
تاریخ انتشار: 2021-07-21
- رفع یک
خرابی
هنگامی که
خطای 'TypeError object does not support item
assignment' در کدی که
تجزیه
میشود
وجود داشته
باشد.
بستن #4439
- رفع خرابی
در صورتی که
یک شیء قابل
فراخوانی
با مقدار
بازگشتی context
manager، به یک
آیتم از list یا
dict انتساب
داده میشد
بستن #4732
- رفع یک
خرابی
هنگامی که
یک AttributeInferenceError در
زمان عدم
موفقیت در
استنتاج
نام واقعی
یک import در astroid
بهدرستی
مدیریت
نمیشد.
بستن #4692
چه مواردی در Pylint 2.9.4 جدید است؟
تاریخ انتشار: 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 دیگر سه فاصلهٔ خالی انتهایی را برای خطهای خالی در گزارش خود اضافه نمیکند.
چه مواردی در Pylint 2.9.2 جدید است؟
تاریخ انتشار: 2021-07-01
- رفع خطای
فروپاشی
هنگام
تحلیل کدی
که از type(self)
برای
دسترسی به
یک ویژگی
کلاس در
بررسیکنندهٔ
unused-private-member
استفاده
میکرد.
بسته شدن #4638
- رفع مثبت
کاذب در
unused-private-member هنگام
دسترسی به
یک متغیر
خصوصی با self.
بسته شدن #4644
- رفع مثبت
کاذب در
unnecessary-dict-index-lookup و
consider-using-dict-items برای
جستجوهای
نمایهٔ
دیکشنری که
دوباره
مقداردهی
شدهاند.
بسته شدن #4630
چه مواردی در Pylint 2.9.1 جدید است؟
تاریخ انتشار: 2021-06-30
- •
- ارتقای astroid به
نسخهٔ 2.6.2
بسته شدن #4631 بسته شدن #4633
چه مواردی در Pylint 2.9.0 جدید است؟
تاریخ انتشار: 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.8
از آغاز 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 تغییر یافت.
گزارش کامل تغییرات
تازههای Pylint 2.8.3
تاریخ انتشار: 2021-05-31
- •
- نسخهٔ Astroid
برای شاخهٔ
2.8 بر روی 2.5.6
ثابت (pinned) شده
است.
ارجاع به #4527
تازههای Pylint 2.8.2
تاریخ انتشار: 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
تازههای Pylint 2.8.1
تاریخ انتشار: 2021-04-25
- •
- بازگرداندن
موقت numversion در
__pkginfo__ به دلیل
ایجاد شکست
در عملکرد
Pylama، و
بازگردانی
(revert) تغییر
ناسازگار و
غیرضروری
pylint.version.
بستن #4399
تازههای Pylint 2.8.0
تاریخ انتشار: 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) برای مجاز شمردن دسترسی در متدهای کلاس
سیاههٔ کامل تغییرات
تازههای Pylint 2.7.4
تاریخ انتشار: 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
تازههای Pylint 2.7.2؟
تاریخ انتشار: 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
تازههای Pylint 2.7.0 (What's New in Pylint 2.7.0?)
تاریخ انتشار: 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.6
از ابتدای 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 اجرا کنید.
گزارش کامل تغییرات
تغییرات جدید در Pylint 2.6.1؟
تاریخ انتشار: 2021-02-16
- •
- نسخه Astroid
برابر < 2.5
تعیین شده
است
بسته شد: #4093
تغییرات جدید در Pylint 2.6.0؟
تاریخ انتشار: 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 اضافه شد.
- •
- بررسی جدید assert-on-string-literal اضافه شد.
- •
- بررسی جدید f-string-without-interpolation اضافه شد.
- •
- چندین بررسی برای انواع بازگشتی نامعتبر توابع پروتکل اضافه شدند:
- 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 اضافه شد.
- •
- بررسی جدید 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 نامعتبر است.
گزارش کامل تغییرات (Full changelog)
چه مواردی در Pylint 2.5.3 جدید است؟ (What's New in Pylint 2.5.3?)
تاریخ انتشار: 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
تازههای Pylint 2.5.1
تاریخ انتشار: 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
تازههای Pylint 2.5.0
تاریخ انتشار: 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)
چه مواردی در Pylint 2.4.4 جدید است؟
تاریخ انتشار: 2019-11-13
- معاف شدن
تمام
نامهای
یافتشده
در
حاشیهنویسیهای
نوع (type annotations) از
unused-import
کد پیشین فرض میکرد که تنها نامهای typing باید معاف شوند، اما لازم است این کار برای سایر نامهای موجود در کامنتهای نوع نیز انجام شود.
بستن #3112
- تسهیل
شناسایی
وارد کردن
نوع (type import) برای
نامهایی
که از ماژول
typing
نمیآیند
بستن #3191
چه مواردی در Pylint 2.4.3 جدید است؟
تاریخ انتشار: 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
چه مواردی در Pylint 2.4.2 جدید است؟
تاریخ انتشار: 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 جهت جلوگیری از هرگونه مشکل ناسازگاری.
تازههای Pylint 2.4.0 (What's New in Pylint 2.4.0?)
تاریخ انتشار: 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 میشناسد اضافه شده است. این گزینه برای آگاهی از اینکه چه گروههایی را میتوان بهصورت جداگانه فعال یا غیرفعال کرد مفید است.
گزارش کامل تغییرات
تازههای Pylint 2.3.0
تاریخ انتشار: 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.2
از ابتدای 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
چه مواردی در Pylint 2.2.2 جدید است؟
تاریخ انتشار: 2018-11-28
- •
- تغییر logging-format-style
بهطوری که
بهجای
شناسههای
متناظر
پایتونی،
از شناسه
نام
استفاده
کند
این کار برای بینیاز کردن کاربران از فکر کردن درباره گریز (escape) دادن مقدار پیشفرض logging-format-style در فایل پیکربندی تولیدشده است. همچنین ابزارهای تحلیل پیکربندی ما هنگام تشخیص choices بهطور کامل از مقادیر گریز دادهشده پشتیبانی نمیکنند، بنابراین این موضوع نیازمند ترفندهای مختلفی برای دور زدن آن میبود.
بسته شدن #2614
چه مواردی در Pylint 2.2.1 جدید است؟
تاریخ انتشار: 2018-11-27
- •
- رفع خرابی
ناشی از
implicit-str-concat-in-sequence و
نویسههای
چندبایتی.
بسته شدن #2610
چه مواردی در Pylint 2.2 جدید است؟
تاریخ انتشار: 2018-11-25
- در نظر
گرفتن
اشیاء range()
برای undefined-loop-variable
که از تکرار
حلقه نشت
میکند.
بسته شدن #2533
- deprecated-method میتواند از نام مشخصه برای شناسایی یک متد منسوخشده استفاده کند
- رفع ناسازگاری با تغییرات اعمالشده در توکنساز stdlib.
- pylint اشتیاق
کمتری برای
مصرف کل خط
جهت
پراگماها (pragmas)
نشان
میدهد
بسته شدن #2485
- دریافت
تعداد صحیح
پردازندهها
(CPUs) برای
محیطهای
مجازیسازیشده
یا
کانتینری.
بسته شدن #2519
- بازگرداندن مجدد unbalanced-tuple-unpacking به وضعیت هشدار.
- حذف
پیشنهاد
استفاده از
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
- 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.1 (What's New In Pylint 2.1)
از آغاز pylint تا نسخه 2.14.0 (شامل آن)، ما یک گزارش تغییرات داشتیم که شامل تمام تغییرات غیرجزئی در Pylint میشد، از جمله تغییراتی که رو به کاربر نبودند، یعنی تغییراتی که تنها در صورتی ممکن بود برایتان جالب باشند که توسعهدهندهای باشید که روی pylint یا افزونههای pylint کار میکند، یا یک تاریخنگار پروژههای متنباز باشید.
از pylint 1.6.0 تا 2.14.0، علاوه بر گزارش تغییرات کامل، خلاصهای از تغییرات (عمدتاً مرتبط با کاربر) نیز وجود داشت.
خلاصه -- نکات برجسته انتشار (Summary -- Release highlights)
- •
- این انتشار عمدتاً شامل رفع اشکالاتی است که پس از عرضه 2.0 پیدا شدهاند.
بازرسهای جدید (New checkers)
- •
- یک بررسی
جدید
افزوده شد:
misplaced-format-function.
این پیام زمانی صادر میشود که pylint تشخیص دهد تابع format روی شیئی غیر از str فراخوانی شده است. این حالت میتواند به دلیل قرارگیری نادرست پرانتز بسته رخ دهد، مانند:
print('value: {}').format(123) # bad
print('value: {}'.format(123)) # good
سایر تغییرات (Other Changes)
- بررسی 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 افزوده شد.
چه مواردی در Pylint 2.1.1 جدید است؟
تاریخ انتشار: 2018-08-07
- رفع خرابی pylint
ناشی از عدم
مدیریت
صحیح ویژگی
کلاس در
misplaced-format-function.
بسته شد #2384
- عدم صدور *-builtin
برای
بررسیهای
توکار (builtin) در Python
3 زمانی که
مورد توکار
درون یک try-except
استفاده
شده باشد
بسته شد #2228
- عدم صدور simplifiable-if-statement هنگام کار با اندیسها (subscripts)
چه مواردی در Pylint 2.1 جدید است؟
تاریخ انتشار: 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)
- عدم صدور
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، علاوه بر سیاههٔ کامل تغییرات، خلاصهای از تغییرات (عمدتاً برای کاربران نهایی) نیز وجود داشت.
خلاصه -- نکات برجسته انتشار (Summary -- Release highlights)
- پشتیبانی
از 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).
بررسیکنندههای جدید (New checkers)
- •
- یک بررسی
جدید
افزوده شد:
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 اضافه شد.
برای نمونه، کد زیر اکنون این خطای جدید را ایجاد خواهد کرد:
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های تودرتو.
موارد جدید در Pylint 2.0 (What's New in Pylint 2.0?)
تاریخ انتشار: 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 حالتهای متعددی را در نظر میگیرد
بسته شدن #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
1.x
از آغاز pylint تا نسخه 2.14.0 (شامل آن)، ما گزارش تغییراتی (changelog) داشتیم که دربردارنده تمام تغییرات غیربدیهی Pylint بود، از جمله تغییراتی که برای کاربران نهایی ملموس نبودند؛ یعنی تغییراتی که تنها در صورتی برای شما جذاب بودند که توسعهدهندهای باشید که روی pylint یا افزونههای pylint کار میکنید، یا یک تاریخنگار متنباز باشید.
از pylint 1.6.0 تا 2.14.0، علاوه بر گزارش تغییرات کامل، خلاصهای از تغییرات (عمدتاً برای کاربران نهایی) نیز وجود داشت.
تازههای Pylint 1.9 (What's New In Pylint 1.9)
از آغاز pylint تا نسخه 2.14.0 (شامل آن)، ما گزارش تغییراتی (changelog) داشتیم که دربردارنده تمام تغییرات غیربدیهی Pylint بود، از جمله تغییراتی که برای کاربران نهایی ملموس نبودند؛ یعنی تغییراتی که تنها در صورتی برای شما جذاب بودند که توسعهدهندهای باشید که روی pylint یا افزونههای pylint کار میکنید، یا یک تاریخنگار متنباز باشید.
از pylint 1.6.0 تا 2.14.0، علاوه بر گزارش تغییرات کامل، خلاصهای از تغییرات (عمدتاً برای کاربران نهایی) نیز وجود داشت.
خلاصه -- نکات برجسته انتشار (Summary -- Release highlights)
- •
- تاکنون موردی وجود ندارد
بررسیکنندههای جدید (New checkers)
- یک بررسیکننده جدید 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 ندارند.
گزارش کامل تغییرات
چه چیزهایی در Pylint 1.9 جدید است؟
تاریخ انتشار: 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 1.8 جدید است
از آغاز 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
این پیام هر زمان که تشخیص داده شود یک رشتهٔ بایت حاوی نویسههای غیر 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 را برای خطوط پس از آن غیرفعال نمیکند.
تازههای Pylint 1.8.1
تاریخ انتشار: 2017-12-15
- •
- شماره نسخه نادرست در __pkginfo__.
تازههای Pylint 1.8
تاریخ انتشار: 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 فراتر میروند
بسته شد #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 1.7
از ابتدای 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
- •
- افزونهی جدیدی به نام 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)
- •
- یک بررسی بازآفرینی کد (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"
سایر تغییرات (Other Changes)
- اگر اشیاء
استنتاج
مبهم (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 را نسبت به آنچه مد نظر بود اجرا کند.
گزارش کامل تغییرات (Full changelog)
موارد جدید در Pylint 1.7.1 (What's New in Pylint 1.7.1?)
تاریخ انتشار: 2017-04-17
- رفع یک مورد
مثبت کاذب (false
positive) که هنگام
بازبرانگیختن
یک استثنا
رخ میداد.
بسته شدن #1419
- رفع یک مورد
مثبت کاذب
در disallow-trailing-tuple
این بررسی با راستیآزمایی خطهای جدیدِ غیرپایانبخش (non-terminating newlines) بهبود یافت که باید فراخوانیهای تابع و تعاریف تابع را از این بررسی معاف کند.
بسته شدن #1424
موارد جدید در Pylint 1.7 (What's New in Pylint 1.7?)
تاریخ انتشار: 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 1.6
از آغاز 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
رفع باگها (Bug fixes)
- رفع باگی که در آن بالاترین نام یک واردسازی واجد شرایط (qualified import) به عنوان متغیر استفادهنشده شناسایی میشد.
- اگر شیء نمایهگذاریشده دارای کلاسهای پایه ناشناختهای باشد که Pylint نتواند آنها را استنتاج کند، دیگر هشدار invalid-sequence-index صادر نمیشود.
سایر تغییرات (Other Changes)
- بررسی 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
نام قدیمی همچنان برای سازگاری با گذشته حفظ شده است، اما در نهایت حذف خواهد شد.
قابلیتهای حذفشده (Removed features)
- •
- هنوز موردی وجود ندارد
گزارش کامل تغییرات (Full changelog)
تازههای Pylint 1.6.3
تاریخ انتشار: 2016-07-18
- •
- عدم
فروپاشی (crash)
هنگام
استنتاج
انواع
استثناهای
غیرقابلاستنتاج
برای
افزونهٔ docparams
بسته شد #998
تازههای Pylint 1.6.2
تاریخ انتشار: 2016-07-15
- عدم
فروپاشی
هنگام چاپ
راهنمای
گزینههایی
با عبارات
باقاعدهٔ
پیشفرض
بسته شد #990
- نسخههای
تفکیکشدهتر
و دقیقتر
برای
ماژولهای
منسوخشده.
بسته شد #991
تازههای Pylint 1.6.1
تاریخ انتشار: 2016-07-07
- •
- استفاده از نشانگرهای محیطی (environment markers) برای پشتیبانی از وابستگیهای شرطی.
تازههای Pylint 1.6.0
تاریخ انتشار: 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
تازههای Pylint 1.5.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
تازههای Pylint 1.5.4؟
تاریخ انتشار: 2016-01-15
- ادغام StringMethodChecker با StringFormatChecker. این کار نقصی را رفع میکند که در آن غیرفعال کردن تمام پیامها و تنها فعال کردن شمار اندکی از پیامهای StringFormatChecker منجر به عدم نمایش هیچ پیامی میشد.
- عدم اعمال unneeded-not / C0113 <#unneeded-not> روی مجموعهها (sets).
تازههای Pylint 1.5.3؟
تاریخ انتشار: 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
چه مواردی در Pylint 1.5.1 جدید است؟
تاریخ انتشار: 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.
چه مواردی در Pylint 1.5.0 جدید است؟
تاریخ انتشار: 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.
- deprecated-module / W4901 <#deprecated-module> میتواند برای ماژولهایی که در دسترس
- نیستند نیز نمایش داده شود.
بسته شدن #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.
تازههای Pylint 1.4
تازههای Pylint 1.4.3
تاریخ انتشار: 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 خواهد بود).
تازههای Pylint 1.4.2
تاریخ انتشار: 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) و در صورتی که فایلهای دادهشده به عنوان آرگومان اصلاً وجود نداشتند، رخ میداد.
تازههای Pylint 1.4.0 (What's New in Pylint 1.4.0?)
تاریخ انتشار: 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 حذف شده است).
تازههای Pylint 1.2.0؟ (What's New in Pylint 1.2.0?)
تاریخ انتشار: 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
تازههای Pylint 1.0
تاریخ انتشار: 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
0.x
از آغاز pylint تا pylint 2.14.0 (شامل آن)، تغییرنامهای داشتیم که شامل تمام تغییرات غیرجزئی در Pylint بود، از جمله تغییراتی که برای کاربران ملموس نبودند؛ یعنی تغییراتی که تنها اگر توسعهدهندهای باشید که روی pylint یا افزونههای pylint کار میکنید، یا تاریخنگار متنباز هستید، برایتان جالب خواهد بود.
شماره تیکتها تقریباً همیشه داخلی Logilab هستند و برخی از bitbucket میآیند.
در Pylint 0.28.0 چه چیزهایی جدید است؟
تاریخ انتشار: 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>
در Pylint 0.27.0 چه چیزهایی جدید است؟
تاریخ انتشار: 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)
چه چیزهایی در Pylint 0.25.2 جدید است؟
تاریخ انتشار: 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
چه چیزهایی در Pylint 0.25.1 جدید است؟
تاریخ انتشار: 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 به درستی رندر نمیشود
چه مواردی در Pylint 0.24.0 جدید است؟
تاریخ انتشار: 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 جهت تطابق با واقعیت
چه مواردی در Pylint 0.23.0 جدید است؟
تاریخ انتشار: 2011-01-11
- بهروزرسانی مستندات، افزودن صفحههای راهنما (man pages)
- چندین بهبود در کارایی
- نهاییسازی پشتیبانی از python3
- هشدار جدید W0106 تحت عنوان 'Expression "%s" is assigned to nothing'
- حذف پیامهای E0501 و E0502 دربارهٔ کدگذاری نادرست منبع: دیگر کاربردی ندارد زیرا برای نسخهٔ python >= 2.5 یک خطای نگارشی محسوب میشود و اکنون ما تنها از این نسخهٔ پایتون و بالاتر پشتیبانی میکنیم.
- عدم صدور W0221 یا W0222 هنگامی که متدها آرگومانهای متغیر دارند (مانند *arg و/یا **args). وصله ارسالشده توسط Charles Duffy.
چه مواردی در Pylint 0.22.0 جدید است؟
تاریخ انتشار: 2010-11-15
- •
- نسخههای پایتون: پشتیبانی کمینه از python3.x؛ کنار گذاشتن پشتیبانی از نسخههای python < 2.5
چه مواردی در Pylint 0.21.4 جدید است؟
تاریخ انتشار: 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 پشتیبانی میکند.
تازههای Pylint 0.21.2
تاریخ انتشار: 2010-08-26
- رفع اشکال #36193: پرتاب استثنا توسط بررسیکنندهٔ import در واردکردنهای چرخهای
- رفع اشکال #28796: پسرفت در --generated-members ایجاد شده در pylint 0.20
- پاکسازی و مرتبسازی برخی مستندات
تازههای Pylint 0.21.1
تاریخ انتشار: 2010-06-04
- رفع اشکال #28962: فروپاشی pylint با گزینههای جدید، به دلیل نبود دادههای آماری هنگام نوشتن گزارش Statistics by types
- بهروزرسانی صفحهٔ راهنما (man page) به شیوهٔ استفاده از خط فرمان 0.21 یا بالاتر (رفع اشکال دبیان #582494)
تازههای Pylint 0.21.0
تاریخ انتشار: 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
تازههای Pylint 0.20.0
تاریخ انتشار: 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)
تازههای Pylint 0.18.0
تاریخ انتشار: 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
تازههای Pylint 0.17.0
تاریخ انتشار: 2009-03-19
- بررسی نقطهویرگول: انتقال W0601 به W0301
- حذف rpython: حذف تمام بررسیکنندهها، ماژولها و تستهای rpython
- سازگاری با astng 0.18: پشتیبانی از رابطهای تغییریافته ماژول _ast
تازههای Pylint 0.16.0
تاریخ انتشار: 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 را اجرا نمیکند
تازههای Pylint 0.15.1
تاریخ انتشار: 2008-09-15
- رفع #4910: مقادیر پیشفرض در صفحهٔ راهنما (manpage) وجود ندارند
- رفع #5991: فایلهای مفقود در بستهٔ tarball نگارش 0.15.0
- رفع #5993: ابزار epylint باید با python 2.3 کار کند
تازههای Pylint 0.15.0
تاریخ انتشار: 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
تازههای Pylint 0.14.0
تاریخ انتشار: 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)
تازههای Pylint 0.13.2
تاریخ انتشار: 2007-06-07
- اصلاح گزینهٔ disable-checker بهگونهای که بررسیکنندهٔ rpython را (که بهطور پیشفرض غیرفعال است) تصادفاً فعال نکند
- افزودن یادداشتی دربارهٔ افزونهٔ gedit به مستندات
تازههای Pylint 0.13.1
تاریخ انتشار: 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: هنگامی که پیامی صریحاً فعال میشود، بررسی شود که بررسیکننده صادرکننده آن نیز فعال باشد.
چه مواردی در Pylint 0.12.2 تازه است؟ (What's New in Pylint 0.12.2?)
تاریخ انتشار: 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).
- رفع برخی موارد مثبت کاذب در بررسیکننده قالببندی.
چه مواردی در Pylint 0.12.1 تازه است؟ (What's New in Pylint 0.12.1?)
تاریخ انتشار: 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 در پلتفرمهای ویندوز
چه مواردی در Pylint 0.11.0 جدید است؟
تاریخ انتشار: 2006-04-19
- رفع خرابی ناشی از بررسیکننده exceptions در برخی موارد
- رفع برخی هشدارهای مثبت کاذب در E1101 برای متدهای انتزاعی یا کلاسهایی که __getattr__ را تعریف میکنند
- راهحل موقت برای جلوگیری از خطای "_socketobject" has not "connect" member. مشکل اصلی این است که astng قادر به فهم کدی که برای ساخت شیء socket.socket با استفاده از exec به کار رفته نیست
- افزودن گزینهای در بررسیکننده similarity برای نادیده گرفتن docstringها، که به طور پیشفرض فعال است
- گنجاندن وصله از Benjamin Niemann برای فعالسازی/غیرفعالسازی پیامها در سطح بلوک
چه مواردی در Pylint 0.10.0 جدید است؟
تاریخ انتشار: 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).
چه مواردی در Pylint 0.8.1 جدید است؟
تاریخ انتشار: 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).
چه مواردی در Pylint 0.8.0 جدید است؟
تاریخ انتشار: 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
تازههای Pylint 0.6.4
تاریخ انتشار: 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))
- بستهبندی صفحه راهنمای تولیدشده
تازههای Pylint 0.6.3
تاریخ انتشار: 2005-02-24
- رفع مشکل حوزه دید (scope) که میتوانست باعث مثبت کاذب و منفی صادق در E0602 شود
- رفع مشکل برخی گزینهها مانند disable-msg که هنگام دریافت از فایل پیکربندی باعث ایجاد خطا میشدند
تازههای Pylint 0.6.2
تاریخ انتشار: 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 کار کند، اگرچه ارتقا توصیه میشود)
چه چیزهایی در Pylint 0.6.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
- بهبود پوشش آزمونها
چه چیزهایی در Pylint 0.5.0 جدید است؟
تاریخ انتشار: 2004-10-19
- اجتناب از درونریزی (import) ماژولهای تحلیلشده!
- دستهبندیهای پیام جدید Refactor و Convention. برخی از هشدارها به این دستهبندیهای جدید منتقل شدند
- افزوده شدن "similar"، ابزاری برای یافتن خطوط کپی و جایگذاری شده کد، هم به صورت ابزار خط فرمان مستقل و هم یکپارچهشده به عنوان یک بررسیکننده در pylint
- امکان گزارش وابستگیهای درونریزی توسط بررسیکننده imports به صورت یک گراف dot
- بررسیکننده جدیدی که اغلب موارد تشخیص Refactor را گردآوری میکند (همراه با برخی معیارهای جدید)
- امکان ذخیره گزینههای خط فرمان بیشتری در فایل پیکربندی
- رفع باگ مربوط به تعداد کل / مستندسازینشده متدها
چه چیزهایی در Pylint 0.4.2 جدید است؟
تاریخ انتشار: 2004-07-08
- اصلاح حالت Emacs برای pylint
- اصلاح بررسیکنندههای کلاسها جهت مدیریت رابطهای twisted
چه چیزهایی در Pylint 0.4.1 جدید است؟
تاریخ انتشار: 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 برای چیدمان گزارشها
چه مواردی در Pylint 0.3.3 جدید است؟
تاریخ انتشار: 2004-02-17
- افزودن یک خروجی متنی قابل تجزیه (parsable)، هنگام استفاده از گزینهٔ --parsable
- افزودن یک حالت Emacs با استفاده از این خروجی، موجود در پوشهٔ elisp توزیع
- اصلاح برخی اشتباهات نگارشی در پیامها
- تغییر مقادیر گزینه include-ids به yn، و مجاز کردن آن در فایل پیکربندی
- جلوگیری از توقف ناگهانی به دلیل فایلهای آمار آسیبدیده
- رفع باگ در بررسیکنندهٔ قالببندی که ممکن بود اجرای pylint را متوقف کند
- ارائه اسکریپتهایی برای unix و windows جهت اجرای رابط گرافیکی حداقلی tk برای pylint
چه مواردی در Pylint 0.3.2 جدید است؟
تاریخ انتشار: 2003-12-23
- گریز دادن کدهای HTML در پیامهای گزارشگر HTML (گزارش باگ توسط Juergen Hermann)
- افزودن "TODO" به فهرست برچسبهای یادداشت پیشفرض
- افزودن "rexec" به فهرست ماژولهای منسوخشدهٔ پیشفرض
- اصلاح اشتباهات نگارشی در برخی پیامها
چه مواردی در Pylint 0.3.1 جدید است؟
تاریخ انتشار: 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).
چه مواردی در Pylint 0.2.1 جدید است؟
تاریخ انتشار: 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 که یادداشت ارزیابی نظر را فعال میکند (به طور پیشفرض غیرفعال است).
- برطرفسازی انبوهی از باگها
- زیرساخت آسان برای آزمونهای کارکردی
چه مواردی در Pylint 0.1.2 جدید است؟
تاریخ انتشار: 2003-06-18
- انتشار رفع باگ
- حذف وابستگی به pyreverse
چه مواردی در Pylint 0.1.1 جدید است؟
تاریخ انتشار: 2003-06-01
- •
- قابلیتهای بسیار بیشتر!
چه مواردی در Pylint 0.1 جدید است؟
تاریخ انتشار: 2003-05-19
- •
- انتشار اولیه
پرسشهای متداول
چگونه Pylint را نصب کنم؟
برای استفاده در خط فرمان، 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.
چگونه در Pylint مشارکت کنم؟
ما از انواع مشارکتها استقبال میکنیم؛ مانند بهروزرسانی مستندات، کدهای جدید، بررسی گزارشهای مشکل برای موارد تکراری یا اعلام به ما جهت بستن آنها، تأیید پابرجا بودن مشکلات، ایجاد گزارش مشکل در صورت یافتن باگ یا درخواست یک ویژگی جدید 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 از طرح نسخهگذاری خاصی پیروی میکند؟
بخش ارتقای pylint را در راهنمای نصب ببینید <#upgrading-pylint>.
چگونه نام متناظر با یک گزینه مشخص در خط فرمان را پیدا کنم؟
مستندات پیکربندی را ببینید <#all-configurations-options>..SS قالب فایل پیکربندی چیست؟
فایل پیکربندی میتواند یک فایل ini یا toml باشد. برای مشاهده فهرست کامل گزینههای ممکن <#all-options> را ببینید.
چگونه یک پیام خاص را غیرفعال کنیم؟
برای جزئیات و مثالها، بخش کنترل پیامها <#message-control> را بخوانید.
Pylint به کد من از ۱۰ نمره منفی داد. این نمیتواند درست باشد!
پیش از Pylint 2.13.0، فرمول امتیازی که بهصورت پیشفرض استفاده میشد کران پایینی نداشت. فرمول امتیاز پیشفرض جدید عبارت است از:
max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10))
اگر پروژه شما شامل یک فایل پیکربندی است که توسط نسخه قدیمیتری از Pylint ایجاد شده است، میتوانید evaluation را روی عبارت بالا تنظیم کنید تا رفتار جدید را به دست آورید. همچنین، از آنجا که مقادیر منفی از نظر فنی همچنان پشتیبانی میشوند، evaluation میتواند روی نسخهای از عبارت بالا تنظیم شود که حداقل صفر را اعمال نمیکند.
چگونه از دریافت هشدارهای آرگومان استفادهنشده برای APIهایی که در کنترلم نیستند جلوگیری کنم؟
پیشوند نام callback را با cb_ (مخفف callback) قرار دهید، مانند cb_onclick(...). با انجام این کار، استفاده از آرگومانها بررسی نخواهد شد. راهحل دیگر استفاده از یکی از نامهای تعریفشده در متغیر پیکربندی "dummy-variables" برای آرگومانهای استفادهنشده است (بهصورت پیشفرض "_" و "dummy").
چرا دستهای از پیامها بهصورت پیشفرض غیرفعال هستند؟
یا به این دلیل که مستعد مثبت کاذب هستند، یا به این خاطر که بیش از حد سلیقهای هستند و نباید جزو پیامهای پیشفرض قرار گیرند.
میتوانید افزونهای را که باید صراحتاً بارگذاری کنید در مرجع فنی <#optional-checkers> مشاهده کنید.
میخواهم pylint را با هر بار فشردن کلید در محیط توسعه (IDE) اجرا کنم. چگونه این کار را انجام دهم؟
مجموعه کامل بررسیهای 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 نوع یک مقدار خاص را تشخیص ندهد و استنتاج ضعیفتری برای آن زیرمجموعه تولید کند. موازیسازی 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
چگونه از پیامهای "access to undefined member" در کلاسهای mixin خود جلوگیری کنم؟
باید پیام 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
میتوانید با استفاده از سرور Discord دربارهٔ مشکل خود گفتگو کنید:
فهرستهای پستی
فهرست پستی 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 به تیمهای توسعهٔ نرمافزار یک منبع واحد برای خرید و نگهداری نرمافزارهایشان با تضمینهای سطح حرفهای از سوی کارشناسانی که آن را به بهترین شکل میشناسند ارائه میدهد، در حالی که بهشکلی روان و یکپارچه با ابزارهای موجود ادغام میشود.
نویسندگان (AUTHORS)
Logilab و مشارکتکنندگان Pylint
کپیرایت و تکثیر (COPYRIGHT)
2003-2026, Logilab و مشارکتکنندگان Pylint
| August 10, 2026 | 4.0 |