| JEDI(1) | Jedi | JEDI(1) |
نام (NAME)
jedi - مستندات
Jedi، ابزار
تحلیل
ایستا و
تکمیل
خودکار
برای
پایتون
[تصویر:
ستارههای
GitHub] [تصویر]
https://github.com/davidhalter/jedi[تصویر:
درصد
ایشوها و
پولریکوئستهای
باز] [تصویر]
https://github.com/davidhalter/jedi/issues[تصویر:
زمان حل،
میانگین
زمانی است
که یک ایشو
یا
پولریکوئست
باز
میماند.]
[تصویر]
https://github.com/davidhalter/jedi/issues[تصویر:
آزمونها]
[تصویر]
https://github.com/davidhalter/jedi/actions[تصویر:
وضعیت پوشش
کد] [تصویر]
https://coveralls.io/r/davidhalter/jedi[تصویر:
تعداد
دانلودهای
PyPI] [تصویر]
https://pepy.tech/project/jedi
مخزن گیتهاب: https://github.com/davidhalter/jedi
ابزار Jedi یک ابزار تحلیل ایستا برای Python است که معمولاً در افزونههای IDEها و ویرایشگرها به کار میرود. تمرکز اصلی Jedi بر روی تکمیل خودکار (autocompletion) و قابلیت رفتن به تعریف (goto) است. ویژگیهای دیگر شامل بازسازی کد (refactoring)، جستجوی کد و یافتن ارجاعات است.
ابزار Jedi دارای یک API ساده برای استفاده است. یک پیادهسازی مرجع بهصورت افزونه برای VIM در https://github.com/davidhalter/jedi-vim وجود دارد. همچنین امکان تکمیل خودکار در REPL شما نیز فراهم است؛ IPython بهصورت بومی از آن استفاده میکند و برای CPython REPL نیز میتوانید آن را نصب کنید. ابزار Jedi بهخوبی آزموده شده است و وجود باگ در آن باید بسیار نادر باشد.
در اینجا یک مثال ساده از قابلیت تکمیل خودکار آورده شده است:
>>> import jedi
>>> source = '''
... import json
... json.lo'''
>>> script = jedi.Script(source, path='example.py')
>>> script
<Script: 'example.py' ...>
>>> completions = script.complete(3, len('json.lo'))
>>> completions
[<Completion: load>, <Completion: loads>]
>>> print(completions[0].complete)
ad
>>> print(completions[0].name)
load
برای نمونه، قابلیت تکمیل خودکار در jedi-vim میتواند به این شکل باشد:
استفاده از Jedi
میتوان از Jedi به همراه انواع افزونهها، سرورهای زبان و نرمافزارهای دیگر استفاده کرد. همچنین استفاده از Jedi در شل Python یا به همراه IPython امکانپذیر است.
در ادامه همچنین میتوانید فهرستی از دستورالعملها را برای راهنمایی نوع (type hinting) بیابید.
سرورهای زبان (Language Servers)
- jedi-language-server https://github.com/pappasam/jedi-language-server
- python-language-server https://github.com/palantir/python-language-server (در حال حاضر نگهداری نمیشود)
- python-lsp-server https://github.com/python-lsp/python-lsp-server (انشعاب از python-language-server)
- anakin-language-server https://github.com/muffinmad/anakin-language-server
افزونههای ویرایشگر (Editor Plugins)
Vim
- jedi-vim https://github.com/davidhalter/jedi-vim
- YouCompleteMe https://valloric.github.io/YouCompleteMe
- deoplete-jedi https://github.com/zchee/deoplete-jedi
Visual Studio Code
- •
- Python Extension https://marketplace.visualstudio.com/items?itemName=ms-python.python
Emacs
- Jedi.el https://github.com/tkf/emacs-jedi
- elpy https://github.com/jorgenschaefer/elpy
- anaconda-mode https://github.com/proofit404/anaconda-mode
Sublime Text 2/3
- SublimeJEDI https://github.com/srusskih/SublimeJEDI (ST2 و ST3)
- anaconda https://github.com/DamnWidget/anaconda (فقط ST3)
SynWrite
- •
- SynJedi http://uvviewsoft.com/synjedi
TextMate
- •
- Textmate https://github.com/lawrenceakka/python-jedi.tmbundle (مشخص نیست که آیا واقعاً کار میکند یا خیر)
Kate
- •
- Kate https://kate-editor.org در نسخهٔ 4.13+ بهصورت بومی از آن پشتیبانی میکند https://projects.kde.org/projects/kde/applications/kate/repository/entry/addons/kate/pate/src/plugins/python_autocomplete_jedi.py?rev=KDE%2F4.13، اگرچه باید آن را فعال کنید.
Atom
- •
- autocomplete-python-jedi https://atom.io/packages/autocomplete-python-jedi
GNOME Builder
- •
- GNOME Builder https://wiki.gnome.org/Apps/Builder بهصورت بومی از آن پشتیبانی میکند https://git.gnome.org/browse/gnome-builder/tree/plugins/jedi، و بهطور پیشفرض فعال است.
Gedit
- •
- Eric IDE https://eric-ide.python-projects.org
اشکالزدای وب (Web Debugger)
پوسته xonsh (xonsh shell)
Jedi یک افزونهٔ از پیش نصبشده در پوستهٔ xonsh است https://xon.sh/contents.html. برای فعالسازی دستور زیر را اجرا کنید:
xontrib load jedi
و موارد بسیار دیگر!
تکمیل با کلید Tab در پوسته پایتون (Tab Completion in the Python Shell)
Jedi یکی از وابستگیهای IPython است؛ بنابراین تکمیل خودکار در IPython بدون نیاز به پیکربندی اضافه امکانپذیر است.
در اینجا یک ویدیوی نمونه https://vimeo.com/122332037 وجود دارد که نشان میدهد تکمیل خودکار REPL در یک پوستهٔ دیگر چگونه خواهد بود.
دو روش مختلف برای استفاده از تکمیل خودکار Jedi در مفسر python شما وجود دارد: یکی با فایل سفارشی $HOME/.pythonrc.py شما، و دیگری با استفاده از PYTHONSTARTUP.
استفاده از PYTHONSTARTUP
برای استفاده از تکمیل خودکار Jedi در مفسر پایتون، عبارت زیر را به پیکربندی پوستهٔ خود (مانند .bashrc) اضافه کنید. این روش تنها در Linux/Mac کار میکند، چرا که readline روی Windows در دسترس نیست. اگر با این وجود خواهان تکمیل خودکار Jedi در REPL خود هستید، به جای آن از IPython استفاده کنید:
export PYTHONSTARTUP="$(python -m jedi repl)"
سپس قادر خواهید بود از تکمیلکنندهٔ Jedi در مفسر پایتون خود استفاده کنید:
$ python
Python 3.14.0+ (default, Jul 20 2020, 22:15:08)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.path.join('a', 'b').split().in<TAB> # doctest: +SKIP
..dex ..sert
استفاده از یک $HOME/.pythonrc.py سفارشی
- jedi.utils.setup_readline(namespace_module=<module '__main__' from '/usr/bin/sphinx-build'>, fuzzy=False)
- این تابع readline
https://docs.python.org/3/library/readline.html#module-readline
را برای
استفاده از
Jedi در یک
پوستهٔ
تعاملی
پایتون
پیکربندی
میکند.
اگر میخواهید از یک فایل سفارشی PYTHONSTARTUP (معمولاً $HOME/.pythonrc.py) استفاده کنید، میتوانید این قطعه کد را اضافه کنید:
try:
from jedi.utils import setup_readline
except ImportError:
# Fallback to the stdlib readline completer if it is installed.
# Taken from http://docs.python.org/2/library/rlcompleter.html
print("Jedi is not installed, falling back to readline")
try:
import readline
import rlcompleter
readline.parse_and_bind("tab: complete")
except ImportError:
print("Readline is not installed either. No tab completion is enabled.")
else:
setup_readline()
این کار در صورت نصب نبودن Jedi، به تکمیلکنندهٔ readline بازمیگردد. تکمیلکنندهٔ readline تنها نامهای موجود در فضای نام سراسری (global namespace) را کامل میکند؛ بنابراین برای نمونه:
ran<TAB>
به range تکمیل خواهد شد.
با Jedi کد زیر:
range(10).cou<TAB>
به range(10).count تکمیل خواهد شد؛ این مورد در تکمیلکنندهٔ پیشفرض readline https://docs.python.org/3/library/readline.html#module-readline در cPython کار نمیکند.
همچنین باید عبارت export PYTHONSTARTUP=$HOME/.pythonrc.py را به پروفایل پوستهٔ خود (معمولاً در صورت استفاده از bash، فایل .bash_profile یا .profile) اضافه کنید.
در اینجا نکاتی برای استفادهٔ بهینه و کارآمد از Jedi آورده شده است.
تعیین نوع (Type Hinting)
اگر Jedi به دلیل ماهیت پویای Python نتواند نوع یک آرگومان تابع را به درستی تشخیص دهد، میتوانید با مشخص کردن نوع آن با استفاده از یکی از سبکهای docstring یا حاشیهنویسی (annotation) زیر به آن کمک کنید. تنها نوعدهی تدریجی (gradual typing) همیشه کار خواهد کرد؛ تمام راهکارهای مبتنی بر docstring ترفندهایی بزکشده هستند و در موارد پیچیدهتر احتمالاً کار نخواهند کرد.
نوعدهی تدریجی رسمی [پیشنهادی] (Official Gradual Typing)
میتوانید مطالب زیادی دربارهٔ سیستم نوعدهی تدریجی Python در PEPهای مربوطه بخوانید، مانند:
- PEP 484 https://www.python.org/dev/peps/pep-0484 به عنوان مقدمه
- PEP 526 https://www.python.org/dev/peps/pep-0526 برای حاشیهنویسی متغیرها
- PEP 589 https://www.python.org/dev/peps/pep-0589 برای TypeDict
- احتمالاً موارد بیشتری نیز وجود دارد :)
در ادامه چند مثال از نحوهٔ استفاده از این قابلیت آورده شده است.
حاشیهنویسی توابع (Function annotations):
def myfunction(node: ProgramNode, foo: str) -> None:
"""Do something with a ``node``.
"""
node.| # complete here
تعیین نوع در انتساب، حلقههای for و دستورات with:
import typing
x: int = foo()
y: typing.Optional[int] = 3
key: str
value: Employee
for key, value in foo.items():
pass
f: Union[int, float]
with foo() as f:
print(f + 3)
استاندارد PEP-0484 باید به طور کامل پشتیبانی شود. در صورتی که اینگونه نبود، با خیال راحت یک issue باز کنید. همچنین میتوانید از فایلهای stub استفاده کنید.
سبک Sphinx (Sphinx style)
http://www.sphinx-doc.org/en/stable/domains.html#info-field-lists
def myfunction(node, foo):
"""
Do something with a ``node``.
:type node: ProgramNode
:param str foo: foo parameter description
"""
node.| # complete here
http://epydoc.sourceforge.net/manual-fields.html
def myfunction(node):
"""
Do something with a ``node``.
@type node: ProgramNode
"""
node.| # complete here
Numpydoc
https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt
برای پشتیبانی از قالب numpydoc، باید بستهٔ numpydoc https://pypi.python.org/pypi/numpydoc را نصب کنید.
def foo(var1, var2, long_var_name='hi'):
r"""
A one-line summary that does not use variable names or the
function name.
...
Parameters
----------
var1 : array_like
Array_like means all those objects -- lists, nested lists,
etc. -- that can be converted to an array. We can also
refer to variables like `var1`.
var2 : int
The type above can either refer to an actual Python type
(e.g. ``int``), or describe the type of the variable in more
detail, e.g. ``(N,) ndarray`` or ``array_like``.
long_variable_name : {'hi', 'ho'}, optional
Choices in brackets, default first when optional.
...
"""
var2.| # complete here
ویژگیها و محدودیتها
فراخوانیهای اصلی API و قابلیتهای Jedi عبارتاند از:
- تکمیل خودکار: Script.complete() <#jedi.Script.complete>؛ همچنین راهاندازی و استفاده از آن در REPL شما (مانند IPython و غیره) امکانپذیر است <#repl-completion>
- پرش/استنتاج نوع: Script.goto() <#jedi.Script.goto> و Script.infer() <#jedi.Script.infer>
- تحلیل ایستا: Script.get_names() <#jedi.Script.get_names> و Script.get_syntax_errors() <#jedi.Script.get_syntax_errors>
- بازآفرینیها: Script.rename() <#jedi.Script.rename>، Script.inline() <#jedi.Script.inline>، Script.extract_variable() <#jedi.Script.extract_variable> و Script.extract_function() <#jedi.Script.extract_function>
- جستجوی کد: Script.search() <#jedi.Script.search> و Project.search() <#jedi.Project.search>
قابلیتهای پایه
- پشتیبانی از Python 3.10+
- نادیده گرفتن خطاهای نحوی و تورفتگی نادرست
- توانایی کار با ساختارهای پیچیدهٔ ماژول / تابع / کلاس
- پشتیبانی عالی از virtualenv/venv
- عملکرد عالی با قابلیت type hinting در پایتون <#type-hinting>،
- شناسایی و درک فایلهای stub
- امکان استنتاج آرگومانهای تابع برای docstringهای sphinx، epydoc و numpydoc پایه
- در کل
نرمافزاری
بسیار
پایدار و
قابل اتکا
است که در
طول مدتی
طولانی
صیقل خورده
است. از
گزارش
باگها به
گرمی
استقبال
میشود و
معمولاً
ظرف چند
هفته برطرف
میگردند.
Jedi از بسیاری از قابلیتهای پرکاربرد پایتون پشتیبانی میکند:
- عناصر توکار (builtins)
- دستورهای returns، yields و yield from
- انتساب چندتاییها (tuple assignments) / نمایهسازی آرایهها / نمایهسازی دیکشنریها / باز کردن بستهبندی با ستاره (star unpacking)
- عبارتهای with-statement / مدیریت استثناها
- *args / **kwargs
- دکوراتورها / توابع lambda / کلوژرها (closures)
- مولدها (generators) / تکرارکنندهها (iterators)
- توصیفکنندهها (descriptors): شامل property / staticmethod / classmethod / توصیفکنندههای سفارشی
- برخی متدهای جادویی: __call__، __iter__، __next__، __get__، __getitem__، __init__
- list.append()، set.add()، list.extend() و غیره
- ساخت لیستهای تو در تو (list comprehensions) / عبارتهای سهگانه (ternary expressions)
- واردسازیهای نسبی (relative imports)
- getattr() / __getattr__ / __getattribute__
- حاشیهنویسی توابع (function annotations)
- تغییرات ساده و رایج در sys.path
- بررسیهای isinstance برای if/while/assert
- بستههای فضای نام (شامل فضاهای نام pkgutil، pkg_resources و PEP420)
- پشتیبانی از Django / Flask / Buildout
- شناسایی فیکسچرهای Pytest
محدودیتها (Limitations)
بهطور کلی آستانهٔ تحمل Jedi بسیار بالاست، اما برای پروژههای بسیار بزرگ یا کدهای بسیار پیچیده، گاهی اوقات Jedi استنتاج نوع را عمداً متوقف میکند تا از معلق ماندن طولانیمدت برنامه جلوگیری کند.
علاوه بر این، برخی از الگوهای پایتون وجود دارند که Jedi از آنها پشتیبانی نمیکند. این امر عمدی بوده و فهرست زیر موارد کامل آن است:
- متاکلاسهای دلخواه: برخی متاکلاسها مانند enumها و dataclassها در Jedi بازپیادهسازی شدهاند تا به درستی کار کنند. در بیشتر مواقع، پروندههای استاب (stubs) برای کارکرد صحیح استنتاج نوع کافی هستند، حتی هنگامی که متاکلاسها دخیل باشند.
- setattr()، __import__()
- نوشتن روی برخی دیکشنریها: globals()، locals()، object.__dict__
- دستکاری نمونهها خارج از متغیرهای نمونه بدون استفاده از متدها
مسائل کارایی (Performance Issues)
وارد کردن numpy گاهی اوقات میتواند بسیار کند باشد، همچنین بارگذاری اولیهٔ توابع توکار نیز زمانبر است. اگر میخواهید سرعت کار را بالا ببرید، میتوانید کتابخانهها را با دستور preload_module() <#jedi.preload_module> در Jedi از پیش بارگذاری کنید. با این حال، پس از یک بار بارگذاری، این مسئله دیگر مشکلی نخواهد بود. همین موضوع برای ماژولهای بسیار بزرگ مانند PySide، wx، tensorflow، pandas و غیره نیز صادق است.
برنامه Jedi لایه حافظه موقت (کش) خیلی مناسبی ندارد. این موضوع احتمالاً بزرگترین و تنها ایراد معماری https://github.com/davidhalter/jedi/issues/1059 در Jedi است. متأسفانه تغییر دادن آن آسان نیست. Dave Halter در فکر بازنویسی Jedi به زبان Rust است، اما رسیدن Jedi به نسخه 1.0 بیش از ۸ سال به طول انجامید و بازنویسی آن نیز احتمالاً سالها زمان خواهد برد.
امنیت (Security)
برای Script <#jedi.Script>
امنیت موضوع مهمی برای Jedi است. بهطور پیشفرض، هیچ کدی درون Jedi اجرا نمیشود. تا زمانی که پایتون خالص بنویسید، همهچیز بهصورت ایستا استنتاج میشود. اگر گزینهٔ load_unsafe_extensions=True را برای Project <#jedi.Project> خود فعال کنید و از ماژولهای توکار (c_builtin) بهره بگیرید، Jedi آن ماژولها را اجرا خواهد کرد. اگر به یک پایگاه کد اطمینان ندارید، لطفاً آن گزینه را فعال نکنید؛ چرا که ممکن است به اجرای کدهای دلخواه منجر شود..SS برای Interpreter <#jedi.Interpreter>
اگر برای Interpreter <#jedi.Interpreter> به دنبال امنیت هستید، از آن استفاده نکنید. Jedi ویژگیها (properties) را اجرا میکند و بهطور کلی برای جلوگیری از اجرای کد چندان محتاط نیست. این رفتار عمدی است: بیشتر افراد به پایهکدهایی که وارد (import) کردهاند اعتماد دارند، چرا که تا آن مرحله، یک پایهکد مخرب پیشتر امکان اجرای کد را داشته است.
نمای کلی API (API Overview)
نکته:
این API از چند بخش مختلف تشکیل شده است:
- نقطههای شروع اصلی برای complete/goto: کلاسهای Script و Interpreter. اگر با Jedi کار میکنید، ابتدا باید این کلاسها را بشناسید.
- کلاسهای نتیجهٔ API <#api-classes>
- پشتیبانی از نسخههای Python و Virtualenv با توابعی مانند find_system_environments() و find_virtualenvs()
- روشی برای کار با پوشهها / پروژههای مختلف
- توابع سودمند: preload_module() و set_debug_function()
متدهایی که به احتمال زیاد برای کار با Jedi از آنها استفاده خواهید کرد به شرح زیر هستند:
| Script.complete | اشیاء زیر مکاننما را تکمیل میکند. |
| Script.goto | به نامی میرود که شیء زیر مکاننما را تعریف کرده است. |
| Script.infer | تعریفهای زیر مکاننما را بازمیگرداند. |
| Script.help | برای نمایش پنجرهٔ راهنما به کاربران استفاده میشود. |
| Script.get_signatures | شیء تابعِ فراخوانی زیر مکاننما را بازمیگرداند. |
| Script.get_references | تمام ارجاعات به یک متغیر را در یک پروژه فهرست میکند. |
| Script.get_context | زمینهٔ حوزه (scope context) زیر مکاننما را بازمیگرداند. |
| Script.get_names | نامهای تعریفشده در فایل جاری را بازمیگرداند. |
| Script.get_syntax_errors | تمام خطاهای نحوی موجود در فایل جاری را فهرست میکند. |
| Script.rename | نام تمام ارجاعات به متغیر زیر مکاننما را تغییر میدهد. |
| Script.inline | متغیر زیر مکاننما را درونخطی (inline) میکند. این عمل اساساً نقطهٔ مقابل استخراج متغیر است؛ برای مثال با قرار داشتن مکاننما روی bar::. |
| Script.extract_variable | یک عبارت را به یک دستور (statement) جدید منتقل میکند. |
| Script.extract_function | یک عبارت را به یک تابع جدید منتقل میکند. |
| Script.search | یک نام را در فایل جاری جستجو میکند. |
| Script.complete_search | مشابه Script.search() است، اما آن رشته را تکمیل میکند. |
| Project.search | یک نام را در کل پروژه جستجو میکند. |
| Project.complete_search | مشابه Script.search() است، اما آن رشته را تکمیل میکند. |
| Script | |
| 0.0 | |
| class jedi.Script(code=None, *, path=None, environment=None, project=None) | |
| یک شیء Script پایهای برای تکمیل خودکار (completions)، رفتن به تعاریف (goto) یا هر کار دیگری است که میخواهید با | |
| Jedi انجام دهید. همتای این کلاس Interpreter است که | |
| با دیکشنریهای واقعی کار میکند و میتواند در تعامل با یک REPL استفاده شود. این کلاس | |
| باید زمانی استفاده شود که کاربر در حال ویرایش کد درون یک ویرایشگر است. | |
| میتوانید برای خواندن فایل از پارامتر code یا path استفاده کنید. | |
| معمولاً (در یک ویرایشگر) تمایل خواهید داشت از هر دوی آنها استفاده کنید. | |
| مقدار sys.path در Script بسیار قابل سفارشیسازی است: | |
| 7.0 | |
| • 2 | |
| اگر project همراه با یک sys_path ارائه شده باشد، از آن استفاده خواهد شد. | |
| • 2 | |
| اگر environment ارائه شده باشد، مقدار sys.path آن استفاده خواهد شد | |
| (نگاه کنید به Environment.get_sys_path)؛ | |
| • 2 | |
| در غیر این صورت sys.path با محیط پیشفرض Jedi مطابقت خواهد داشت، | |
| که معمولاً با sys path استفادهشده در زمان import شدن Jedi همخوانی دارد. | |
| 168u | |
| بیشتر متدها پارامترهای line و column را دارند. شماره سطرها در Jedi | |
| همیشه از ۱ شروع میشوند (1-based) و ستونها همیشه بر مبنای صفر (zero based) هستند. برای جلوگیری از تکرار، | |
| این موارد همیشه مستندسازی نشدهاند. میتوانید هر دو مقدار سطر و ستون را حذف کنید؛ در این صورت | |
| Jedi عملیاتی را که فراخوانی کردهاید در انتهای فایل اجرا میکند. اگر | |
| فقط سطر را مشخص کنید، عملیات تکمیل در انتهای همان سطر انجام خواهد شد. | |
| هشدار: | |
| 7.0 | |
| 3.5 | |
| بهطور پیشفرض jedi.settings.fast_parser <#jedi.settings.fast_parser> فعال است، به این معنی | |
| که parso ماژولها را مجدداً استفاده میکند (یعنی تغییرناپذیر نیستند). با این تنظیم، | |
| Jedi به صورت thread safe نیست و همچنین استفادهٔ همزمان از چند نمونهٔ | |
| Script و تعاریف آن امن نخواهد بود. | |
| اگر یک توسعهدهندهٔ افزونهٔ عادی هستید این نباید مشکلی ایجاد کند. این | |
| مسئله تنها برای افرادی مطرح است که کارهای پیچیدهتری با Jedi انجام میدهند. | |
| این صرفاً یک بهینهسازی کارایی است و برای تمامی کاربردهای معمول بسیار خوب عمل میکند؛ | |
| با این حال اگر برای شما مشکلی ایجاد کرد، خاموش کردن این تنظیم را مد نظر قرار دهید. همچنین ببینید: | |
| این بحث https://github.com/davidhalter/jedi/issues/1240. | |
| 168u | |
| 168u | |
| 7.0 | |
| پارامترها (Parameters) | |
| 7.0 | |
| • 2 | |
| code (str https://docs.python.org/3/library/stdtypes.html#str) -- کد منبع فایل جاری، جداشده با خطوط جدید. | |
| • 2 | |
| path (str https://docs.python.org/3/library/stdtypes.html#str یا pathlib.Path https://docs.python.org/3/library/pathlib.html#pathlib.Path یا None) -- مسیر فایل در سیستم فایل، یا '' اگر | |
| هنوز ذخیره نشده باشد. | |
| • 2 | |
| environment (Environment <#jedi.api.environment.Environment>) -- ارائه یک Environment از پیش تعریفشده | |
| برای کار با نسخهٔ خاصی از Python یا virtualenv. | |
| • 2 | |
| project (Project <#jedi.Project>) -- ارائه یک Project برای اطمینان از عملکرد | |
| صحیح یافتن ارجاعات، زیرا پوشهٔ درست جستجو میشود. همچنین | |
| راههایی برای تغییر sys path و سایر موارد وجود دارد. | |
| 168u | |
| 168u | |
| 7.0 | |
| complete(line=None, column=None, *, fuzzy=False) | |
| اشیاء زیر مکاننما را تکمیل میکند. | |
| این اشیاء حاوی اطلاعاتی دربارهٔ موارد تکمیلشده هستند، نه صرفاً نامها. | |
| 7.0 | |
| پارامترها (Parameters) | |
| fuzzy -- مقدار پیشفرض False. تکمیلهای فازی را بازمیگرداند؛ به این معنی | |
| که مثلاً ooa با foobar مطابقت پیدا خواهد کرد. | |
| مقادیر بازگشتی (Returns) | |
| اشیاء Completion، مرتبشده بر پایهٔ نام. نامهای معمولی | |
| پیش از نامهای "خصوصی" که با _ آغاز میشوند ظاهر میگردند و آنها نیز | |
| قبل از متدهای جادویی و نامهای دستکاریشده (name mangled) که با __ شروع میشوند قرار میگیرند. | |
| نوع بازگشتی (Return type) | |
| لیستی از Completion <#jedi.api.classes.Completion> | |
| 168u | |
| 168u | |
| 7.0 | |
| infer(line=None, column=None, *, only_stubs=False, prefer_stubs=False) | |
| تعاریف شیء زیر مکاننما را بازمیگرداند. این متد اساساً یک پوسته | |
| در اطراف استنتاج نوع (type inference) در Jedi است. | |
| این متد مسیرهای پیچیده را دنبال کرده و نقطهٔ پایان را برمیگرداند، نه | |
| تعریف اولیه را. تفاوت بزرگ بین goto() و | |
| infer() در این است که goto() از | |
| importها و عبارات پیروی نمیکند. ممکن است چندین شیء بازگردانده شوند، | |
| چرا که بسته به شرایط ممکن است دو نسخهٔ مختلف از یک | |
| تابع وجود داشته باشد. | |
| 7.0 | |
| پارامترها (Parameters) | |
| 7.0 | |
| • 2 | |
| only_stubs -- برای این متد تنها stubها را برمیگرداند. | |
| • 2 | |
| prefer_stubs -- برای این متد، stubها را به اشیاء Python ترجیح میدهد. | |
| 168u | |
| نوع بازگشتی (Return type) | |
| لیستی از Name <#jedi.api.classes.Name> | |
| 168u | |
| 168u | |
| 7.0 | |
| goto(line=None, column=None, *, follow_imports=False, follow_builtin_imports=False, only_stubs=False, prefer_stubs=False) | |
| به نامی میرود که شیء زیر مکاننما را تعریف کرده است. به صورت اختیاری | |
| میتوانید importها را دنبال کنید. | |
| بسته به اینکه ممکن است دو نسخهٔ متفاوت از یک تابع وجود داشته باشد، | |
| امکان بازگرداندن چندین شیء وجود دارد. | |
| 7.0 | |
| پارامترها (Parameters) | |
| 7.0 | |
| • 2 | |
| follow_imports -- این متد importها را دنبال خواهد کرد. | |
| • 2 | |
| follow_builtin_imports -- اگر follow_imports مقدار True باشد، تلاش میکند | |
| نامها را در builtins (یعنی ماژولهای کامپایلشده یا الحاقی) جستجو کند. | |
| • 2 | |
| only_stubs -- برای این متد تنها stubها را برمیگرداند. | |
| • 2 | |
| prefer_stubs -- برای این متد، stubها را به اشیاء Python ترجیح میدهد. | |
| 168u | |
| نوع بازگشتی (Return type) | |
| لیستی از Name <#jedi.api.classes.Name> | |
| 168u | |
| 168u | |
| 7.0 | |
| search(string, *, all_scopes=False) | |
| یک نام را در فایل جاری جستجو میکند. برای توضیح دربارهٔ نحوهٔ | |
| قالب رشتهٔ جستجو، لطفاً نگاهی بیندازید به | |
| Project.search(). | |
| 7.0 | |
| پارامترها (Parameters) | |
| all_scopes (bool https://docs.python.org/3/library/functions.html#bool) -- پیشفرض False؛ تعاریف را نه فقط در | |
| بالاترین سطح ماژول (top level)، بلکه در | |
| توابع و کلاسها نیز جستجو میکند. | |
| خروجیهای مولد (Yields) | |
| Name <#jedi.api.classes.Name> | |
| 168u | |
| 168u | |
| 7.0 | |
| complete_search(string, **kwargs) | |
| مشابه Script.search()، اما آن رشته را تکمیل میکند. اگر میخواهید | |
| تمام تعاریف ممکن در یک فایل را در اختیار داشته باشید، میتوانید یک رشتهٔ خالی | |
| نیز ارائه دهید. | |
| 7.0 | |
| پارامترها (Parameters) | |
| 7.0 | |
| • 2 | |
| all_scopes (bool https://docs.python.org/3/library/functions.html#bool) -- پیشفرض False؛ تعاریف را نه فقط در | |
| بالاترین سطح ماژول، بلکه درون | |
| توابع و کلاسها نیز جستجو میکند. | |
| • 2 | |
| fuzzy -- پیشفرض False. تکمیلهای فازی را بازمیگرداند، به این معنی | |
| که مثلاً ooa با foobar مطابقت داده خواهد شد. | |
| 168u | |
| خروجیهای مولد (Yields) | |
| Completion <#jedi.api.classes.Completion> | |
| 168u | |
| 168u | |
| 7.0.TP | |
| help(line=None, column=None) | |
| برای نمایش پنجرهٔ راهنما به کاربران استفاده میشود. از Script.goto() استفاده کرده و | |
| تعاریف بیشتری را برای کلیدواژهها و عملگرها بازمیگرداند. | |
| به طور معمول میخواهید BaseName.docstring() <#jedi.api.classes.BaseName.docstring> را برای | |
| تمام تعاریف بازگرداندهشده به کاربر نمایش دهید. | |
| تعاریف اضافی از نوع Name(...).type == 'keyword' هستند. | |
| این تعاریف به جز ویژگی docstring خود که حاوی خروجی تابع help() در پایتون | |
| است، ارزش چندانی ندارند. | |
| 7.0 | |
| نوع بازگشتی | |
| فهرستی از Name <#jedi.api.classes.Name> | |
| 168u | |
| 168u | |
| 7.0 | |
| get_references(line=None, column=None, **kwargs) | |
| تمام مراجع یک متغیر را در پروژه فهرست میکند. از آنجا که این کار میتواند | |
| برای Jedi بسیار سنگین باشد، در صورت پیچیدگی بیش از حد، Jedi جستجو را | |
| متوقف خواهد کرد. | |
| 7.0 | |
| پارامترها | |
| 7.0 | |
| • 2 | |
| include_builtins -- پیشفرض True است. اگر False باشد، توکار بودن | |
| تعریف (مانند sys) را بررسی کرده و در این صورت آن را بازنمیگرداند. | |
| • 2 | |
| scope -- پیشفرض 'project' است. اگر 'file' باشد، مراجع را تنها | |
| در ماژول فعلی در بر میگیرد. | |
| 168u | |
| نوع بازگشتی | |
| فهرستی از Name <#jedi.api.classes.Name> | |
| 168u | |
| 168u | |
| 7.0 | |
| get_signatures(line=None, column=None) | |
| شیء تابعِ فراخوانیشده زیر مکاننما را بازمیگرداند. | |
| برای نمونه، اگر مکاننما در اینجا باشد: | |
| 7.0 | |
| 3.5 | |
| abs(# <-- cursor is here | |
| 168u | |
| 168u | |
| این دستور تابع abs را بازمیگرداند. از طرف دیگر: | |
| 7.0 | |
| 3.5 | |
| abs()# <-- cursor is here | |
| 168u | |
| 168u | |
| این دستور یک فهرست خالی بازخواهد گرداند. | |
| 7.0 | |
| نوع بازگشتی | |
| فهرستی از Signature <#jedi.api.classes.Signature> | |
| 168u | |
| 168u | |
| 7.0 | |
| get_context(line=None, column=None) | |
| بافتار حوزهٔ زیر مکاننما را بازمیگرداند. این اساساً به معنای | |
| تابع، کلاس یا ماژولی است که مکاننما در آن قرار دارد. | |
| 7.0 | |
| نوع بازگشتی | |
| Name <#jedi.api.classes.Name> | |
| 168u | |
| 168u | |
| 7.0 | |
| get_names(**kwargs) | |
| نامهای تعریفشده در فایل فعلی را بازمیگرداند. | |
| 7.0 | |
| پارامترها | |
| 7.0 | |
| • 2 | |
| all_scopes -- در صورت True بودن، نامهای تمام حوزهها را به جای | |
| تنها فضای نام ماژول فهرست میکند. | |
| • 2 | |
| definitions -- در صورت True بودن، نامهایی را که توسط یک کلاس، | |
| تابع یا یک دستور تعریف شدهاند فهرست میکند (a = b مقدار a را بازمیگرداند). | |
| • 2 | |
| references -- در صورت True بودن، تمام نامهایی را که توسط | |
| definitions=True فهرست نشدهاند برمیشمارد؛ برای نمونه a = b مقدار b را بازمیگرداند. | |
| 168u | |
| نوع بازگشتی | |
| فهرستی از Name <#jedi.api.classes.Name> | |
| 168u | |
| 168u | |
| 7.0 | |
| get_syntax_errors() | |
| تمام خطاهای نحوی در فایل فعلی را فهرست میکند. | |
| 7.0 | |
| نوع بازگشتی | |
| فهرستی از SyntaxError <#jedi.api.errors.SyntaxError> | |
| 168u | |
| 168u | |
| 7.0 | |
| rename(line=None, column=None, *, new_name) | |
| تمام مراجع به متغیر زیر مکاننما را تغییر نام میدهد. | |
| 7.0 | |
| پارامترها | |
| new_name -- متغیر زیر مکاننما به این رشته تغییر نام داده خواهد شد. | |
| خطاهای پرتابی | |
| RefactoringError | |
| نوع بازگشتی | |
| Refactoring <#jedi.api.refactoring.Refactoring> | |
| 168u | |
| 168u | |
| 7.0 | |
| extract_variable(line, column, *, new_name, until_line=None, until_column=None) | |
| یک عبارت را به یک دستور جدید منتقل میکند. | |
| برای نمونه اگر مکاننما روی foo باشد و یک new_name به نام | |
| bar مشخص کنید: | |
| 7.0 | |
| 3.5 | |
| foo = 3.1 | |
| x = int(foo + 1) | |
| 168u | |
| 168u | |
| کد بالا به شکل زیر در خواهد آمد: | |
| 7.0 | |
| 3.5 | |
| foo = 3.1 | |
| bar = foo + 1 | |
| x = int(bar) | |
| 168u | |
| 168u | |
| 7.0 | |
| پارامترها | |
| 7.0 | |
| • 2 | |
| new_name -- عبارت زیر مکاننما به این رشته تغییر نام | |
| خواهد یافت. | |
| • 2 | |
| until_line (int https://docs.python.org/3/library/functions.html#int) -- محدودهٔ انتخاب در این خط پایان مییابد؛ در صورت | |
| حذف، Jedi به طور هوشمند تلاش میکند تا محدوده را خودش مشخص کند. | |
| • 2 | |
| until_column (int https://docs.python.org/3/library/functions.html#int) -- محدودهٔ انتخاب در این ستون پایان مییابد؛ در صورت | |
| حذف، Jedi به طور هوشمند تلاش میکند تا محدوده را خودش مشخص کند. | |
| 168u | |
| خطاهای پرتابی | |
| RefactoringError | |
| نوع بازگشتی | |
| Refactoring <#jedi.api.refactoring.Refactoring> | |
| 168u | |
| 168u | |
| 7.0.TP | |
| extract_function(line, column, *, new_name, until_line=None, until_column=None) | |
| یک عبارت را به یک تابع جدید منتقل میکند. | |
| بهعنوان مثال، اگر مکاننما روی foo قرار داشته باشد و یک new_name به نام bar مشخص کنید: | |
| 7.0 | |
| 3.5 | |
| global_var = 3 | |
| def x(): | |
| foo = 3.1 | |
| x = int(foo + 1 + global_var) | |
| 168u | |
| 168u | |
| کد بالا به این صورت در خواهد آمد: | |
| 7.0 | |
| 3.5 | |
| global_var = 3 | |
| def bar(foo): | |
| return int(foo + 1 + global_var) | |
| def x(): | |
| foo = 3.1 | |
| x = bar(foo) | |
| 168u | |
| 168u | |
| 7.0 | |
| پارامترها (Parameters) | |
| 7.0 | |
| • 2 | |
| new_name -- عبارتی که زیر مکاننما قرار دارد با تابعی به این نام جایگزین خواهد شد. | |
| • 2 | |
| until_line (int https://docs.python.org/3/library/functions.html#int) -- محدودهٔ انتخاب در این خط پایان مییابد؛ در صورت مشخص نشدن، Jedi بهصورت هوشمندانه تلاش میکند محدوده را خودش تعیین کند. | |
| • 2 | |
| until_column (int https://docs.python.org/3/library/functions.html#int) -- محدودهٔ انتخاب در این ستون پایان مییابد؛ در صورت مشخص نشدن، Jedi بهصورت هوشمندانه تلاش میکند محدوده را خودش تعیین کند. | |
| 168u | |
| خطاها (Raises) | |
| RefactoringError | |
| نوع بازگشتی (Return type) | |
| Refactoring <#jedi.api.refactoring.Refactoring> | |
| 168u | |
| 168u | |
| 7.0 | |
| inline(line=None, column=None) | |
| متغیر زیر مکاننما را درونخطی (inline) میکند. این کار اساساً برعکس استخراج یک متغیر است. بهعنوان مثال با قرار داشتن مکاننما روی bar: | |
| 7.0 | |
| 3.5 | |
| foo = 3.1 | |
| bar = foo + 1 | |
| x = int(bar) | |
| 168u | |
| 168u | |
| کد بالا به این صورت در خواهد آمد: | |
| 7.0 | |
| 3.5 | |
| foo = 3.1 | |
| x = int(foo + 1) | |
| 168u | |
| 168u | |
| 7.0 | |
| خطاها (Raises) | |
| RefactoringError | |
| نوع بازگشتی (Return type) | |
| Refactoring <#jedi.api.refactoring.Refactoring> | |
| 168u | |
| 168u | |
| 0.0 | |
| class jedi.Interpreter(code, namespaces, *, project=None, **kwds) | |
| رابط برنامهنویسی (API) کتابخانهٔ Jedi برای REPLهای پایتون. | |
| همچنین تمام متدهای موجود در Script را پیادهسازی میکند. | |
| علاوه بر تکمیلهایی که تکمیلکنندهٔ معمول REPL انجام میدهد، مانند | |
| str.upper، کتابخانهٔ Jedi از تکمیل کد مبتنی بر تحلیل ایستای کد | |
| نیز پشتیبانی میکند. برای نمونه Jedi عبارت str().upper را تکمیل خواهد کرد. | |
| >>> from os.path import join | |
| >>> namespace = locals() | |
| >>> script = Interpreter('join("").up', [namespace]) | |
| >>> print(script.complete()[0].name) | |
| upper | |
| تمام آرگومانهای کلیدواژهای همانند آرگومانهای Script هستند. | |
| 7.0 | |
| پارامترها (Parameters) | |
| 7.0 | |
| • 2 | |
| code (str https://docs.python.org/3/library/stdtypes.html#str) -- کدی که باید تجزیه شود. | |
| • 2 | |
| namespaces (List https://docs.python.org/3/library/typing.html#typing.List[dict https://docs.python.org/3/library/stdtypes.html#dict]) -- فهرستی از دیکشنریهای فضاینام، مانند آنچه | |
| توسط globals() https://docs.python.org/3/library/functions.html#globals و locals() https://docs.python.org/3/library/functions.html#locals بازگردانده میشود. | |
| 168u | |
| 168u | |
| 168u | |
| پروژهها (Projects) | |
| پروژهها راهکاری برای مدیریت پروژههای پایتون درون Jedi هستند. برای افزونههای | |
| سادهتر ممکن است نیازی به درگیر شدن با پروژهها نداشته باشید، اما اگر میخواهید | |
| انعطافپذیری بیشتری در تعریف مسیرهای sys و مفسرهای پایتون به کاربر بدهید، | |
| Project روشی ایدهآل برای این کار است. | |
| پروژهها را میتوان روی دیسک ذخیره و دوباره بارگذاری کرد تا امکان استفاده از | |
| تعاریف پروژه در بین مخازن مختلف فراهم شود. | |
| 0.0 | |
| jedi.get_default_project(path=None) | |
| اگر پروژهای توسط کاربر تعریف نشده باشد، Jedi تلاش میکند تا جای ممکن پروژه را | |
| بهطور خودکار تعریف کند. Jedi پوشهها را پیمایش میکند تا زمانی که یکی از موارد | |
| زیر را بیابد: | |
| 7.0 | |
| 1. 3 | |
| یک فایل .jedi/config.json | |
| 2. 3 | |
| یکی از فایلهای روبهرو: setup.py، .git، .hg، | |
| requirements.txt و MANIFEST.in. | |
| 168u | |
| 168u | |
| 0.0 | |
| class jedi.Project(path, *, environment_path=None, load_unsafe_extensions=False, sys_path=None, added_sys_path=(), smart_sys_path=True) | |
| پروژهها روشی ساده برای مدیریت پوشههای پایتون و تعریف چگونگی حل و فصل وارد کردنها | |
| (import resolution) توسط Jedi هستند. این کلاس بیشتر بهعنوان پارامتری برای Script | |
| استفاده میشود. علاوهبراین توابعی برای جستجو در کل پروژه وجود دارد. | |
| 7.0 | |
| پارامترها (Parameters) | |
| 7.0 | |
| • 2 | |
| path -- مسیر پایه برای این پروژه. | |
| • 2 | |
| environment_path -- مسیر فایل اجرایی پایتون، معمولاً مسیر یک | |
| محیط مجازی (virtual environment). | |
| • 2 | |
| load_unsafe_extensions -- پیشفرض False. افزونههایی را بارگذاری میکند | |
| که در sys path و دایرکتوریهای محلی نیستند. با فعال بودن این گزینه، | |
| اگر یک مخزن git را کلون کرده و کد آن را تحلیل کنید این عمل بالقوه ناامن است؛ | |
| زیرا آن افزونههای کامپایلشده وارد (import) خواهند شد و در نتیجه دسترسی اجرا دارند. | |
| • 2 | |
| sys_path -- فهرستی از str. در صورت تمایل میتوانید sys path را بازنویسی | |
| کنید. بهطور پیشفرض مقدار sys.path توسط محیط (محیطهای مجازی و غیره) | |
| تولید میشود. | |
| • 2 | |
| added_sys_path -- فهرستی از str. این مسیرها را به انتهای | |
| sys path میافزاید. | |
| • 2 | |
| smart_sys_path -- در صورت فعال بودن (پیشفرض)، مسیرها را از | |
| دایرکتوریهای محلی اضافه میکند. در غیر این صورت باید متکی به پیکربندی | |
| درست بستههای خود روی sys.path باشید. | |
| 168u | |
| 168u | |
| 7.0 | |
| classmethod load(path) | |
| یک پروژه را از مسیری مشخص بارگذاری میکند. شما نباید مسیر | |
| .jedi/project.json را بدهید، بلکه باید مسیر پوشهٔ پروژه را مشخص کنید. | |
| 7.0 | |
| پارامترها (Parameters) | |
| path -- مسیر دایرکتوریای که میخواهید بهعنوان یک پروژه استفاده کنید. | |
| 168u | |
| 168u | |
| 7.0 | |
| save() | |
| پیکربندی پروژه را در درون پروژه در .jedi/project.json ذخیره میکند. | |
| 168u | |
| 7.0 | |
| added_sys_path | |
| مسیر sys path که قرار است به انتها اضافه شود. | |
| 168u | |
| 7.0 | |
| property path | |
| مسیر پایه برای این پروژه. | |
| 168u | |
| 7.0 | |
| property sys_path | |
| مسیر sys path ارائهشده به این پروژه. این مقدار میتواند None باشد و در | |
| این صورت بهطور خودکار تولید خواهد شد. | |
| 168u | |
| 7.0 | |
| property smart_sys_path | |
| مشخص میکند که آیا sys path قرار است به روشی هوشمندانه محاسبه شود و مسیرهای | |
| اضافی اضافه شوند یا خیر. | |
| 168u | |
| 7.0 | |
| property load_unsafe_extensions | |
| اینکه آیا پروژه افزونههای ناامن را بارگذاری میکند یا خیر. | |
| 168u | |
| 7.0 | |
| search(string, *, all_scopes=False) | |
| یک نام را در کل پروژه جستجو میکند. اگر پروژه بسیار بزرگ باشد، در نقطهای | |
| Jedi جستجو را متوقف خواهد کرد. با این حال بسیار توصیه میشود که مولد (generator) | |
| را تا انتها مصرف نکنید؛ فقط ده نتیجهٔ نخست را به کاربر نمایش دهید. | |
| در حال حاضر سه الگوی جستجوی متفاوت وجود دارد: | |
| 7.0 | |
| • 2 | |
| foo برای جستجوی تعریف foo در هر فایلی یا فایلی به نام | |
| foo.py یا foo.pyi. | |
| • 2 | |
| foo.bar برای جستجوی foo و سپس ویژگی bar | |
| درون آن. | |
| • 2 | |
| class foo.bar.Bar یا def foo.bar.baz برای جستجوی یک نوع | |
| API مشخص. | |
| 168u | |
| 7.0 | |
| پارامترها (Parameters) | |
| all_scopes (bool https://docs.python.org/3/library/functions.html#bool) -- پیشفرض False؛ جستجو را نهتنها برای | |
| تعاریف در بالاترین سطح ماژول، بلکه در توابع و کلاسها نیز انجام میدهد. | |
| بازدهی (Yields) | |
| Name <#jedi.api.classes.Name> | |
| 168u | |
| 168u | |
| 7.0 | |
| complete_search(string, **kwargs) | |
| مشابه Script.search() عمل میکند، اما آن رشته را تکمیل میکند. یک رشتهٔ خالی | |
| تمام تعاریف موجود در پروژه را فهرست میکند، بنابراین هنگام استفاده از آن دقت کنید. | |
| 7.0 | |
| پارامترها (Parameters) | |
| all_scopes (bool https://docs.python.org/3/library/functions.html#bool) -- پیشفرض False؛ جستجو را نهتنها برای | |
| تعاریف در بالاترین سطح ماژول، بلکه در توابع و کلاسها نیز انجام میدهد. | |
| بازدهی (Yields) | |
| Completion <#jedi.api.classes.Completion> | |
| 168u | |
| 168u | |
| محیطها روشی برای فعالسازی نسخههای مختلف Python یا Virtualenvها جهت | |
| تحلیل ایستا (static analysis) هستند. باینری Python موجود در آن محیط اجرا خواهد شد. | |
| 0.0 | |
| jedi.find_system_environments(*, env_vars=None) | |
| محیطهای مجازی (virtualenvs) را نادیده میگیرد و نسخههای Python نصبشده روی | |
| سیستم شما را بازمیگرداند. اگر برای مثال Python را از یک نسخهٔ قابلحمل (portable) | |
| اجرا میکنید، ممکن است این تابع چیزی بازنگرداند. | |
| محیطها از جدیدترین به قدیمیترین نسخهٔ Python مرتب شدهاند. | |
| 7.0 | |
| مقادیر تولیدی (Yields) | |
| Environment | |
| 168u | |
| 168u | |
| 0.0 | |
| jedi.find_virtualenvs(paths=None, *, safe=True, use_environment_vars=True) | |
| 7.0 | |
| پارامترها (Parameters) | |
| 7.0 | |
| • 2 | |
| paths -- فهرستی از مسیرها در سیستم فایل شما که برای یافتن | |
| Virtualenvها پویش میشوند. این تابع در این مسیرها جستجو کرده و احتمالاً | |
| باینریهای Python را اجرا میکند. | |
| • 2 | |
| safe -- پیشفرض True است. در صورتی که این مقدار False باشد، به این | |
| تابع اجازه میدهد تا محیطهای بالقوهٔ python را اجرا کند. یک مهاجم ممکن | |
| است بتواند یک فایل اجرایی را در مسیری که این تابع بهطور پیشفرض جستجو میکند | |
| قرار دهد. اگر فایل اجرایی توسط ریشه (root) نصب نشده باشد، اجرا نخواهد شد. | |
| • 2 | |
| use_environment_vars -- پیشفرض True است. اگر True باشد، متغیر VIRTUAL_ENV | |
| بررسی میشود تا مشخص شود آیا حاوی یک VirtualEnv معتبر است یا خیر. | |
| متغیر CONDA_PREFIX نیز بررسی میشود تا مشخص شود آیا حاوی یک محیط conda | |
| معتبر است یا خیر. | |
| 168u | |
| مقادیر تولیدی (Yields) | |
| Environment | |
| 168u | |
| 168u | |
| 0.0 | |
| jedi.get_system_environment(version, *, env_vars=None) | |
| نخستین محیط Python یافتشده برای یک رشته به فرم 'X.Y' را بازمیگرداند | |
| که در آن X و Y به ترتیب نسخههای اصلی (major) و فرعی (minor) پایتون هستند. | |
| 7.0 | |
| استثناها (Raises) | |
| InvalidPythonEnvironment | |
| بازمیگرداند (Returns) | |
| Environment | |
| 168u | |
| 168u | |
| 0.0 | |
| jedi.create_environment(path, *, safe=True, env_vars=None) | |
| امکان ایجاد دستی یک شیء Environment را با مشخص کردن مسیر یک Virtualenv | |
| یا مسیر یک فایل اجرایی و متغیرهای محیطی اختیاری فراهم میسازد. | |
| 7.0 | |
| استثناها (Raises) | |
| InvalidPythonEnvironment | |
| بازمیگرداند (Returns) | |
| Environment | |
| 168u | |
| 168u | |
| 0.0 | |
| jedi.get_default_environment() | |
| تلاش میکند تا یک Virtualenv یا محیط conda فعال را بازگرداند. | |
| اگر هیچ متغیر VIRTUAL_ENV یا متغیر CONDA_PREFIX تنظیم نشده باشد، | |
| جدیدترین نسخهٔ Python نصبشده روی سیستم را بازمیگرداند. این ویژگی | |
| استفاده از بیشترین قابلیتهای جدید ممکن در Python را هنگام بهرهگیری از | |
| تکمیل خودکار (autocompletion) و سایر امکانات میسر میسازد. | |
| 7.0 | |
| بازمیگرداند (Returns) | |
| Environment | |
| 168u | |
| 168u | |
| 0.0 | |
| exception jedi.InvalidPythonEnvironment | |
| اگر این استثنا را مشاهده کردید، فایل اجرایی Python یا Virtualenv که سعی در | |
| استفاده از آن داشتهاید، احتمالاً نسخهٔ صحیحی از Python نیست. | |
| 168u | |
| 0.0 | |
| class jedi.api.environment.Environment(executable, env_vars=None) | |
| این کلاس قرار است توسط معماری درونی Jedi ایجاد شود. نباید آن را مستقیماً | |
| ایجاد کنید. لطفاً در عوض از create_environment یا سایر توابع استفاده کنید. | |
| سپس شیء ایجادشده توسط آن تابع بازگردانده میشود. | |
| 7.0 | |
| get_sys_path() | |
| مسیر sys (sys path) برای این محیط. شامل تغییرات بالقوه ناشی از | |
| افزودن به sys.path https://docs.python.org/3/library/sys.html#sys.path نمیشود. | |
| 7.0 | |
| بازمیگرداند (Returns) | |
| list of str | |
| 168u | |
| 168u | |
| 0.0 | |
| jedi.preload_module(*modules) | |
| پیشبارگذاری ماژولها به Jedi اعلام میکند که یک ماژول را اکنون بارگذاری کند، به جای تجزیه تنبل (lazy parsing) ماژولها. این قابلیت میتواند برای محیطهای توسعه یکپارچه (IDE) جهت کنترل ماژولهایی که هنگام راهاندازی بارگذاری میشوند مفید باشد. | |
| 7.0 | |
| پارامترها | |
| modules -- نامهای مختلف ماژول، فهرستی از رشتهها. | |
| 168u | |
| 168u | |
| 0.0 | |
| jedi.set_debug_function(func_cb=<function print_to_stdout>, warnings=True, notices=True, speed=True) | |
| تعریف یک تابع بازخوانی (callback) دیباگ برای دریافت تمامی پیامهای دیباگ. | |
| اگر هیچ آرگومانی مشخص نکنید، پیامهای دیباگ در stdout چاپ خواهند شد. | |
| 7.0 | |
| پارامترها | |
| func_cb -- تابع بازخوانی برای پیامهای دیباگ. | |
| 168u | |
| 168u | |
| خطاها | |
| 0.0 | |
| exception jedi.InternalError | |
| این خطا ممکن است زمانی رخ دهد که یک زیرفرایند (subprocess) از کار بیفتد (crash کند). دلیل این اتفاق معمولاً کدهای C معیوب در کتابخانههای شخص ثالث است. این امر چندان رایج نیست و استفاده دوباره از Jedi خطری ندارد. با این حال، استفاده از همان فراخوانیها ممکن است مجدداً به همان خطا منجر شود. | |
| 168u | |
| 0.0 | |
| exception jedi.RefactoringError | |
| بازآفرینیها (Refactorings) ممکن است به دلایل گوناگونی با شکست مواجه شوند. بنابراین اگر با توابع بازآفرینی مانند Script.rename()، Script.inline()، Script.extract_variable() و Script.extract_function() کار میکنید، حتماً این خطاها را دریافت و مدیریت کنید (catch نمایید). توضیحات موجود در خطاها معمولاً برای کاربران نهایی ارزشمند هستند. | |
| یک RefactoringError متداول به کاربر اعلام میکند در صورتی که هیچ نامی زیر مکاننما قرار نداشته باشد، درونخطسازی (inlining) امکانپذیر نیست. | |
| 168u | |
| مثالها | |
| تکمیل خودکار (Completions) | |
| 0.0 | |
| 3.5 | |
| >>> import jedi | |
| >>> code = '''import json; json.l''' | |
| >>> script = jedi.Script(code, path='example.py') | |
| >>> script | |
| <Script: 'example.py' <SameEnvironment: 3.14.0 in /usr>> | |
| >>> completions = script.complete(1, 19) | |
| >>> completions | |
| [<Completion: load>, <Completion: loads>] | |
| >>> completions[1] | |
| <Completion: loads> | |
| >>> completions[1].complete | |
| 'oads' | |
| >>> completions[1].name | |
| 'loads' | |
| 168u | |
| 168u | |
| استنتاج نوع / رفتن به (Type Inference / Goto) | |
| 0.0 | |
| 3.5 | |
| >>> import jedi | |
| >>> code = '''\ | |
| ... def my_func(): | |
| ... print 'called' | |
| ... | |
| ... alias = my_func | |
| ... my_list = [1, None, alias] | |
| ... inception = my_list[2] | |
| ... | |
| ... inception()''' | |
| >>> script = jedi.Script(code) | |
| >>> | |
| >>> script.goto(8, 1) | |
| [<Name full_name='__main__.inception', description='inception = my_list[2]'>] | |
| >>> | |
| >>> script.infer(8, 1) | |
| [<Name full_name='__main__.my_func', description='def my_func'>] | |
| 168u | |
| 0.0 | |
| 3.5 | |
| >>> import jedi | |
| >>> code = '''\ | |
| ... x = 3 | |
| ... if 1 == 2: | |
| ... x = 4 | |
| ... else: | |
| ... del x''' | |
| >>> script = jedi.Script(code) | |
| >>> rns = script.get_references(5, 8) | |
| >>> rns | |
| [<Name full_name='__main__.x', description='x = 3'>, | |
| <Name full_name='__main__.x', description='x = 4'>, | |
| <Name full_name='__main__.x', description='del x'>] | |
| >>> rns[1].line | |
| 3 | |
| >>> rns[1].column | |
| 4 | |
| 168u | |
| 168u | |
| "منسوخسازیها (Deprecations)" | |
| فرآیند منسوخسازی به شرح زیر است: | |
| 0.0 | |
| 1. 3 | |
| اعلام منسوخسازی در هر نسخهای ممکن است صورت گیرد. | |
| 2. 3 | |
| نسخهٔ اصلی (major release) بعدی، قابلیت منسوخشده را حذف میکند. | |
| 168u | |
| "کلاسهای بازگشتی API (API Return Classes)" | |
| "کلاس پایه انتزاعی (Abstract Base Class)" | |
| 0.0 | |
| class jedi.api.classes.BaseName(inference_state, name) | |
| کلاسهای پایه: object https://docs.python.org/3/library/functions.html#object | |
| کلاس پایه برای تمام تعاریف، تکمیلها و امضاها. | |
| 7.0 | |
| property module_path: Path https://docs.python.org/3/library/pathlib.html#pathlib.Path | None https://docs.python.org/3/library/constants.html#None | |
| مسیر فایل یک ماژول را نشان میدهد؛ مانند /usr/lib/python3.14/os.py | |
| 168u | |
| 7.0 | |
| property name | |
| نام متغیر/تابع/کلاس/ماژول. | |
| برای مثال، برای x = None مقدار 'x' را بازمیگرداند. | |
| 7.0 | |
| نوع بازگشتی (Return type) | |
| str https://docs.python.org/3/library/stdtypes.html#str یا None | |
| 168u | |
| 168u | |
| 7.0 | |
| property type | |
| نوع تعریف. | |
| در اینجا مثالی از مقدار این صفت آورده شده است. بیایید کد منبع زیر را در نظر بگیریم. از آنجا که محتوای variable برای Jedi بدون ابهام است، تابع jedi.Script.infer() <#jedi.Script.infer> باید فهرستی از تعاریف را برای sys، f، C و x بازگرداند. | |
| >>> from jedi import Script | |
| >>> source = ''' | |
| ... import keyword | |
| ... | |
| ... class C: | |
| ... pass | |
| ... | |
| ... class D: | |
| ... pass | |
| ... | |
| ... x = D() | |
| ... | |
| ... def f(): | |
| ... pass | |
| ... | |
| ... for variable in [keyword, f, C, x]: | |
| ... variable''' | |
| >>> script = Script(source) | |
| >>> defs = script.infer() | |
| پیش از نمایش آنچه درون defs است، بیایید آن را بر اساس line مرتب کنیم تا ارتباط دادن نتیجه با کد منبع آسان باشد. | |
| >>> defs = sorted(defs, key=lambda d: d.line) | |
| >>> print(defs) | |
| [<Name full_name='keyword', description='module keyword'>, | |
| <Name full_name='__main__.C', description='class C'>, | |
| <Name full_name='__main__.D', description='instance D'>, | |
| <Name full_name='__main__.f', description='def f'>] | |
| در نهایت، آنچه میتوانید از type دریافت کنید به شرح زیر است: | |
| >>> defs = [d.type for d in defs] | |
| >>> defs[0] | |
| 'module' | |
| >>> defs[1] | |
| 'class' | |
| >>> defs[2] | |
| 'instance' | |
| >>> defs[3] | |
| 'function' | |
| مقادیر معتبر برای نوع عبارتند از module، class، instance، function، param، path، keyword، property و statement. | |
| 168u | |
| 7.0 | |
| property module_name | |
| نام ماژول، تا حدودی شبیه به مقدار __name__ در یک ماژول دلخواه پایتون. | |
| >>> from jedi import Script | |
| >>> source = 'import json' | |
| >>> script = Script(source, path='example.py') | |
| >>> d = script.infer()[0] | |
| >>> print(d.module_name) | |
| json | |
| 168u | |
| 7.0 | |
| in_builtin_module() | |
| در صورتی که این یک ماژول داخلی (builtin) باشد، مقدار True را برمیگرداند. | |
| 168u | |
| 7.0 | |
| property line | |
| خطی که تعریف در آن رخ داده است (شروع از ۱). | |
| 168u | |
| 7.0 | |
| property column | |
| ستونی که تعریف در آن رخ داده است (شروع از ۰). | |
| 168u | |
| 7.0 | |
| get_definition_start_position() | |
| موقعیت (سطر، ستون) نقطهٔ شروع محدودهٔ تعریف. سطرها از ۱ و ستونها از ۰ شروع میشوند. | |
| 7.0 | |
| نوع بازگشتی (Return type) | |
| Optional[Tuple[int https://docs.python.org/3/library/functions.html#int, int https://docs.python.org/3/library/functions.html#int]] | |
| 168u | |
| 168u | |
| 7.0 | |
| get_definition_end_position() | |
| موقعیت (سطر، ستون) نقطهٔ پایان محدودهٔ تعریف. سطرها از ۱ و ستونها از ۰ شروع میشوند. | |
| 7.0 | |
| نوع بازگشتی (Return type) | |
| Optional[Tuple[int https://docs.python.org/3/library/functions.html#int, int https://docs.python.org/3/library/functions.html#int]] | |
| 168u | |
| 168u | |
| 7.0 | |
| docstring(raw=False, fast=True) | |
| رشتهٔ مستندات (docstring) را برای این شیء تکمیل بازمیگرداند. | |
| مثال:.sp | |
| >>> from jedi import Script | |
| >>> source = '''\ | |
| ... def f(a, b=1): | |
| ... "Document for function f." | |
| ... ''' | |
| >>> script = Script(source, path='example.py') | |
| >>> doc = script.infer(1, len('def f'))[0].docstring() | |
| >>> print(doc) | |
| f(a, b=1) | |
| Document for function f. | |
| توجه داشته باشید که اطلاعات مفید اضافی به docstring واقعی افزوده میشود؛ برای مثال امضای توابع در ابتدای docstring آنها قرار میگیرد. | |
| اگر به docstring واقعی نیاز دارید، به جای آن از raw=True استفاده کنید. | |
| >>> print(script.infer(1, len('def f'))[0].docstring(raw=True)) | |
| Document for function f. | |
| 7.0 | |
| پارامترها | |
| fast -- ایمپورتهایی را که تنها در یک سطح عمق دارند مانند | |
| import foo دنبال نکن، اما from foo import bar را دنبال کن. این کار | |
| به دلایل افزایش سرعت منطقی است. در صورت استفاده از | |
| foo.docstring(fast=False) روی تمام اشیاء، تکمیل import a کند | |
| خواهد بود، چرا که تمام کتابخانههایی را که با a شروع میشوند تجزیه میکند. | |
| 168u | |
| 168u | |
| 7.0 | |
| property description | |
| توصیفی از شیء Name که بهطور گسترده در آزمونها استفاده میشود؛ | |
| برای مثال برای isinstance مقدار def isinstance را برمیگرداند. | |
| مثال: | |
| >>> from jedi import Script | |
| >>> source = ''' | |
| ... def f(): | |
| ... pass | |
| ... | |
| ... class C: | |
| ... pass | |
| ... | |
| ... variable = f if random.choice([0,1]) else C''' | |
| >>> script = Script(source) # line is maximum by default | |
| >>> defs = script.infer(column=3) | |
| >>> defs = sorted(defs, key=lambda d: d.line) | |
| >>> print(defs) | |
| [<Name full_name='__main__.f', description='def f'>, | |
| <Name full_name='__main__.C', description='class C'>] | |
| >>> str(defs[0].description) | |
| 'def f' | |
| >>> str(defs[1].description) | |
| 'class C' | |
| 168u | |
| 7.0 | |
| property full_name | |
| مسیر نقطهگذاریشدهٔ این شیء. | |
| این مقدار به شکل <module>[.<submodule>[...]][.<object>] است. | |
| زمانی کاربرد دارد که بخواهید در راهنمای پایتون به دنبال شیء مورد نظر | |
| بگردید. | |
| مثال: | |
| >>> from jedi import Script | |
| >>> source = ''' | |
| ... import os | |
| ... os.path.join''' | |
| >>> script = Script(source, path='example.py') | |
| >>> print(script.infer(3, len('os.path.join'))[0].full_name) | |
| os.path.join | |
| توجه داشته باشید که به جای (برای مثال) 'posixpath.join'، مقدار | |
| 'os.path.join' را برمیگرداند. این از نظر فنی دقیق نیست، چرا که نام ماژول | |
| <module 'posixpath' ...>` خواهد بود. با این حال بیشتر کاربران این شیوه را | |
| کاربردیتر میدانند. | |
| 168u | |
| 7.0 | |
| is_stub() | |
| اگر نام فعلی در یک فایل stub تعریف شده باشد، مقدار True را برمیگرداند. | |
| 168u | |
| 7.0 | |
| is_side_effect() | |
| بررسی میکند که آیا یک نام بهصورت self.foo = 3 تعریف شده است یا خیر. در مورد self، این | |
| تابع مقدار False و برای foo مقدار True را برمیگرداند. | |
| 168u | |
| 7.0 | |
| goto(*, follow_imports=False, follow_builtin_imports=False, only_stubs=False, prefer_stubs=False) | |
| مشابه Script.goto() <#jedi.Script.goto> (همچنین از همان پارامترها پشتیبانی میکند)، اما این کار را | |
| برای نام فعلی انجام میدهد. این متد معمولاً زمانی کاربرد دارد که از | |
| مواردی مانند Script.get_names() <#jedi.Script.get_names> استفاده میکنید. | |
| 7.0 | |
| پارامترها | |
| 7.0 | |
| • 2 | |
| follow_imports -- فراخوانی goto ایمپورتها را دنبال خواهد کرد. | |
| • 2 | |
| follow_builtin_imports -- در صورتی که follow_imports برابر با True باشد، تلاش میکند | |
| نامها را در builtins (یعنی ماژولهای کامپایلشده یا افزونهها) جستجو کند. | |
| • 2 | |
| only_stubs -- برای این فراخوانی goto، تنها stubها را برمیگرداند. | |
| • 2 | |
| prefer_stubs -- برای این فراخوانی goto، stubها را به اشیاء پایتون ترجیح میدهد. | |
| 168u | |
| نوع بازگشتی | |
| لیستی از Name | |
| 168u | |
| 168u | |
| 7.0 | |
| infer(*, only_stubs=False, prefer_stubs=False) | |
| مشابه Script.infer() <#jedi.Script.infer>، میتواند برای درک اینکه | |
| نام فعلی چه نوعی دارد مفید باشد. | |
| تعاریف واقعی را برمیگرداند. اکیداً توصیه میکنم از آن برای تکمیلهای خودکار خود | |
| استفاده نکنید، زیرا ممکن است باعث کندی Jedi شود. اگر فقط قصد خواندن | |
| تعداد کمی شیء (<=20) را دارید، ممکن است مفید باشد، بهویژه برای دریافت | |
| docstringهای اصلی. مشکل بنیادین این تابع این است که تمام نتایج را دنبال میکند. | |
| این بدان معناست که با ۱۰۰۰ تکمیل خودکار (مانند numpy)، بسیار بسیار کند خواهد بود. | |
| 7.0 | |
| پارامترها | |
| 7.0 | |
| • 2 | |
| only_stubs -- برای این فراخوانی goto، تنها stubها را برمیگرداند. | |
| • 2 | |
| prefer_stubs -- برای این فراخوانی استنتاج نوع، stubها را به اشیاء | |
| پایتون ترجیح میدهد. | |
| 168u | |
| نوع بازگشتی | |
| لیستی از Name | |
| 168u | |
| 168u | |
| 7.0 | |
| parent() | |
| دامنهٔ والد (parent scope) این شناسه را برمیگرداند. | |
| 7.0 | |
| نوع بازگشتی | |
| Name <#jedi.api.classes.Name> | |
| 168u | |
| 168u | |
| 7.0 | |
| get_line_code(before=0, after=0) | |
| خط کدی را که این شیء در آن تعریف شده است برمیگرداند. | |
| 7.0 | |
| پارامترها | |
| 7.0 | |
| • 2 | |
| before -- افزودن n خط قبل از خط فعلی به خروجی. | |
| • 2 | |
| after -- افزودن n خط بعد از خط فعلی به خروجی. | |
| 168u | |
| مقدار بازگشتی str | |
| خط (یا خطوط) کد را برمیگرداند یا در صورتی که یک تابع توکار (builtin) باشد، | |
| یک رشته خالی برمیگرداند. | |
| 168u | |
| 168u | |
| 7.0.TP | |
| get_signatures() | |
| همهٔ امضاهای محتمل را برای یک تابع یا کلاس برمیگرداند. در صورت استفاده از stubهای پایتون به همراه @overload، وجود چندین امضا امری متداول است. | |
| 7.0 | |
| نوع بازگشتی | |
| فهرستی از BaseSignature | |
| 168u | |
| 168u | |
| 7.0 | |
| execute() | |
| از استنتاج نوع (type inference) برای "اجرای" این شناسه استفاده کرده و اشیای اجراشده را برمیگرداند. | |
| 7.0 | |
| نوع بازگشتی | |
| فهرستی از Name | |
| 168u | |
| 168u | |
| 7.0 | |
| get_type_hint() | |
| راهنماهای نوع نظیر Iterable[int] یا Union[int, str] را برمیگرداند. | |
| این متد ممکن است بهویژه برای توابع بسیار کُند باشد. مسئله، یافتن اجراهایی برای آن توابع است تا مقداری مانند Callable[[int, str], str] را بازگرداند. | |
| 7.0 | |
| نوع بازگشتی | |
| str https://docs.python.org/3/library/stdtypes.html#str | |
| 168u | |
| 168u | |
| 168u | |
| Name | |
| 0.0 | |
| class jedi.api.classes.Name(inference_state, definition) | |
| کلاسهای پایه: BaseName | |
| اشیای Name از APIهای گوناگونی از جمله Script.goto() <#jedi.Script.goto> یا Script.infer() <#jedi.Script.infer> بازگردانده میشوند. | |
| 7.0 | |
| defined_names() | |
| تعریفهای زیرمجموعه (مانند متدهای درون یک کلاس) را فهرست میکند. | |
| 7.0 | |
| نوع بازگشتی | |
| فهرستی از Name | |
| 168u | |
| 168u | |
| 7.0 | |
| is_definition() | |
| اگر به عنوان یک نام در یک عبارت، تابع یا کلاس تعریف شده باشد مقدار True، و چنانچه ارجاعی به چنین تعریفی باشد مقدار False را برمیگرداند. | |
| 168u | |
| 168u | |
| Completion | |
| 0.0 | |
| class jedi.api.classes.Completion(inference_state, name, stack, like_name_length, is_fuzzy, cached_name=None) | |
| کلاسهای پایه: BaseName | |
| اشیای Completion از Script.complete() <#jedi.Script.complete> بازگردانده میشوند. آنها اطلاعات بیشتری را دربارهٔ یک تکمیل ارائه میدهند. | |
| 7.0 | |
| property complete | |
| تنها با تکمیلهای غیرفازی (non-fuzzy) کار میکند. در صورت استفاده از تکمیلهای فازی، مقدار None برمیگرداند. | |
| باقیماندهٔ کلمه را برمیگرداند؛ برای نمونه در تکمیل isinstance: | |
| 7.0 | |
| 3.5 | |
| isinstan# <-- Cursor is here | |
| 168u | |
| 168u | |
| رشتهٔ 'ce' را برمیگرداند. همچنین بسته به settings.py شما، موارد دیگری را نیز میافزاید. | |
| با فرض تعریف تابع زیر: | |
| 7.0 | |
| 3.5 | |
| def foo(param=0): | |
| pass | |
| 168u | |
| 168u | |
| تکمیل عبارت foo(par یک Completion ارائه میدهد که مقدار complete آن برابر با am= خواهد بود. | |
| 168u | |
| 7.0 | |
| property name_with_symbols | |
| مشابه name است، اما مانند name نمادها را نیز برمیگرداند؛ برای نمونه با فرض تعریف تابع زیر: | |
| 7.0 | |
| 3.5 | |
| def foo(param=0): | |
| pass | |
| 168u | |
| 168u | |
| تکمیل عبارت foo( یک Completion ارائه میدهد که مقدار name_with_symbols آن برابر با "param=" خواهد بود. | |
| 168u | |
| 7.0 | |
| docstring(raw=False, fast=True) | |
| در BaseName.docstring() مستندسازی شده است. | |
| 168u | |
| 7.0 | |
| property type | |
| در BaseName.type() مستندسازی شده است. | |
| 168u | |
| 7.0 | |
| get_completion_prefix_length() | |
| طول پیشوندی را که در حال تکمیل است برمیگرداند. | |
| برای نمونه در تکمیل isinstance: | |
| 7.0 | |
| 3.5 | |
| isinstan# <-- Cursor is here | |
| 168u | |
| 168u | |
| مقدار 8 را برمیگرداند، چرا که len('isinstan') == 8 است. | |
| با فرض تعریف تابع زیر: | |
| 7.0 | |
| 3.5 | |
| def foo(param=0): | |
| pass | |
| 168u | |
| 168u | |
| تکمیل عبارت foo(par مقدار 3 را برمیگرداند. | |
| 168u | |
| 0.0 | |
| class jedi.api.classes.BaseSignature(inference_state, signature) | |
| کلاسهای پایه: Name | |
| این امضاها توسط فراخوانیهای BaseName.get_signatures() | |
| بازگردانده میشوند. | |
| 7.0 | |
| property params | |
| تعاریف تمام پارامترهایی را که یک امضا مشخص میکند بازمیگرداند. | |
| این شامل مواردی مانند *args و **kwargs میشود. | |
| 7.0 | |
| نوع بازگشتی | |
| فهرستی از ParamName | |
| 168u | |
| 168u | |
| 7.0 | |
| to_string() | |
| یک نمایش متنی از امضا را بازمیگرداند. این میتواند به عنوان مثال | |
| شبیه foo(bar, baz: int, **kwargs) باشد. | |
| 7.0 | |
| نوع بازگشتی | |
| str https://docs.python.org/3/library/stdtypes.html#str | |
| 168u | |
| 168u | |
| 168u | |
| Signature | |
| 0.0 | |
| class jedi.api.classes.Signature(inference_state, signature, call_details) | |
| کلاسهای پایه: BaseSignature | |
| یک شیء کامل امضا، مقدار بازگشتی | |
| Script.get_signatures() <#jedi.Script.get_signatures> است. | |
| 7.0 | |
| property index | |
| اندیس پارامترِ موقعیت فعلی مکاننما را بازمیگرداند. | |
| اگر اندیس در فراخوانی فعلی یافت نشود، None بازمیگرداند. | |
| 7.0 | |
| نوع بازگشتی | |
| int https://docs.python.org/3/library/functions.html#int | |
| 168u | |
| 168u | |
| 7.0 | |
| property bracket_start | |
| یک تاپل سطر/ستون از قلابی که مسئول آخرین فراخوانی | |
| تابع است را بازمیگرداند. سطر اول ۱ و ستون اول ۰ است. | |
| 7.0 | |
| نوع بازگشتی | |
| int https://docs.python.org/3/library/functions.html#int, int https://docs.python.org/3/library/functions.html#int | |
| 168u | |
| 168u | |
| 168u | |
| ParamName | |
| 0.0 | |
| class jedi.api.classes.ParamName(inference_state, definition) | |
| کلاسهای پایه: Name | |
| 7.0 | |
| infer_default() | |
| مقادیر پیشفرض را مانند 1 در def foo(x=1): بازمیگرداند. | |
| 7.0 | |
| نوع بازگشتی | |
| فهرستی از Name | |
| 168u | |
| 168u | |
| 7.0 | |
| infer_annotation(**kwargs) | |
| 7.0 | |
| پارامترها | |
| execute_annotation -- پیشفرض True؛ اگر False باشد، مقادیر | |
| اجرا نمیشوند و بهجای نمونهها، کلاسها بازگردانده میشوند. | |
| نوع بازگشتی | |
| فهرستی از Name | |
| 168u | |
| 168u | |
| 7.0 | |
| to_string() | |
| یک نمایش ساده از یک پارامتر را بازمیگرداند، مانند | |
| f: Callable[..., Any]. | |
| 7.0 | |
| نوع بازگشتی | |
| str https://docs.python.org/3/library/stdtypes.html#str | |
| 168u | |
| 168u | |
| 7.0 | |
| property kind | |
| یک نمونه enum از شمارشیِ Parameter در ماژول | |
| inspect https://docs.python.org/3/library/inspect.html#module-inspect را بازمیگرداند. | |
| 7.0 | |
| نوع بازگشتی | |
| inspect.Parameter.kind https://docs.python.org/3/library/inspect.html#inspect.Parameter.kind | |
| 168u | |
| 168u | |
| 0.0 | |
| class jedi.api.refactoring.Refactoring(inference_state, file_to_node_changes, renames=()) | |
| کلاسهای پایه: object https://docs.python.org/3/library/functions.html#object | |
| 7.0 | |
| get_renames() -> Iterable https://docs.python.org/3/library/typing.html#typing.Iterable[Tuple https://docs.python.org/3/library/typing.html#typing.Tuple[Path https://docs.python.org/3/library/pathlib.html#pathlib.Path, Path https://docs.python.org/3/library/pathlib.html#pathlib.Path]] | |
| فایلها میتوانند در یک بازسازی کد تغییر نام داده شوند. | |
| 168u | |
| 7.0 | |
| apply() | |
| کل بازسازی کد را روی فایلها اعمال میکند، که شامل تغییر نامها نیز میشود. | |
| 168u | |
| 168u | |
| 0.0 | |
| class jedi.api.errors.SyntaxError(parso_error) | |
| کلاسهای پایه: object https://docs.python.org/3/library/functions.html#object | |
| خطاهای نحوی توسط Script.get_syntax_errors() <#jedi.Script.get_syntax_errors> تولید میشوند. | |
| 7.0 | |
| property line | |
| سطری که خطا از آنجا آغاز میشود (شروع از ۱). | |
| 168u | |
| 7.0 | |
| property column | |
| ستونی که خطا از آنجا آغاز میشود (شروع از ۰). | |
| 168u | |
| 7.0 | |
| property until_line | |
| سطری که خطا در آن به پایان میرسد (شروع از ۱). | |
| 168u | |
| 7.0 | |
| property until_column | |
| ستونی که خطا در آن به پایان میرسد (شروع از ۰). | |
| 168u | |
| 168u | |
| نصب و پیکربندی (Installation and Configuration) | |
| هشدار: | |
| 0.0 | |
| 3.5 | |
| بیشتر افراد ترجیح میدهند Jedi را به عنوان یک زیرماژول (submodule) یا به صورت درونپروژهای (vendored) نصب کنند و نه از طریق pip یا در سطح سراسری سیستم. دلیل این امر آن است که منطقی است افزونهای که از Jedi استفاده میکند، همواره به آن دسترسی داشته باشد. در غیر این صورت، هنگامی که virtualenvها فعال شوند، Jedi به درستی کار نخواهد کرد. بنابراین لطفاً برای نصب Jedi، مستندات افزونه ویرایشگر یا IDE خود را مطالعه کنید. | |
| برای توسعهدهندگان افزونه، Jedi زمانی بهترین عملکرد را دارد که همواره در دسترس باشد. استفاده از روش الحاق درونبرنامهای (Vendoring) گزینهای بسیار مناسب برای این منظور است. | |
| 168u | |
| 168u | |
| میتوانید Jedi را به عنوان یک زیرماژول در افزونه ویرایشگر متن خود بگنجانید (مانند کاری که jedi-vim https://github.com/davidhalter/jedi-vim به طور پیشفرض انجام میدهد)، یا میتوانید آن را در سطح کل سیستم نصب کنید. | |
| نکته: | |
| 0.0 | |
| 3.5 | |
| این کار فقط کتابخانه Jedi را نصب میکند، نه افزونههای ویرایشگر <#editor-plugins> را. برای اطلاعات در مورد چگونگی راهاندازی و هماهنگسازی آن با ویرایشگر خود، به مستندات مربوطه مراجعه کنید. | |
| 168u | |
| 168u | |
| روش معمول (The normal way) | |
| اکثر افراد از Jedi همراه با افزونههای ویرایشگر <#editor-plugins> استفاده میکنند. معمولاً با نصب افزونه ویرایشگر، Jedi نیز نصب میشود. به مراحل اضافهای نیاز نیست؛ فقط کافی است نگاهی به دستورالعملهای افزونه بیندازید. | |
| با pip (With pip) | |
| در هر سیستمی میتوانید Jedi را مستقیماً از نمایه بستههای پایتون (Python Package Index) با استفاده از pip نصب کنید: | |
| 0.0 | |
| 3.5 | |
| sudo pip install jedi | |
| 168u | |
| 168u | |
| اگر میخواهید نسخه در حال توسعه فعلی (شاخه master) را نصب کنید: | |
| 0.0 | |
| 3.5 | |
| sudo pip install -e git+https://github.com/davidhalter/jedi.git#egg=jedi | |
| 168u | |
| Arch Linux | |
| شما میتوانید Jedi را مستقیماً از بستههای رسمی Arch Linux نصب کنید: | |
| 0.0 | |
| • 2 | |
| python-jedi https://www.archlinux.org/packages/community/any/python-jedi | |
| 168u | |
| (نسخه بستهبندیشدهای از افزونه vim نیز موجود است: | |
| vim-jedi در Arch Linux https://www.archlinux.org/packages/community/any/vim-jedi.) | |
| Debian | |
| بستههای Debian در مخزن unstable موجود هستند https://packages.debian.org/search?keywords=python%20jedi. | |
| سایر موارد | |
| ما در حال گفتگو برای افزودن Jedi به مخازن Fedora هستیم. | |
| نصب دستی از GitHub | |
| اگر ترجیح میدهید از یک نصبکننده خودکار بسته استفاده نکنید، میتوانید سورسکد را از GitHub کلون کرده و آن را بهصورت دستی نصب کنید. برای نصب آن، این دستورات را اجرا کنید: | |
| 0.0 | |
| 3.5 | |
| git clone --recurse-submodules https://github.com/davidhalter/jedi | |
| cd jedi | |
| sudo python setup.py install | |
| 168u | |
| 168u | |
| درج بهصورت یک submodule | |
| اگر از افزونههای ویرایشگر مانند jedi-vim https://github.com/davidhalter/jedi-vim استفاده میکنید، میتوانید به سادگی Jedi را بهعنوان یک | |
| submodule در دایرکتوری افزونه قرار دهید. مدیران افزونه Vim مانند Vundle https://github.com/gmarik/vundle یا | |
| Pathogen https://github.com/tpope/vim-pathogen بهروز نگهداشتن submoduleها را بسیار ساده میکنند. | |
| تنظیمات (Settings) | |
| این ماژول حاوی متغیرهایی با تنظیمات سراسری Jedi است. برای تغییر دادن | |
| رفتار Jedi، متغیرهای تعریفشده در jedi.settings را تغییر دهید. | |
| افزونهها باید رابطی ارائه دهند تا کاربر بتواند پیکربندی را تنظیم کند. | |
| نمونه استفاده: | |
| 0.0 | |
| 3.5 | |
| from jedi import settings | |
| settings.case_insensitive_completion = True | |
| 168u | |
| 168u | |
| خروجی تکمیل (Completion output) | |
| 0.0 | |
| jedi.settings.case_insensitive_completion = True | |
| تکمیلها به صورت پیشفرض به کوچک و بزرگ بودن حروف حساس نیستند (case insensitive). | |
| 168u | |
| 0.0 | |
| jedi.settings.add_bracket_after_function = False | |
| یک براکت/پرانتز بازشونده پس از تابع برای تکمیل خودکار اضافه میکند. | |
| 168u | |
| حافظه پنهان فایلسیستم (Filesystem cache) | |
| 0.0 | |
| jedi.settings.cache_directory = '/build/.cache/jedi' | |
| مسیری که حافظه پنهان (cache) در آن ذخیره میشود. | |
| در Linux، مقدار پیشفرض آن ~/.cache/jedi/، در OS X برابر با | |
| ~/Library/Caches/Jedi/ و در Windows برابر با %LOCALAPPDATA%\Jedi\Jedi\ است. | |
| در Linux، اگر متغیر محیطی $XDG_CACHE_HOME تنظیم شده باشد، | |
| $XDG_CACHE_HOME/jedi به جای مسیر پیشفرض استفاده میشود. | |
| 168u | |
| تجزیهکننده (Parser) | |
| 0.0 | |
| jedi.settings.fast_parser = True | |
| از تجزیهکننده تفاضلی (diff parser) متعلق به Parso استفاده میکند. در صورت فعال بودن، ممکن است مشکلاتی ایجاد کند؛ لطفاً | |
| هشدار موجود در Script <#jedi.Script> را مطالعه کنید. این قابلیت امکان بازتجزیه تنها | |
| بخشهایی را فراهم میکند که تغییر کردهاند، در حالی که باقی درخت نحو (syntax tree) مجدداً استفاده میشود. | |
| 0.0 | |
| jedi.settings.dynamic_array_additions = True | |
| بررسی برای append و غیره روی آرایهها: []، {}، () و همچنین فراخوانیهای list/set. | |
| 168u | |
| 0.0 | |
| jedi.settings.dynamic_params = True | |
| تکمیل پویای پارامترها؛ توابع فراخواندهشدهای (callees) را مییابد که پارامترهای یک تابع را تعریف میکنند. | |
| 168u | |
| 0.0 | |
| jedi.settings.dynamic_params_for_other_modules = True | |
| همین کار را برای سایر ماژولها انجام میدهد. | |
| 168u | |
| 0.0 | |
| jedi.settings.auto_import_modules = ['gi'] | |
| ماژولهایی که تحلیل نخواهند شد، بلکه در صورت داشتن کد Python، ایمپورت میشوند. این گزینه تکمیل خودکار را برای کتابخانههایی که از setattr یا تغییرات globals() زیاد استفاده میکنند، بهبود میبخشد. | |
| 168u | |
| ذخیرهسازی موقت (Caching) | |
| 0.0 | |
| jedi.settings.call_signatures_validity = 3.0 | |
| یافتن فراخوانیهای تابع ممکن است کُند باشد (0.1-0.5s). این مقدار برای نوشتن عادی کد قابل قبول نیست؛ بنابراین آن را برای مدتی کوتاه در حافظه موقت (cache) ذخیره میکند. | |
| 168u | |
| توسعه Jedi (Jedi Development) | |
| نکته: | |
| 0.0 | |
| 3.5 | |
| این مستندات برای توسعهدهندگان Jedi است که میخواهند خودِ Jedi را بهبود دهند، اما اطلاعی از نحوه کارکرد Jedi ندارند. اگر میخواهید از Jedi در IDE خود استفاده کنید، به plugin api در <api.html> نگاهی بیندازید. | |
| همچنین مهم است توجه داشته باشید که این نسخه نسبتاً قدیمی است و ممکن است برخی موارد دیگر اعمال نشوند. | |
| 168u | |
| 168u | |
| مقدمه (Introduction) | |
| این صفحه تلاش میکند تا به نیاز اساسی برای مستندسازی سازوکارهای داخلی Jedi پاسخ دهد. درک یک زبان پویا کاری پیچیده است؛ بهویژه از آنجا که استنتاج نوع (type inference) در Python میتواند فرآیندی بسیار بازگشتی باشد. از این رو Jedi نتوانسته است از پیچیدگی دوری کند. میدانم که ساده بهتر از پیچیده است، اما متأسفانه گاهی برای فهمیدن سیستمهای پیچیده، به راهحلهای پیچیده نیاز است. | |
| در شش فصل تلاش میکنم سازوکارهای داخلی Jedi را توصیف کنم: | |
| 0.0 | |
| • 2 | |
| هسته Jedi | |
| • 2 | |
| افزونههای هسته | |
| • 2 | |
| ایمپورتها و ماژولها (Imports & Modules) | |
| • 2 | |
| استابها و حاشیهنویسیها (Stubs & Annotations) | |
| • 2 | |
| ذخیرهسازی موقت و بازگشتها (Caching & Recursions) | |
| • 2 | |
| ماژولهای کمکی | |
| 168u | |
| نکته: | |
| 0.0 | |
| 3.5 | |
| آزمونها (Testing) در اینجا مستند نشدهاند؛ میتوانید آنها را در اینجا <testing.html> بیابید. | |
| 168u | |
| 168u | |
| هسته Jedi (The Jedi Core) | |
| هسته Jedi از سه بخش تشکیل شده است: | |
| 0.0 | |
| • 2 | |
| تجزیهکننده (Parser) | |
| • 2 | |
| استنتاج نوع Python | |
| • 2 | |
| API | |
| 168u | |
| بیشتر افراد احتمالاً به استنتاج نوع علاقهمند هستند، زیرا تمام جادو در آنجا اتفاق میافتد. ابتدا باید تجزیهکننده (parser) را معرفی کنم، زیرا jedi.inference بهطور گسترده از آن استفاده میکند..SS تجزیهکننده (Parser) | |
| پروژه Jedi در گذشته تجزیهکنندهٔ درونی خود را داشت، با این حال این بخش اکنون یک پروژهٔ جداگانه است و parso نام دارد http://parso.readthedocs.io. | |
| این تجزیهکننده یک درخت نحو ایجاد میکند که Jedi آن را تحلیل کرده و تلاش میکند آن را بفهمد. گرامری که این تجزیهکننده استفاده میکند بسیار شبیه به فایلهای رسمی گرامر پایتون است https://docs.python.org/3/reference/grammar.html. | |
| استنتاج نوع در کد پایتون (inference/__init__.py) | |
| استنتاج نوع کد پایتون در Jedi بر پایهٔ سه فرض بنا شده است: | |
| 0.0 | |
| • 2 | |
| کد تا حد امکان کمترین اثرات جانبی (side effects) را داشته باشد. Jedi برخی از تغییرات list/tuple/set را متوجه میشود، اما هیچ تضمینی وجود ندارد که Jedi همه چیز را تشخیص دهد (برای مثال list.append در ماژولهای مختلف). | |
| • 2 | |
| هیچ جادویی (magic) به کار نرفته باشد: | |
| 2.0 | |
| • 2 | |
| ابَرکلاسها (metaclasses) | |
| • 2 | |
| setattr() / __import__() | |
| • 2 | |
| نوشتن در globals()، locals()، object.__dict__ | |
| 168u | |
| • 2 | |
| برنامهنویس کدهای کاملاً موذیانه و مردمآزارانه ننویسد، برای نمونه مانند این مورد https://github.com/davidhalter/jedi/issues/24 :-) | |
| 168u | |
| الگوریتم اصلی بر مبنای اصلی است که من آن را «استنتاج تنبل نوع» (lazy type inference) مینامم. با این حال، نقطهٔ ورود معمول برای تحلیل ایستا، فراخوانی infer_expr_stmt است. منطق جداگانهای برای تکمیل خودکار در API وجود دارد، و تمام وظیفهٔ inference_state استنتاج یک عبارت (expression) است. | |
| یادداشت TODO: این پاراگراف دیگر دقیقاً بیانگر آنچه jedi انجام میدهد نیست؛ مشابه است، اما یکسان نیست. | |
| اکنون باید بدانید چه چیزی پس از infer_expr_stmt رخ میدهد. بیایید یک مثال بزنیم: | |
| 0.0 | |
| 3.5 | |
| import datetime | |
| datetime.date.toda# <-- cursor here | |
| 168u | |
| 168u | |
| پیش از هر چیز، این ماژول اهمیتی به تکمیل خودکار نمیدهد. واقعاً فقط به datetime.date اهمیت میدهد. در پایان فرایند، infer_expr_stmt کلاس date را بازمیگرداند. | |
| برای تجسم این موضوع (بهصورت سادهشده): | |
| 0.0 | |
| • 2 | |
| تابع InferenceState.infer_expr_stmt کار زیادی انجام نمیدهد، زیرا هیچ انتسابی وجود ندارد. | |
| • 2 | |
| تابع Context.infer_node به تفکیک مسیر نقطهدار (dotted path) میپردازد. | |
| • 2 | |
| تابع InferenceState.find_types تعاریف سراسری datetime را با پیمایش درخت نحو جستجو میکند، که آن را در تعریف یک import مییابد. | |
| • 2 | |
| با استفاده از منطق import، ماژول datetime پیدا میشود. | |
| • 2 | |
| اکنون find_types دوباره توسط infer_node فراخوانی میشود تا date را درون ماژول datetime پیدا کند. | |
| 168u | |
| حال اگر datetime.date.foo.bar را میخواستیم چه میشد؟ دو فراخوانی دیگر برای find_types انجام میگرفت. با این حال فراخوانی دوم نادیده گرفته میشد، زیرا اولی چیزی بازنمیگرداند (هیچ مشخصهٔ foo در date وجود ندارد). | |
| اگر import حاوی یک ExprStmt دیگر باشد چطور، مانند این: | |
| 0.0 | |
| 3.5 | |
| from foo import bar | |
| Date = bar.baz | |
| 168u | |
| 168u | |
| خب... متوجه شدید. صرفاً یک بازگشت (recursion) دیگر برای infer_expr_stmt است. واقعاً ساده است. پایتون مشخصاً میتواند بسیار پیچیدهتر از این شود. برای درک انتسابهای تاپل، خلاصهسازی لیستها (list comprehensions) و هر چیز دیگری، کدهای بسیار بیشتری باید نوشته میشد. | |
| پروژه Jedi بسیار خوب آزمایش شده است، بنابراین میتوانید با خیال راحت شروع به دستکاری کد کنید. بهتر است ابتدا آزمون اختصاصی خود را برای ویژگی "جدید" بنویسید. از خراب کردن بخشها نترسید. تا زمانی که آزمونها پاس شوند، به احتمال زیاد مشکلی نخواهید داشت. | |
| باید در اینجا اشاره کنم که استنتاج تنبل نوع واقعاً عالی است زیرا تنها چیزی را استنتاج میکند که نیاز به استنتاج شدن دارد. تمام گزارهها و ماژولهایی که استفاده نمیشوند، صرفاً نادیده گرفته میشوند..SS مقادیر استنتاج (inference/base_value.py) | |
| مقادیر همان "values" هستند که Python بازمیگرداند. با این حال، Values همزمان همان "مقادیری" نیز هستند که کاربر در حال حاضر درون آنها قرار دارد. | |
| یک ValueSet معمولاً برای تعیین مقدار بازگشتی یک تابع یا هر عملیات تحلیل ایستای دیگر استفاده میشود. در Jedi همواره چندین مقدار بازگشتی وجود دارد و نه فقط یکی. | |
| تفکیک نام (inference/finder.py) | |
| جستجو برای نامها با دامنه (scope) و نام مشخص. این موضوع در Jedi و Python نقشی بسیار محوری دارد. تفکیک نام با وجود descripter، | |
| __getattribute__، __getattr__، global و غیره کاملاً پیچیده است. | |
| اگر میخواهید تفکیک نام را درک کنید، لطفاً چند فصل اول در http://blog.ionelmc.ro/2015/02/09/understanding-python-metaclasses را مطالعه کنید. | |
| بررسیهای جریان (Flow checks) | |
| بررسیهای جریان چندان بالغ و کامل نیستند. تنها یک بررسی برای isinstance وجود دارد. این ویژگی بررسی میکند که آیا یک جریان به شکل if isinstance(a, type_or_tuple) هست یا خیر. متأسفانه هر مورد دیگری نادیده گرفته میشود (بهعنوان مثال، بررسی a == '' آسان بود -> a یک رشته است). پتانسیل بالایی در این بررسیها وجود دارد. | |
| رابط برنامهنویسی API (api/__init__.py و api/classes.py) | |
| رابط برنامهنویسی (API) طوری طراحی شده است که استفاده از آن تا حد امکان آسان باشد. مستندات API را میتوان در اینجا یافت: <api.html>. خود API شامل کد اندکی است که نیاز به ذکر آن در اینجا باشد. عموماً تلاش میکنم در مورد API محافظهکار باشم. ترجیح میدهم ویژگیهای جدیدی به API اضافه نکنم مگر اینکه واقعاً ضروری باشند، زیرا منسوخ کردن قابلیتها بسیار دشوارتر از افزودن آنها در آینده است. | |
| افزونههای هسته (Core Extensions) | |
| افزونههای هسته خلاصهای از موضوعات زیر است: | |
| 0.0 | |
| • 2 | |
| پیمایشپذیرها و آرایههای پویا (Iterables & Dynamic Arrays) | |
| • 2 | |
| پارامترهای پویا (Dynamic Parameters) | |
| • 2 | |
| رشتههای مستندات (Docstrings) | |
| • 2 | |
| بازآفرینی کد (Refactoring) | |
| 168u | |
| این موضوعات برای درک اقدامات مضاعفی که Jedi انجام میدهد بسیار مهم هستند، اما میتوان آنها را از Jedi حذف کرد و Jedi همچنان کار خواهد کرد؛ هرچند کندتر و بدون برخی از قابلیتها. | |
| پیمایشپذیرها و آرایههای پویا (inference/value/iterable.py) | |
| برای درک عمیقتر Python، لازم است Jedi برخی از قابلیتهای پویای Python مانند لیستهایی که پس از ایجاد پر میشوند را بفهمد: | |
| شامل تمام کلاسها و توابعی است که بهطور کلی با lists، dicts، مولدها (generators) و تکرارکنندهها (iterators) سر و کار دارند. | |
| تکمیل پارامتر (inference/dynamic_params.py) | |
| یکی از ویژگیهای واقعاً مهم Jedi این است که گزینهای برای درک کدهایی نظیر این داشته باشد: | |
| 0.0 | |
| 3.5 | |
| def foo(bar): | |
| bar. # completion here | |
| foo(1) | |
| 168u | |
| 168u | |
| شکی نیست که آیا bar یک int است یا خیر، اما اگر فراخوانی دیگری نیز مانند foo('str') وجود داشته باشد، چه رخ خواهد داد؟ خوب، ما صرفاً هر دو را نشان میدهیم؛ زیرا این دقیقاً همان چیزی است که یک انسان انتظار دارد. | |
| روال کار به این صورت است: | |
| 0.0 | |
| • 2 | |
| Jedi یک پارامتر را مشاهده میکند | |
| • 2 | |
| جستجو برای فراخوانیهای تابع با نام foo | |
| • 2 | |
| اجرای این فراخوانیها و بررسی ورودی. | |
| رشتههای مستندات (Docstrings) منبع اطلاعاتی دیگری برای توابع و کلاسها هستند. | |
| jedi.inference.dynamic_params تلاش میکند تا تمامی اجراهای توابع را بیابد، | |
| در حالی که تجزیهٔ رشتههای مستندات بسیار آسانتر است. سه نوع مختلف از | |
| رشتههای مستندات وجود دارد که Jedi آنها را میفهمد: | |
| 0.0 | |
| • 2 | |
| Sphinx http://sphinx-doc.org/markup/desc.html#info-field-lists | |
| • 2 | |
| Epydoc http://epydoc.sourceforge.net/manual-fields.html | |
| • 2 | |
| Numpydoc https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt | |
| 168u | |
| برای نمونه، حاشیهنویسی اسفینکس :type foo: str بهروشنی بیان میکند که | |
| نوعِ foo برابر با str است. | |
| بهعنوان مکملی برای جستجوی پارامترها، این ماژول همچنین حاشیهنویسیهای بازگشتی را | |
| ارائه میدهد. | |
| بازآرایی (api/refactoring.py) | |
| وارد کردنها و ماژولها (Imports & Modules) | |
| 0.0 | |
| • 2 | |
| ماژولها https://docs.python.org/3/library/modules.html#modules | |
| • 2 | |
| ماژولهای توکار | |
| • 2 | |
| وارد کردنها | |
| 168u | |
| ماژولهای کامپایلشده (inference/compiled.py) | |
| وارد کردنها (inference/imports.py) | |
| jedi.inference.imports برای تفکیک دستورهای import و بازگرداندن | |
| ماژولها/کلاسها/توابع یا هر آنچه که معرف آن هستند به کار میرود. با این وجود، | |
| هیچ عمل وارد کردنِ واقعی انجام نمیگیرد. این ماژول به یافتن ماژولها در | |
| سیستمفایل میپردازد. این کار گاهی میتواند بسیار قلقدار باشد، چرا که وارد کردنها | |
| در پایتون همواره آنقدر ساده نیستند. | |
| این ماژول همچنین از تکمیل خودکار دستورهای import پشتیبانی میکند، بدین معنا که عباراتی | |
| مانند from datetim را تکمیل میکند (قرار گرفتن مکاننما در انتها datetime را بازمیگرداند). | |
| استابها و حاشیهنویسیها (inference/gradual) | |
| متأسفانه نحوهٔ کارکرد استابها (stubs) و حاشیهنویسیها (annotations) در Jedi بهخوبی مستند نشده است. | |
| اگر کسی به راهنمایی در این باره نیاز دارد، لطفاً به من اطلاع دهد. | |
| حافظهٔ پنهان و بازگشتها (Caching & Recursions) | |
| 0.0 | |
| • 2 | |
| حافظهٔ پنهان (Caching) | |
| • 2 | |
| بازگشتها (Recursions) | |
| 168u | |
| حافظهٔ پنهان (cache.py) | |
| این حافظهٔ پنهان برای بهینهسازیهای سرعت و حافظه بسیار مهم است. چیز واقعاً | |
| خارقالعادهای وجود ندارد، فقط چند دکوراتور. انواع حافظهٔ پنهان زیر در دسترس هستند: | |
| 0.0 | |
| • 2 | |
| از time_cache میتوان برای ذخیره در حافظهٔ پنهان تنها برای یک بازهٔ زمانی محدود استفاده کرد، | |
| که در هنگام تعامل با کاربر و عدم توانایی کاربر در واکنش سریعتر از زمانی مشخص، میتواند مفید باشد. | |
| 168u | |
| این ماژول یکی از دلایلی است که Jedi از نظر چندنخی امن نیست (thread-safe نیست). همانگونه که | |
| میبینید، متغیرهای سراسری وجود دارند که اطلاعات حافظهٔ پنهان را نگهداری میکنند. برخی از | |
| این متغیرها پس از هر بار استفاده از API پاکسازی میشوند. | |
| بازگشتها (recursion.py) | |
| بازگشتها دستورالعمل Jedi برای تسخیر کد پایتون هستند. با این حال، باید جلوی | |
| از کنترل خارج شدن بازگشتها گرفته شود. برخی تنظیمات در اینجا تعبیه شدهاند تا Jedi را | |
| در زمان مناسب متوقف کنند. میتوانید دربارهٔ آنها در اینجا بیشتر بخوانید. | |
| در کنار ماژول درونی jedi.inference.cache، این ماژول نیز Jedi را ناامن در برابر | |
| چندنخی (غیر thread-safe) میسازد، چرا که execution_recursion_decorator از متغیرهای | |
| کلاس برای شمارش فراخوانیهای تابع استفاده میکند. | |
| تنظیمات (Settings) | |
| تنظیمات بازگشت زمانی حائز اهمیت هستند که نخواهید کدهای شدیداً | |
| بازگشتی پایتون کاملاً مهارنشدنی شوند. | |
| مقادیر پیشفرض بر پایهٔ آزمونها هنگام تکمیل خودکارِ خود کتابخانهٔ Jedi | |
| تعیین شدهاند (inception!). اما گمان نمیکنم کتابخانهٔ پایتون دیگری وجود داشته باشد | |
| که به این شیوهٔ مفرط از بازگشت استفاده کند. تکمیل خودکار همچنین باید سریع باشد و | |
| از این رو ممکن است کیفیت همواره در بالاترین حد نباشد. | |
| 0.0 | |
| jedi.inference.recursion.recursion_limit = 15 | |
| مانند sys.getrecursionlimit() https://docs.python.org/3/library/sys.html#sys.getrecursionlimit، فقط مختص Jedi. | |
| 168u | |
| 0.0 | |
| jedi.inference.recursion.total_function_execution_limit = 200 | |
| این یک حد سختگیرانه (hard limit) برای تعداد توابع غیرتوکاری (non-builtin) است که میتوانند اجرا شوند. | |
| 168u | |
| 0.0 | |
| jedi.inference.recursion.per_function_execution_limit = 6 | |
| حداکثر دفعاتی که یک تابع مشخص میتواند اجرا شود. | |
| 168u | |
| 0.0 | |
| jedi.inference.recursion.per_function_recursion_limit = 2 | |
| یک تابع نمیتواند بیش از این تعداد دفعات بهصورت بازگشتی اجرا شود. | |
| اکثر ماژولهای دیگر واقعاً نقشی محوری در نحوه کارکرد Jedi ندارند. همه آنها شامل کدهای مرتبط هستند، اما اگر ماژولهای بالا را درک کنید، تقریباً Jedi را به طور کامل متوجه شدهاید. | |
| آزمایش Jedi (Jedi Testing) | |
| مجموعه آزمون به pytest وابسته است: | |
| 0.0 | |
| 3.5 | |
| pip install pytest | |
| 168u | |
| 168u | |
| اگر میخواهید فقط یک نسخه خاص پایتون (مثلاً Python 3.14) را آزمایش کنید، اجرای آن به همین سادگی است: | |
| 0.0 | |
| 3.5 | |
| python3.14 -m pytest | |
| 168u | |
| 168u | |
| آزمونها همچنین بهطور خودکار روی GitHub Actions https://github.com/davidhalter/jedi/actions اجرا میشوند. | |
| میخواهید آزمونی برای Jedi اضافه کنید؟ عالی است! ما از آن استقبال میکنیم. معمولاً باید آزمونهای خود را بهصورت Blackbox Tests بنویسید. اغلب آزمونها دقیقاً در همین دسته جای میگیرند. | |
| برای آزمایش اختصاصی API، ما از آزمونهای واحد (unit tests) ساده، با تمرکز بر ساختار آزمایشی ساده و خوانا استفاده میکنیم. | |
| آزمونهای یکپارچهسازی (Integration Tests - run.py) | |
| Jedi عمدتاً با آنچه «آزمونهای یکپارچهسازی» ("integration tests") مینامم سنجیده میشود. این آزمونها استنتاج نوع (type inference) را با API عمومی ارزیابی میکنند. این رویکرد برای Jedi کاملاً منطقی است. همچنین، نوشتن doctests/unittests برای ساختارهای داده داخلی دشوار است. | |
| انواع مختلفی از آزمونها وجود دارد: | |
| 0.0 | |
| • 2 | |
| تکمیلها / استنتاج #? (completions / inference) | |
| • 2 | |
| انتقال (goto): #! | |
| • 2 | |
| ارجاعات (references): #< | |
| 168u | |
| چگونه آزمونها را اجرا کنیم؟ (How to run tests?) | |
| Jedi برای اجرای آزمونهای واحد و یکپارچهسازی از pytest http://pytest.org استفاده میکند. برای اجرای آزمونها، کافی است pytest را اجرا کنید. | |
| بیشتر موارد آزمون یکپارچهسازی در پوشه test/completion قرار دارند و هر مورد آزمون با یکی از این کامنتها آغاز میشود: | |
| 0.0 | |
| • 2 | |
| #? (completions / inference) | |
| • 2 | |
| #! (goto) | |
| • 2 | |
| #< (references) | |
| 168u | |
| همچنین از کتابخانههای شخص ثالث (third-party) نیز پشتیبانی میشود. در یک اجرای عادی آزمون، آنها اجرا نمیشوند؛ برای اجرای آنها باید گزینه --thirdparty را مشخص کنید. | |
| علاوه بر گزینههای -k و -m در pytest، میتوانید از گزینه -T (--test-files`) برای تعیین این که کدام موارد آزمون باید اجرا شوند استفاده کنید. این گزینه قالب ``FILE_NAME[:LINE[,LINE[,...]]] را میپذیرد که در آن FILE_NAME فایلی در پوشه test/completion و LINE شماره خط کامنت آزمون است. در اینجا چند مثال آورده شده است: | |
| اجرای آزمونها تنها در completion/basic.py و completion/imports.py: | |
| 0.0 | |
| 3.5 | |
| pytest test/test_integration.py -T basic.py -T imports.py | |
| 168u | |
| 168u | |
| اجرای آزمون در خطوط 4، 6 و 8 در completion/basic.py: | |
| 0.0 | |
| 3.5 | |
| pytest test/test_integration.py -T basic.py:4,6,8 | |
| 168u | |
| 168u | |
| برای اطلاعات بیشتر، pytest --help را ببینید. | |
| اگر میخواهید یک آزمون را اشکالزدایی (debug) کنید، کافی است از گزینه --pdb استفاده نمایید..SS اجراکننده آزمون جایگزین (Alternate Test Runner) | |
| اگر خروجی pytest را نمیپسندید، یک اجراکننده آزمون جایگزین وجود دارد که میتوانید با اجرای ./run.py آن را آغاز کنید. مثال بالا را میتوان بدین صورت اجرا کرد: | |
| 0.0 | |
| 3.5 | |
| ./run.py basic 4 6 8 50-80 | |
| 168u | |
| 168u | |
| مزیت این اجراکننده، سادگی و گزارش خطاهای سفارشیتر است. | |
| آزمونهای تکمیل خودکار (Auto-Completion Tests) | |
| از یک کامنت برای مشخص کردن آزمون در خط بعدی استفاده میکند. این کامنت تکمیلهای مورد انتظار را مشخص میسازد. کامنت همواره با #? آغاز میشود. سطر پایانی نشاندهنده موقعیت مکاننما است. برای مثال: | |
| 0.0 | |
| 3.5 | |
| #? ['upper'] | |
| a = 'foo'; a.upp | |
| 168u | |
| 168u | |
| آزمونهای استنتاج (Inference Tests) | |
| آزمونهای استنتاج بسیار مشابه هستند. تفاوت در این است که آزمونهای استنتاج از براکت استفاده نمیکنند: | |
| 0.0 | |
| 3.5 | |
| #? int() | |
| ab = 3; ab | |
| 168u | |
| 168u | |
| آزمونهای Goto (Goto Tests) | |
| آزمونهای Goto بدین صورت هستند: | |
| 0.0 | |
| 3.5 | |
| abc = 1 | |
| #! ['abc=1'] | |
| abc | |
| 168u | |
| 168u | |
| علاوه بر این، میتوان با افزودن یک عدد که موقعیت آزمون را توصیف میکند، ستون را نیز مشخص کرد (در غیر این صورت، موقعیت در انتهای خط در نظر گرفته میشود): | |
| 0.0 | |
| 3.5 | |
| #! 2 ['abc=1'] | |
| abc | |
| 168u | |
| 168u | |
| آزمونهای مرجع (Reference Tests) | |
| آزمونها بدین صورت هستند: | |
| 0.0 | |
| 3.5 | |
| abc = 1 | |
| #< (1,0), (3,0) | |
| abc | |
| 168u | |
| 168u | |
| آزمونهای بازآفرینی کد (Refactoring Tests - refactor.py) | |
| آزمونهای بازآفرینی کد عملکردی تا حدی مشابه با آزمونهای یکپارچهسازی دارند. اما هدف در اینجا مقایسه دو نسخه از کد است. اگر میخواهید مورد آزمون جدیدی اضافه کنید، کافی است به موارد موجود در پوشه test/refactor نگاهی بیندازید و آنها را کپی کنید..SS "تاریخچه و قدردانیها (History & Acknowledgements)" | |
| "قدردانیها (Acknowledgements)" | |
| 0.0 | |
| • 2 | |
| Dave Halter برای ایجاد و نگهداری Jedi و Parso. | |
| • 2 | |
| Takafumi Arakaki (@tkf) برای ایجاد یک محیط آزمون مستحکم و بسیاری از موارد دیگر. | |
| • 2 | |
| Danilo Bargen (@dbrgn) برای رسیدگیهای عمومی و دوست خوب بودن :). | |
| • 2 | |
| Guido van Rossum (@gvanrossum) برای ایجاد مولد تجزیهکننده pgen2 | |
| (که در ابتدا در lib2to3 استفاده شد). | |
| • 2 | |
| با تشکر از همه مشارکتکنندگان. | |
| 168u | |
| "کمی درباره تاریخچه (A Little Bit of History)" | |
| نوشتهشده توسط Dave. | |
| شوالیههای Jedi در Star Wars فوقالعاده هستند. نرمافزار Jedi من تلاش میکند اندکی از قابلیت پیشآگاهی که Jediها دارند را تقلید کند. حتی یک صحنه عالی https://youtu.be/yHRJLIf7wMU از جدایهای Monty Python وجود دارد :-). | |
| اما در واقع این نام ارتباط چندانی با Star Wars ندارد. این بخشی از نام میانی من یعنی Jedidjah است. | |
| من در واقع Jedi را در سال ۲۰۱۲ آغاز کردم، چرا که هیچ راهکار مناسبی برای VIM در دسترس نبود. اکثر راهکارهای auto-completion بهخوبی کار نمیکردند. تنها راهکار خوب PyCharm بود، اما من VIM قدیمی و دوستداشتنی خود را بسیار ترجیح میدادم. همچنین راهکاری به نام Rope وجود داشت که اصلاً برای من کارایی نداشت. بنابراین تصمیم گرفتم نگارش خودم از یک موتور تکمیل خودکار را بنویسم. | |
| ایده اولیه، اجرای کدهای غیرخطرناک بود؛ اما خیلی زود متوجه شدم که این ایده کارساز نخواهد بود. بنابراین ساخت یک ابزار تحلیل ایستا (static analysis) را شروع کردم. بزرگترین مشکلی که در آن زمان داشتم این بود که هیچچیز درباره تجزیهکنندهها (parsers) نمیدانستم. من حتی عبارت تحلیل ایستا را هم نشنیده بودم. معلوم شد که آنها پایه و اساس یک ابزار تحلیل ایستای خوب هستند. البته من این را نمیدانستم و سعی کردم نگارش ضعیفی از یک تجزیهکننده را خودم بنویسم که در نهایت دو سال بعد آن را دور انداختم. | |
| به دلیل ناآگاهی من، هر کاری پس از ۲۰۱۲ و پیش از ۲۰۲۰ اساساً بازآرایی کد (refactoring) بود. احتمالاً بخشهای مرکزی Jedi را چیزی حدود ۵ تا ۱۰ بار بازنویسی کردم. آخرین بازنویسی بزرگ (که آن را دو بار انجام دادم) شامل پشتیبانی از gradual typing و stubs بود. | |
| در طول آن زمان آموختم که داشتن درک مناسبی از مسئلهتان بسیار حیاتی است؛ در غیر این صورت فقط کارتان به انجام دوباره آن میرسد. من تنها در ابتدا و در انتها قابلیتها را نوشتم؛ هر چیز دیگری رفع باگ و بازآرایی بود. با این حال، اکنون واقعاً از نتیجه خرسندم. بهخوبی کار میکند، رفع باگها میتواند سریع باشد و تقریباً از نظر قابلیتها کامل است. | |
| ---- | |
| شما را با حکایت کوتاهی که اگر درست به یاد بیاورم در سال ۲۰۱۲ رخ داد، تنها میگذارم. پس از آنکه برای Guido van Rossum توضیح دادم که بخشهایی از auto-completion من چگونه کار میکنند، او گفت: | |
| 0.0 | |
| 3.5 | |
| "اوه، این مرا نگران میکند..." | |
| 168u | |
| 168u | |
| اکنون که به پایان رسیده است، امیدوارم آن را بپسندد :-). | |
| "نویسندگان اصلی (Main Authors)" | |
| 0.0 | |
| • 2 | |
| David Halter (@davidhalter) <<davidhalter88@gmail.com>> | |
| • 2 | |
| Takafumi Arakaki (@tkf) <<aka.tkf@gmail.com>> | |
| 168u | |
| "مشارکتکنندگان در کد (Code Contributors)" | |
| 0.0 | |
| • 2 | |
| Danilo Bargen (@dbrgn) <<mail@dbrgn.ch>> | |
| • 2 | |
| Laurens Van Houtven (@lvh) <<_@lvh.cc>> | |
| • 2 | |
| Aldo Stracquadanio (@Astrac) <<aldo.strac@gmail.com>> | |
| • 2 | |
| Jean-Louis Fuchs (@ganwell) <<ganwell@fangorn.ch>> | |
| • 2 | |
| tek (@tek) | |
| • 2 | |
| Yasha Borevich (@jjay) <<j.borevich@gmail.com>> | |
| • 2 | |
| Aaron Griffin <<aaronmgriffin@gmail.com>> | |
| • 2 | |
| andviro (@andviro) | |
| • 2 | |
| Mike Gilbert (@floppym) <<floppym@gentoo.org>> | |
| • 2 | |
| Aaron Meurer (@asmeurer) <<asmeurer@gmail.com>> | |
| • 2 | |
| Lubos Trilety <<ltrilety@redhat.com>> | |
| • 2 | |
| Akinori Hattori (@hattya) <<hattya@gmail.com>> | |
| • 2 | |
| srusskih (@srusskih) | |
| • 2 | |
| Steven Silvester (@blink1073) | |
| • 2 | |
| Colin Duquesnoy (@ColinDuquesnoy) <<colin.duquesnoy@gmail.com>> | |
| • 2 | |
| Jorgen Schaefer (@jorgenschaefer) <<contact@jorgenschaefer.de>> | |
| • 2 | |
| Fredrik Bergroth (@fbergroth) | |
| • 2 | |
| Mathias Fußenegger (@mfussenegger) | |
| • 2 | |
| Syohei Yoshida (@syohex) <<syohex@gmail.com>> | |
| • 2 | |
| ppalucky (@ppalucky) | |
| • 2 | |
| immerrr (@immerrr) <immerrr@gmail.com> | |
| • 2 | |
| Albertas Agejevas (@alga) | |
| • 2 | |
| Savor d'Isavano (@KenetJervet) <<newelevenken@163.com>> | |
| • 2 | |
| Phillip Berndt (@phillipberndt) <<phillip.berndt@gmail.com>> | |
| • 2 | |
| Ian Lee (@IanLee1521) <<IanLee1521@gmail.com>> | |
| • 2 | |
| Farkhad Khatamov (@hatamov) <<comsgn@gmail.com>> | |
| • 2 | |
| Kevin Kelley (@kelleyk) <<kelleyk@kelleyk.net>> | |
| • 2 | |
| Sid Shanker (@squidarth) <<sid.p.shanker@gmail.com>> | |
| • 2 | |
| Reinoud Elhorst (@reinhrst) | |
| • 2 | |
| Guido van Rossum (@gvanrossum) <<guido@python.org>> | |
| • 2 | |
| Dmytro Sadovnychyi (@sadovnychyi) <<jedi@dmit.ro>> | |
| • 2 | |
| Cristi Burcă (@scribu) | |
| • 2 | |
| bstaint (@bstaint) | |
| • 2 | |
| Mathias Rav (@Mortal) <<rav@cs.au.dk>> | |
| • 2 | |
| Daniel Fiterman (@dfit99) <<fitermandaniel2@gmail.com>> | |
| • 2 | |
| Simon Ruggier (@sruggier) | |
| • 2 | |
| Élie Gouzien (@ElieGouzien) | |
| • 2 | |
| Robin Roth (@robinro) | |
| • 2 | |
| Malte Plath (@langsamer) | |
| • 2 | |
| Anton Zub (@zabulazza) | |
| • 2 | |
| Maksim Novikov (@m-novikov) <<mnovikov.work@gmail.com>> | |
| • 2 | |
| Tobias Rzepka (@TobiasRzepka) | |
| • 2 | |
| micbou (@micbou) | |
| • 2 | |
| Dima Gerasimov (@karlicoss) <<karlicoss@gmail.com>> | |
| • 2 | |
| Max Woerner Chase (@mwchase) <<max.chase@gmail.com>> | |
| • 2 | |
| Johannes Maria Frank (@jmfrank63) <<jmfrank63@gmail.com>> | |
| • 2 | |
| Shane Steinert-Threlkeld (@shanest) <<ssshanest@gmail.com>> | |
| • 2 | |
| Tim Gates (@timgates42) <<tim.gates@iress.com>> | |
| • 2 | |
| Lior Goldberg (@goldberglior) | |
| • 2 | |
| Ryan Clary (@mrclary) | |
| • 2 | |
| Max Mäusezahl (@mmaeusezahl) <<maxmaeusezahl@googlemail.com>> | |
| • 2 | |
| Vladislav Serebrennikov (@endilll).IP • 2 | |
| Andrii Kolomoiets (@muffinmad) | |
| • 2 | |
| Leo Ryu (@Leo-Ryu) | |
| • 2 | |
| Joseph Birkner (@josephbirkner) | |
| • 2 | |
| Márcio Mazza (@marciomazza) | |
| • 2 | |
| Martin Vielsmaier (@moser) <<martin@vielsmaier.net>> | |
| • 2 | |
| TingJia Wu (@WutingjiaX) <<wutingjia@bytedance.com>> | |
| • 2 | |
| Nguyễn Hồng Quân <<ng.hong.quan@gmail.com>> | |
| 168u | |
| و چند مشارکتکنندهٔ "ناشناس" دیگر. | |
| نکته: (@user) بیانگر نام کاربری GitHub است. | |
| تغییرات (Changelog) | |
| منتشرنشده (Unreleased) | |
| 0.20.0 (2026-05-02) | |
| 0.0 | |
| • 2 | |
| پشتیبانی از Python 3.14 | |
| • 2 | |
| حذف پشتیبانی از Python 3.8 و 3.9 | |
| • 2 | |
| ارتقای Typeshed | |
| • 2 | |
| پشتیبانی بهتر از Final/ClassVar | |
| • 2 | |
| اکنون __new__ نیز به عنوان یک امضا (signature) و استنتاج TypeVar شناخته میشود | |
| • 2 | |
| پشتیبانی از Self | |
| • 2 | |
| پشتیبانی از TypeAlias، جنریکها برای type[...] و tuple[...] | |
| 168u | |
| 0.19.2 (2024-11-10) | |
| 0.0 | |
| • 2 | |
| پشتیبانی از Python 3.13 | |
| 168u | |
| 0.19.1 (2023-10-02) | |
| 0.0 | |
| • 2 | |
| پشتیبانی از Python 3.12 (با تشکر از Peter!) | |
| 168u | |
| 0.19.0 (2023-07-29) | |
| 0.0 | |
| • 2 | |
| پشتیبانی از Python 3.11 | |
| • 2 | |
| بهبودهای چشمگیر در کارایی برای کاربران Interpreter (مانند IPython). | |
| این تغییر بهویژه بر کاربران pandas با مجموعهدادههای بزرگ تأثیر میگذارد. | |
| • 2 | |
| افزودن jedi.settings.allow_unsafe_interpreter_executions جهت تسهیل | |
| جلوگیری از اجراهای ناامن برای کاربران IPython. | |
| 168u | |
| 0.18.2 (2022-11-21) | |
| 0.0 | |
| • 2 | |
| افزودن معادل dataclass برای attrs.define | |
| • 2 | |
| یافتن fixtureها از نقاط ورود (entrypoints) متعلق به Pytest؛ نمونههایی از افزونههای pytest که | |
| به این شیوه نصب میشوند عبارتند از pytest-django، pytest-sugar و Faker. | |
| • 2 | |
| رفع باگ Project.search در مواردی که venv دخیل بود؛ مشکلی که برای مثال | |
| باعث میشد :Pyimport django.db در برخی موارد در jedi-vim کار نکند. | |
| • 2 | |
| و رفع چندین باگ کوچکتر | |
| 168u | |
| 0.18.1 (2021-11-17) | |
| 0.0 | |
| • 2 | |
| فضاهای نام ضمنی (Implicit namespaces) اکنون انواع مجزایی در Name().type هستند | |
| • 2 | |
| پشتیبانی از Python 3.10 | |
| • 2 | |
| عمدتاً رفع باگها | |
| 0.0 | |
| • 2 | |
| حذف پشتیبانی از Python 2 و Python 3.5 | |
| • 2 | |
| استفاده از pathlib.Path() به عنوان خروجی به جای str در اکثر موارد: | |
| - Project.path | |
| - Script.path | |
| - Definition.module_path | |
| - Refactoring.get_renames | |
| - Refactoring.get_changed_files | |
| • 2 | |
| توابع دارای @property اکنون در Name().type به جای function، مقدار property را برمیگردانند | |
| • 2 | |
| آغاز استفاده از حاشیهنویسیها (annotations) | |
| • 2 | |
| پشتیبانی بهتر از عملگر والروس (walrus operator) | |
| • 2 | |
| صفتهای شیء Project اکنون دسترسی خواندن دارند | |
| • 2 | |
| حذف تمامی موارد منسوخشده | |
| 168u | |
| به احتمال زیاد این آخرین انتشار فرعی پیش از نسخه 1.0 خواهد بود. | |
| 0.17.2 (2020-07-17) | |
| 0.0 | |
| • 2 | |
| افزودن گزینهای برای ارسال متغیرهای محیطی به Environment | |
| • 2 | |
| اکنون Project(...).path در دسترس است | |
| • 2 | |
| پشتیبانی از Python 3.9 | |
| • 2 | |
| چندین رفع باگ | |
| 168u | |
| این آخرین انتشاری خواهد بود که از Python 2 و Python 3.5 پشتیبانی میکند. | |
| نسخه 0.18.0 نیازمند Python 3.6+ خواهد بود. | |
| 0.17.1 (2020-06-20) | |
| 0.0 | |
| • 2 | |
| پشتیبانی از فراکلاس (meta class) در Model مربوط به Django | |
| • 2 | |
| پشتیبانی از Django Manager (تکمیل خودکار روی Managers/QuerySets) | |
| • 2 | |
| افزودن Django Stubs به Jedi، با تشکر از تمامی مشارکتکنندگان پروژه | |
| Django Stubs https://github.com/typeddjango/django-stubs | |
| • 2 | |
| افزودن SyntaxError.get_message | |
| • 2 | |
| پشتیبانی از Python 3.9 | |
| • 2 | |
| رفع باگها (عمدتاً مرتبط با Generics) | |
| 168u | |
| 0.17.0 (2020-04-14) | |
| 0.0 | |
| • 2 | |
| افزودن پشتیبانی از Project. این قابلیت به کاربر امکان میدهد مشخص کند Jedi باید با چه پوشههایی کار کند. | |
| • 2 | |
| افزودن پشتیبانی از بازآرایی (Refactoring). بازآراییهای زیر پیادهسازی شدهاند: | |
| Script.rename، Script.inline، | |
| Script.extract_variable و Script.extract_function. | |
| • 2 | |
| افزودن Script.get_syntax_errors برای نمایش خطاهای نحوی در اسکریپت فعلی. | |
| • 2 | |
| افزودن قابلیتهای جستجوی کد هم برای فایلهای جداگانه و هم پروژهها. توابع جدید عبارتند از: | |
| Project.search، Project.complete_search، | |
| Script.search و Script.complete_search. | |
| • 2 | |
| افزودن Script.help برای تسهیل نمایش پنجره راهنما به کاربران. | |
| اکنون اطلاعات pydoc نیز برای کلیدواژهها/عملگرهای Python برگردانده میشود. این بدان معناست که روی کلیدواژه class اکنون رشته مستندات (docstring) تابع توکار help('class') در Python برگردانده میشود. | |
| • 2 | |
| مستندات API اکنون بسیار خواناتر و کاملتر شده است. آن را در | |
| https://jedi.readthedocs.io بررسی کنید. بخش زیادی از آن بازنویسی شده است. | |
| • 2 | |
| حذف پشتیبانی از Python 3.4 | |
| • 2 | |
| رفع باگهای متعدد | |
| 168u | |
| به احتمال زیاد این آخرین نسخه فرعی خواهد بود که از Python 2 و Python 3.5 پشتیبانی میکند. رفع باگها در 0.17.1+ ارائه خواهند شد. نسخه فرعی/اصلی بعدی احتمالاً Jedi 1.0.0 خواهد بود..SS 0.16.0 (2020-01-26) | |
| 0.0 | |
| • 2 | |
| افزوده شدن Script.get_context برای دریافت اطلاعات درباره مکانی که هماکنون در آن قرار دارید. | |
| • 2 | |
| تکمیل خودکار و استنتاج نوع (type inference) برای Pytest fixtures. | |
| • 2 | |
| تکمیلهای خودکار Tensorflow، Numpy و Pandas اکنون پس از نخستین بار استفاده، باید حدود ۴-۱۰ برابر سریعتر | |
| باشند. | |
| • 2 | |
| تکمیل خودکار کلیدهای دیکشنری اکنون کار میکند؛ برای مثال d = {1000: 3}; d[10 به | |
| 1000 گسترش مییابد. | |
| • 2 | |
| تکمیل خودکار برای "proxies" اکنون کار میکند. اینها کلاسهایی هستند که متد | |
| __getattr__(self, name) دارند که پس از بارگذاری اولیهشان، یک return getattr(x, name) انجام میدهد. | |
| • 2 | |
| دستور Goto روی یک تابع/مشخصه (attribute) در یک کلاس، اکنون به تعریف آن در | |
| ابرکلاس (super class) مربوطه میرود. | |
| • 2 | |
| 2.0 | |
| تغییرات بزرگ در Script API: | |
| 7.0 | |
| • 2 | |
| پارامترهای line و column در jedi.Script اکنون منسوخ شدهاند | |
| • 2 | |
| متد completions منسوخ شده است، بهجای آن از complete استفاده کنید | |
| • 2 | |
| متد goto_assignments منسوخ شده است، بهجای آن از goto استفاده کنید | |
| • 2 | |
| متد goto_definitions منسوخ شده است، بهجای آن از infer استفاده کنید | |
| • 2 | |
| متد call_signatures منسوخ شده است، بهجای آن از get_signatures استفاده کنید | |
| • 2 | |
| متد usages منسوخ شده است، بهجای آن از get_references استفاده کنید | |
| • 2 | |
| تابع jedi.names منسوخ شده است، از jedi.Script(...).get_names() استفاده کنید | |
| 168u | |
| 168u | |
| • 2 | |
| نام BaseName.goto_assignments به BaseName.goto تغییر یافت | |
| • 2 | |
| افزوده شدن follow_imports به Name.goto. اکنون امضای آن با | |
| Script.goto مطابقت دارد. | |
| • 2 | |
| پشتیبانی از Python 2 منسوخ شد. برای این نسخه، پشتیبانی در حد نهایت تلاش (best effort) است. دوره حیات Python 2 | |
| به پایان رسیده و اکنون تنها یک گذار روان مد نظر است. | |
| اشکالات مربوط به Python 2 دیگر رفع نخواهند شد و در حال حاضر یکسوم آزمونها | |
| نادیده گرفته میشوند. | |
| • 2 | |
| گزینه settings.no_completion_duplicates حذف شد. این گزینه آزمایش نشده بود و احتمالاً | |
| در هر صورت کسی از آن استفاده نمیکرد. | |
| • 2 | |
| گزینههای settings.use_filesystem_cache و | |
| settings.additional_dynamic_modules حذف شدند؛ آنها دیگر هیچ کاربردی ندارند. | |
| احتمالاً تقریباً هیچکس از آنها استفاده نمیکرد. | |
| 168u | |
| 0.15.2 (2019-12-20) | |
| 0.0 | |
| • 2 | |
| امضاها اکنون بسیار بهتر تشخیص داده میشوند | |
| • 2 | |
| افزودن تکمیل مبهم (fuzzy) با Script(...).completions(fuzzy=True) | |
| • 2 | |
| فایلهای بزرگتر از یک مگابایت (حدود ۲۰ هزار خط کد) برای جلوگیری از گیر کردن | |
| کامل، بریده (crop) میشوند. | |
| • 2 | |
| رفع اشکالات جزئی بسیار | |
| • 2 | |
| یک بازطراحی ساختاری (refactoring) بزرگ پیرامون contexts/values | |
| 168u | |
| 0.15.1 (2019-08-13) | |
| 0.0 | |
| • 2 | |
| رفع اشکال جزئی و حذف یک دستور print | |
| 168u | |
| 0.15.0 (2019-08-11) | |
| 0.0 | |
| • 2 | |
| افزوده شدن تکمیل مسیر فایل، اکنون یک نوع جدید در Completion.type وجود دارد: | |
| path. مثال: '/ho -> '/home/ | |
| • 2 | |
| تفکیک و حل *args/**kwargs. در صورت امکان، Jedi پارامترها را | |
| با گزینههای واقعی جایگزین میکند. | |
| • 2 | |
| پشتیبانی بهتر از enums/dataclasses | |
| • 2 | |
| هنگام استفاده از Interpreter، ویژگیها (properties) اکنون اجرا میشوند، زیرا افراد زیادی | |
| در این باره شکایت کرده بودند. بحث در #1299، #1347. | |
| 168u | |
| APIهای جدید: | |
| 0.0 | |
| • 2 | |
| Name.get_signatures() -> List[Signature]. امضاها شبیه به | |
| CallSignature هستند. بنابراین Name.params منسوخ شده است. | |
| • 2 | |
| Signature.to_string() برای قالببندی امضاها. | |
| • 2 | |
| Signature.params -> List[ParamName]؛ شیء ParamName دارای | |
| مشخصههای اضافی زیر است: infer_default()، infer_annotation()، | |
| to_string() و kind. | |
| • 2 | |
| Name.execute() -> List[Name]؛ استنتاج مقادیر بازگشتی | |
| توابع را ممکن میسازد. | |
| 0.0 | |
| • 2 | |
| اکنون CallSignature.index باید بسیار بهتر کار کند | |
| • 2 | |
| چندین رفع باگ کوچکتر | |
| 168u | |
| 0.14.0 (2019-06-20) | |
| 0.0 | |
| • 2 | |
| افزوده شدن goto_*(prefer_stubs=True) و همچنین goto_*(prefer_stubs=True) | |
| • 2 | |
| اکنون از stubها برای استنتاج نوع (type inference) استفاده میشود | |
| • 2 | |
| استفاده از Typeshed برای استنتاج نوع بهتر | |
| • 2 | |
| بازنویسی Name.full_name؛ اکنون باید مقادیر بازگشتی دقیقتری داشته باشد | |
| 168u | |
| 0.13.3 (2019-02-24) | |
| 0.0 | |
| • 2 | |
| رفع مشکل در Python تعبیهشده (embedded)، ببینید https://github.com/davidhalter/jedi-vim/issues/870 | |
| 168u | |
| 0.13.2 (2018-12-15) | |
| 0.0 | |
| • 2 | |
| رفع باگی که منجر به ایجاد تعداد زیادی زیرپردازش (subprocess) توسط Jedi میشد. | |
| 168u | |
| 0.13.1 (2018-10-02) | |
| 0.0 | |
| • 2 | |
| رفع باگها، زیرا تکمیل خودکار tensorflow همچنان کند بود. | |
| 168u | |
| 0.13.0 (2018-10-02) | |
| 0.0 | |
| • 2 | |
| یک انتشار کوچک. چند مورد رفع باگ. | |
| • 2 | |
| حذف پشتیبانی از Python 3.3. پشتیبانی از Python 3.3 توسط بنیاد پایتون متوقف شده است. | |
| • 2 | |
| محیطهای پیشفرض اکنون از همان نسخه Python فرایند Python استفاده میکنند. در 0.12.x، آخرین نسخه Python موجود در سیستم بارگذاری میشد. | |
| • 2 | |
| افزودن include_builtins به عنوان یک پارامتر به usages. | |
| • 2 | |
| تابع goto_assignments دارای پارامتر جدید follow_builtin_imports است که رفتار قبلی را کمی تغییر میدهد. | |
| 168u | |
| 0.12.1 (2018-06-30) | |
| 0.0 | |
| • 2 | |
| این انتشار شما را ملزم به ارتقای parso میکند. اگر این کار را انجام ندهید، هیچ چیز کار نخواهد کرد. در غیر این صورت تغییرات باید به رفع باگها محدود باشد. متأسفانه Jedi هنوز از برخی بخشهای داخلی parso استفاده میکند که حفظ سازگاری در چند نسخه مختلف را دشوار میسازد. به parso >=0.3.0 نیاز خواهد بود. | |
| 168u | |
| 0.12.0 (2018-04-15) | |
| 0.0 | |
| • 2 | |
| پشتیبانی از Virtualenv/Environment | |
| • 2 | |
| پشتیبانی از تکمیل خودکار/Goto برای F-String | |
| • 2 | |
| دیگر با خطای segfault دچار فروپاشی (crash) نمیشود | |
| • 2 | |
| پاکسازی منطق import | |
| • 2 | |
| درک async/await و تکمیل خودکار آن (شامل مولدهای ناهمگام یا async generators) | |
| • 2 | |
| تکمیل خودکار بهتر فضای نام (namespace) | |
| • 2 | |
| موفقیت در آزمونهای Windows (شامل CI برای Windows) | |
| • 2 | |
| حذف پشتیبانی از Python 2.6 | |
| 168u | |
| 0.11.1 (2017-12-14) | |
| 0.0 | |
| • 2 | |
| بهروزرسانی parso - لایه حافظه پنهان (caching) با مشکل مواجه شده بود | |
| • 2 | |
| بهبود usages - بخش زیادی از کدهای داخلی بازطراحی و ارتقا یافتند. | |
| 0.0 | |
| • 2 | |
| تفکیک تجزیهگر Jedi به پروژهای مجزا به نام parso. | |
| • 2 | |
| جلوگیری از اثرات جانبی در تکمیل خودکار در REPL. | |
| • 2 | |
| پشتیبانی از docstringهای Numpy باید بسیار بهتر شده باشد. | |
| • 2 | |
| تنظیمات settings.*recursion* کنار گذاشته شدند؛ آنها دیگر قابل استفاده نیستند. | |
| 168u | |
| 0.10.2 (2017-04-05) | |
| 0.0 | |
| • 2 | |
| بستهبندی پایتون (Python Packaging) افتضاح است. برخی از فایلها در نسخه 0.10.1 گنجانده نشده بودند. | |
| 168u | |
| 0.10.1 (2017-04-05) | |
| 0.0 | |
| • 2 | |
| رفع چند باگ بسیار آزاردهنده. | |
| • 2 | |
| آمادهسازی تجزیهگر برای جداسازی و تفکیک از Jedi. | |
| 168u | |
| 0.10.0 (2017-02-03) | |
| 0.0 | |
| • 2 | |
| تکمیل معنایی واقعی برای کل نحو پایتون. | |
| • 2 | |
| استنتاج نوع (type inference) پایهای برای yield from طبق PEP 380. | |
| • 2 | |
| پشتیبانی از PEP 484 (بیشتر ویژگیهای مهم آن). با تشکر از Claude! (@reinhrst) | |
| • 2 | |
| افزودن get_line_code به شیءهای Name و Completion. | |
| • 2 | |
| بازنویسی کامل موتور استنتاج نوع. | |
| • 2 | |
| یک تجزیهگر جدید و بهتر برای تجزیه (سریع) diffهای کدهای پایتون. | |
| 168u | |
| 0.9.0 (2015-04-10) | |
| 0.0 | |
| • 2 | |
| منطق واردسازی (import) بازنویسی شد تا شباهت بیشتری به پایتون داشته باشد. اکنون یک حافظه موقت واردسازی InferState.modules وجود دارد که شبیه به sys.modules عمل میکند. | |
| • 2 | |
| ادغام تجزیهگر 2to3. این کار بازسازی کد (refactoring) را ممکن میسازد. همچنین در آینده امکان بررسی پیامهای خطا (مشابه آنچه کامپایل یک AST ایجاد میکند) فراهم خواهد شد. | |
| • 2 | |
| با تجزیهگر جدید، استنتاج نوع نیز کاملاً تغییر کرده است. اکنون سادهتر و خواناتر است. | |
| • 2 | |
| بازنویسی کامل تکمیل خودکار REPL. | |
| • 2 | |
| افزوده شدن jedi.names، دستوری برای انجام تحلیل ایستا (static analysis). با تشکر از بچههای sourcegraph برای حمایت مالی از این کار! | |
| • 2 | |
| نسخه آلفای بررسیکننده کد (linter). | |
| 168u | |
| 0.8.1 (2014-07-23) | |
| 0.0 | |
| • 2 | |
| انتشار رفع باگ؛ در انتشار قبلی، اضافه کردن فایلهایی که تکمیل خودکار برای کتابخانههای داخلی (builtins) را بهبود میبخشیدند فراموش شده بود. برطرف شد. | |
| 168u | |
| 0.8.0 (2014-05-05) | |
| 0.0 | |
| • 2 | |
| مصرف حافظه برای ماژولهای کامپایلشده (مانند builtins، sys) به شدت کاهش یافته است. زمانهای بارگذاری نیز کاهش یافتهاند (اساساً به همان اندازه یک import زمان میبرد). | |
| • 2 | |
| تکمیل خودکار در REPL در حال رسیدن به وضعیتی قابل استفاده است. | |
| • 2 | |
| تغییرات جزئی گوناگون در API. بهطور کلی این انتشار بر پایداری و بازسازی ساختار APIهای داخلی تمرکز دارد. | |
| • 2 | |
| معرفی اولویت عملگرها (operator precedence)، که محاسبه صحیح اندیسهای Array و رشتههای __getattr__ را امکانپذیر میسازد. | |
| 168u | |
| 0.7.0 (2013-08-09) | |
| 0.0 | |
| • 2 | |
| تغییر مجوز از LGPL به MIT. | |
| • 2 | |
| افزودن کلاس Interpreter به API برای امکانپذیر ساختن تکمیل خودکار در REPL. | |
| • 2 | |
| افزودن پشتیبانی تکمیل خودکار برای بستههای فضای نام (namespace packages). | |
| • 2 | |
| افزودن sith.py، روشی نوین برای آزمون تصادفی. | |
| 0.0 | |
| • 2 | |
| تجزیهکننده بسیار سریعتر همراه با کشسازی توکار بخشها. | |
| • 2 | |
| مجموعه آزمون، با تشکر از @tkf. | |
| 168u | |
| "نسخههای 0.5 (2012)" | |
| 0.0 | |
| • 2 | |
| توسعه اولیه. | |
| 168u | |
| "منابع (RESOURCES)" | |
| اگر میخواهید از انتشارها بهروز بمانید، لطفاً در این | |
| فهرست پستی عضو شوید: https://groups.google.com/g/jedi-announce. برای عضویت میتوانید | |
| بهسادگی یک ایمیل خالی به jedi-announce+subscribe@googlegroups.com ارسال کنید. | |
| 0.0 | |
| • 2 | |
| کد منبع در Github https://github.com/davidhalter/jedi | |
| • 2 | |
| Python Package Index https://pypi.python.org/pypi/jedi | |
| 168u | |
| "نویسندگان (AUTHORS)" | |
| مشارکتکنندگان Jedi | |
| "کپیرایت و تکثیر (COPYRIGHT)" | |
| مشارکتکنندگان jedi |
| September 4, 2026 | 0.20.0 |