'\" t .\" Man page generated from reStructuredText .\" by the Docutils 0.23 manpage writer. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "JEDI" "1" "Sep 04, 2026" "0.20.0" "Jedi" .SH "نام (NAME)" jedi \- مستندات Jedi، ابزار تحلیل ایستا و تکمیل خودکار برای پایتون [تصویر: ستاره‌های GitHub] [تصویر] \%[تصویر: درصد ایشوها و پول‌ریکوئست‌های باز] [تصویر] \%[تصویر: زمان حل، میانگین زمانی است که یک ایشو یا پول‌ریکوئست باز می‌ماند.] [تصویر] \%[تصویر: آزمون‌ها] [تصویر] \%[تصویر: وضعیت پوشش کد] [تصویر] \%[تصویر: تعداد دانلود‌های PyPI] [تصویر] \% .sp مخزن گیت‌هاب: \% .sp ابزار Jedi یک ابزار تحلیل ایستا برای Python است که معمولاً در افزونه‌های IDEها و ویرایشگرها به کار می‌رود. تمرکز اصلی Jedi بر روی تکمیل خودکار (autocompletion) و قابلیت رفتن به تعریف (goto) است. ویژگی‌های دیگر شامل بازسازی کد (refactoring)، جستجوی کد و یافتن ارجاعات است. .sp ابزار Jedi دارای یک API ساده برای استفاده است. یک پیاده‌سازی مرجع به‌صورت افزونه برای VIM در \%\& وجود دارد. همچنین امکان تکمیل خودکار در REPL شما نیز فراهم است؛ IPython به‌صورت بومی از آن استفاده می‌کند و برای CPython REPL نیز می‌توانید آن را نصب کنید. ابزار Jedi به‌خوبی آزموده شده است و وجود باگ در آن باید بسیار نادر باشد. .sp در اینجا یک مثال ساده از قابلیت تکمیل خودکار آورده شده است: .sp .EX >>> import jedi >>> source = \(aq\(aq\(aq \&... import json \&... json.lo\(aq\(aq\(aq >>> script = jedi.Script(source, path=\(aqexample.py\(aq) >>> script >>> completions = script.complete(3, len(\(aqjson.lo\(aq)) >>> completions [, ] >>> print(completions[0].complete) ad >>> print(completions[0].name) load .EE .sp برای نمونه، قابلیت تکمیل خودکار در jedi\-vim می‌تواند به این شکل باشد: .INDENT 0.0 .INDENT 2.5 [تصویر] .UNINDENT .UNINDENT.SH "مستندات (DOCS)" .SS "استفاده از Jedi" .sp می‌توان از Jedi به همراه انواع افزونه‌ها، سرورهای زبان و نرم‌افزارهای دیگر استفاده کرد. همچنین استفاده از Jedi در شل Python یا به همراه IPython امکان‌پذیر است\&. .sp در ادامه همچنین می‌توانید فهرستی از دستورالعمل‌ها را برای راهنمایی نوع (type hinting) بیابید\&. .SS "سرورهای زبان (Language Servers)" .INDENT 0.0 .IP \(bu 2 jedi\-language\-server \% .IP \(bu 2 python\-language\-server \% (در حال حاضر نگهداری نمی‌شود) .IP \(bu 2 python\-lsp\-server \% (انشعاب از python\-language\-server) .IP \(bu 2 anakin\-language\-server \% .UNINDENT .SS "افزونه‌های ویرایشگر (Editor Plugins)" .SS Vim .INDENT 0.0 .IP \(bu 2 jedi\-vim \% .IP \(bu 2 YouCompleteMe \% .IP \(bu 2 deoplete\-jedi \% .UNINDENT .SS Visual Studio Code .INDENT 0.0 .IP \(bu 2 Python Extension \% .UNINDENT .SS Emacs .INDENT 0.0 .IP \(bu 2 Jedi.el \% .IP \(bu 2 elpy \% .IP \(bu 2 anaconda\-mode \% .UNINDENT .SS Sublime Text 2/3 .INDENT 0.0 .IP \(bu 2 SublimeJEDI \% (ST2 و ST3) .IP \(bu 2 anaconda \% (فقط ST3) .UNINDENT .SS SynWrite .INDENT 0.0 .IP \(bu 2 SynJedi \% .UNINDENT .SS TextMate .INDENT 0.0 .IP \(bu 2 Textmate \% (مشخص نیست که آیا واقعاً کار می‌کند یا خیر) .UNINDENT .SS Kate .INDENT 0.0 .IP \(bu 2 Kate \% در نسخهٔ 4.13+ به‌صورت بومی از آن پشتیبانی می‌کند \%، اگرچه باید آن را فعال کنید. .UNINDENT .SS Atom .INDENT 0.0 .IP \(bu 2 autocomplete\-python\-jedi \% .UNINDENT .SS GNOME Builder .INDENT 0.0 .IP \(bu 2 GNOME Builder \% به‌صورت بومی از آن پشتیبانی می‌کند \%، و به‌طور پیش‌فرض فعال است. .UNINDENT .SS Gedit .INDENT 0.0 .IP \(bu 2 gedi \% .UNINDENT.SS "محیط توسعه Eric (Eric IDE)" .INDENT 0.0 .IP \(bu 2 Eric IDE \% .UNINDENT .SS "اشکال‌زدای وب (Web Debugger)" .INDENT 0.0 .IP \(bu 2 wdb \% .UNINDENT .SS "پوسته xonsh (xonsh shell)" .sp Jedi یک افزونهٔ از پیش نصب‌شده در پوستهٔ xonsh است \%\&. برای فعال‌سازی دستور زیر را اجرا کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX xontrib load jedi .EE .UNINDENT .UNINDENT .sp و موارد بسیار دیگر! .SS "تکمیل با کلید Tab در پوسته پایتون (Tab Completion in the Python Shell)" .sp Jedi یکی از وابستگی‌های IPython است؛ بنابراین تکمیل خودکار در IPython بدون نیاز به پیکربندی اضافه امکان‌پذیر است. .sp در اینجا یک ویدیوی نمونه \% وجود دارد که نشان می‌دهد تکمیل خودکار REPL در یک پوستهٔ دیگر چگونه خواهد بود. .sp دو روش مختلف برای استفاده از تکمیل خودکار Jedi در مفسر \fBpython\fP شما وجود دارد: یکی با فایل سفارشی \fB$HOME/.pythonrc.py\fP شما، و دیگری با استفاده از \fBPYTHONSTARTUP\fP\&. .SS "استفاده از \fBPYTHONSTARTUP\fP" .sp برای استفاده از تکمیل خودکار Jedi در مفسر پایتون، عبارت زیر را به پیکربندی پوستهٔ خود (مانند \fB\&.bashrc\fP) اضافه کنید. این روش تنها در Linux/Mac کار می‌کند، چرا که readline روی Windows در دسترس نیست. اگر با این وجود خواهان تکمیل خودکار Jedi در REPL خود هستید، به جای آن از IPython استفاده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX export PYTHONSTARTUP=\(dq$(python \-m jedi repl)\(dq .EE .UNINDENT .UNINDENT .sp سپس قادر خواهید بود از تکمیل‌کنندهٔ Jedi در مفسر پایتون خود استفاده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX $ python Python 3.14.0+ (default, Jul 20 2020, 22:15:08) [GCC 4.6.1] on linux2 Type \(dqhelp\(dq, \(dqcopyright\(dq, \(dqcredits\(dq or \(dqlicense\(dq for more information. >>> import os >>> os.path.join(\(aqa\(aq, \(aqb\(aq).split().in # doctest: +SKIP \&..dex ..sert .EE .UNINDENT .UNINDENT .SS "استفاده از یک \fB$HOME/.pythonrc.py\fP سفارشی" .INDENT 0.0 .TP .B jedi.utils.setup_readline(namespace_module=, fuzzy=False) این تابع \fBreadline\fP \% را برای استفاده از Jedi در یک پوستهٔ تعاملی پایتون پیکربندی می‌کند. .sp اگر می‌خواهید از یک فایل سفارشی \fBPYTHONSTARTUP\fP (معمولاً \fB$HOME/.pythonrc.py\fP) استفاده کنید، می‌توانید این قطعه کد را اضافه کنید: .INDENT 7.0 .INDENT 3.5 .sp .EX 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(\(dqJedi is not installed, falling back to readline\(dq) try: import readline import rlcompleter readline.parse_and_bind(\(dqtab: complete\(dq) except ImportError: print(\(dqReadline is not installed either. No tab completion is enabled.\(dq) else: setup_readline() .EE .UNINDENT .UNINDENT .sp این کار در صورت نصب نبودن Jedi، به تکمیل‌کنندهٔ readline بازمی‌گردد. تکمیل‌کنندهٔ readline تنها نام‌های موجود در فضای نام سراسری (global namespace) را کامل می‌کند؛ بنابراین برای نمونه: .INDENT 7.0 .INDENT 3.5 .sp .EX ran .EE .UNINDENT .UNINDENT .sp به \fBrange\fP تکمیل خواهد شد\&. .sp با Jedi کد زیر: .INDENT 7.0 .INDENT 3.5 .sp .EX range(10).cou .EE .UNINDENT .UNINDENT .sp به \fBrange(10).count\fP تکمیل خواهد شد؛ این مورد در تکمیل‌کنندهٔ پیش‌فرض \fBreadline\fP \% در cPython کار نمی‌کند. .sp همچنین باید عبارت \fBexport PYTHONSTARTUP=$HOME/.pythonrc.py\fP را به پروفایل پوستهٔ خود (معمولاً در صورت استفاده از bash، فایل \fB\&.bash_profile\fP یا \fB\&.profile\fP) اضافه کنید. .UNINDENT.SS "دستورالعمل‌ها (Recipes)" .sp در اینجا نکاتی برای استفادهٔ بهینه و کارآمد از Jedi آورده شده است. .SS "تعیین نوع (Type Hinting)" .sp اگر Jedi به دلیل ماهیت پویای Python نتواند نوع یک آرگومان تابع را به درستی تشخیص دهد، می‌توانید با مشخص کردن نوع آن با استفاده از یکی از سبک‌های docstring یا حاشیه‌نویسی (annotation) زیر به آن کمک کنید. \fBتنها نوع‌دهی تدریجی (gradual typing) همیشه کار خواهد کرد\fP؛ تمام راهکارهای مبتنی بر docstring ترفندهایی بزک‌شده هستند و در موارد پیچیده‌تر احتمالاً کار نخواهند کرد. .SS "نوع‌دهی تدریجی رسمی [پیشنهادی] (Official Gradual Typing)" .sp می‌توانید مطالب زیادی دربارهٔ سیستم نوع‌دهی تدریجی Python در PEPهای مربوطه بخوانید، مانند: .INDENT 0.0 .IP \(bu 2 PEP 484 \% به عنوان مقدمه .IP \(bu 2 PEP 526 \% برای حاشیه‌نویسی متغیرها .IP \(bu 2 PEP 589 \% برای \fBTypeDict\fP .IP \(bu 2 احتمالاً موارد بیشتری نیز وجود دارد :) .UNINDENT .sp در ادامه چند مثال از نحوهٔ استفاده از این قابلیت آورده شده است. .sp حاشیه‌نویسی توابع (Function annotations): .INDENT 0.0 .INDENT 3.5 .sp .EX def myfunction(node: ProgramNode, foo: str) \-> None: \(dq\(dq\(dqDo something with a \(ga\(ganode\(ga\(ga. \(dq\(dq\(dq node.| # complete here .EE .UNINDENT .UNINDENT .sp تعیین نوع در انتساب، حلقه‌های for و دستورات with: .INDENT 0.0 .INDENT 3.5 .sp .EX 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) .EE .UNINDENT .UNINDENT .sp استاندارد PEP\-0484 باید به طور کامل پشتیبانی شود. در صورتی که این‌گونه نبود، با خیال راحت یک issue باز کنید. همچنین می‌توانید از فایل‌های stub استفاده کنید. .SS "سبک Sphinx (Sphinx style)" .sp \% .INDENT 0.0 .INDENT 3.5 .sp .EX def myfunction(node, foo): \(dq\(dq\(dq Do something with a \(ga\(ganode\(ga\(ga. :type node: ProgramNode :param str foo: foo parameter description \(dq\(dq\(dq node.| # complete here .EE .UNINDENT .UNINDENT.SS Epydoc .sp \% .INDENT 0.0 .INDENT 3.5 .sp .EX def myfunction(node): \(dq\(dq\(dq Do something with a \(ga\(ganode\(ga\(ga. @type node: ProgramNode \(dq\(dq\(dq node.| # complete here .EE .UNINDENT .UNINDENT .SS Numpydoc .sp \% .sp برای پشتیبانی از قالب numpydoc، باید بستهٔ numpydoc \% را نصب کنید. .INDENT 0.0 .INDENT 3.5 .sp .EX def foo(var1, var2, long_var_name=\(aqhi\(aq): r\(dq\(dq\(dq 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 \(gavar1\(ga. var2 : int The type above can either refer to an actual Python type (e.g. \(ga\(gaint\(ga\(ga), or describe the type of the variable in more detail, e.g. \(ga\(ga(N,) ndarray\(ga\(ga or \(ga\(gaarray_like\(ga\(ga. long_variable_name : {\(aqhi\(aq, \(aqho\(aq}, optional Choices in brackets, default first when optional. ... \(dq\(dq\(dq var2.| # complete here .EE .UNINDENT .UNINDENT .SS ویژگی‌ها و محدودیت‌ها .sp فراخوانی‌های اصلی API و قابلیت‌های Jedi عبارت‌اند از: .INDENT 0.0 .IP \(bu 2 تکمیل خودکار: \fBScript.complete()\fP \%<#\:jedi\:.Script\:.complete>؛ همچنین راه‌اندازی و استفاده از آن در REPL شما (مانند IPython و غیره) امکان‌پذیر است \%<#\:repl-completion> .IP \(bu 2 پرش/استنتاج نوع: \fBScript.goto()\fP \%<#\:jedi\:.Script\:.goto> و \fBScript.infer()\fP \%<#\:jedi\:.Script\:.infer> .IP \(bu 2 تحلیل ایستا: \fBScript.get_names()\fP \%<#\:jedi\:.Script\:.get_names> و \fBScript.get_syntax_errors()\fP \%<#\:jedi\:.Script\:.get_syntax_errors> .IP \(bu 2 بازآفرینی‌ها: \fBScript.rename()\fP \%<#\:jedi\:.Script\:.rename>، \fBScript.inline()\fP \%<#\:jedi\:.Script\:.inline>، \fBScript.extract_variable()\fP \%<#\:jedi\:.Script\:.extract_variable> و \fBScript.extract_function()\fP \%<#\:jedi\:.Script\:.extract_function> .IP \(bu 2 جستجوی کد: \fBScript.search()\fP \%<#\:jedi\:.Script\:.search> و \fBProject.search()\fP \%<#\:jedi\:.Project\:.search> .UNINDENT .SS قابلیت‌های پایه .INDENT 0.0 .IP \(bu 2 پشتیبانی از Python 3.10+ .IP \(bu 2 نادیده گرفتن خطاهای نحوی و تورفتگی نادرست .IP \(bu 2 توانایی کار با ساختارهای پیچیدهٔ ماژول / تابع / کلاس .IP \(bu 2 پشتیبانی عالی از \fBvirtualenv\fP/\fBvenv\fP .IP \(bu 2 عملکرد عالی با قابلیت type hinting در پایتون \%<#\:type-hinting>، .IP \(bu 2 شناسایی و درک فایل‌های stub .IP \(bu 2 امکان استنتاج آرگومان‌های تابع برای docstringهای sphinx، epydoc و numpydoc پایه .IP \(bu 2 در کل نرم‌افزاری بسیار پایدار و قابل اتکا است که در طول مدتی طولانی صیقل خورده است. از گزارش باگ‌ها به گرمی استقبال می‌شود و معمولاً ظرف چند هفته برطرف می‌گردند. .UNINDENT.SS ویژگی‌های پایتون پشتیبانی‌شده (Supported Python Features) .sp Jedi از بسیاری از قابلیت‌های پرکاربرد پایتون پشتیبانی می‌کند: .INDENT 0.0 .IP \(bu 2 عناصر توکار (builtins) .IP \(bu 2 دستورهای returns،‏ yields و yield from .IP \(bu 2 انتساب چندتایی‌ها (tuple assignments) / نمایه‌سازی آرایه‌ها / نمایه‌سازی دیکشنری‌ها / باز کردن بسته‌بندی با ستاره (star unpacking) .IP \(bu 2 عبارت‌های with\-statement / مدیریت استثناها .IP \(bu 2 \fB*args\fP / \fB**kwargs\fP .IP \(bu 2 دکوراتورها / توابع lambda / کلوژرها (closures) .IP \(bu 2 مولدها (generators) / تکرارکننده‌ها (iterators) .IP \(bu 2 توصیف‌کننده‌ها (descriptors): شامل property / staticmethod / classmethod / توصیف‌کننده‌های سفارشی .IP \(bu 2 برخی متدهای جادویی: \fB__call__\fP، \fB__iter__\fP، \fB__next__\fP، \fB__get__\fP، \fB__getitem__\fP، \fB__init__\fP .IP \(bu 2 \fBlist.append()\fP، \fBset.add()\fP، \fBlist.extend()\fP و غیره .IP \(bu 2 ساخت لیست‌های تو در تو (list comprehensions) / عبارت‌های سه‌گانه (ternary expressions) .IP \(bu 2 واردسازی‌های نسبی (relative imports) .IP \(bu 2 \fBgetattr()\fP / \fB__getattr__\fP / \fB__getattribute__\fP .IP \(bu 2 حاشیه‌نویسی توابع (function annotations) .IP \(bu 2 تغییرات ساده و رایج در \fBsys.path\fP .IP \(bu 2 بررسی‌های \fBisinstance\fP برای if/while/assert .IP \(bu 2 بسته‌های فضای نام (شامل فضاهای نام \fBpkgutil\fP، \fBpkg_resources\fP و PEP420) .IP \(bu 2 پشتیبانی از Django / Flask / Buildout .IP \(bu 2 شناسایی فیکسچرهای Pytest .UNINDENT .SS محدودیت‌ها (Limitations) .sp به‌طور کلی آستانهٔ تحمل Jedi بسیار بالاست، اما برای پروژه‌های بسیار بزرگ یا کدهای بسیار پیچیده، گاهی اوقات Jedi استنتاج نوع را عمداً متوقف می‌کند تا از معلق ماندن طولانی‌مدت برنامه جلوگیری کند. .sp علاوه بر این، برخی از الگوهای پایتون وجود دارند که Jedi از آن‌ها پشتیبانی نمی‌کند. این امر عمدی بوده و فهرست زیر موارد کامل آن است: .INDENT 0.0 .IP \(bu 2 متاکلاس‌های دلخواه: برخی متاکلاس‌ها مانند enumها و dataclassها در Jedi بازپیاده‌سازی شده‌اند تا به درستی کار کنند. در بیشتر مواقع، پرونده‌های استاب (stubs) برای کارکرد صحیح استنتاج نوع کافی هستند، حتی هنگامی که متاکلاس‌ها دخیل باشند. .IP \(bu 2 \fBsetattr()\fP، \fB__import__()\fP .IP \(bu 2 نوشتن روی برخی دیکشنری‌ها: \fBglobals()\fP، \fBlocals()\fP، \fBobject.__dict__\fP .IP \(bu 2 دستکاری نمونه‌ها خارج از متغیرهای نمونه بدون استفاده از متدها .UNINDENT .SS مسائل کارایی (Performance Issues) .sp وارد کردن \fBnumpy\fP گاهی اوقات می‌تواند بسیار کند باشد، همچنین بارگذاری اولیهٔ توابع توکار نیز زمان‌بر است. اگر می‌خواهید سرعت کار را بالا ببرید، می‌توانید کتابخانه‌ها را با دستور \fBpreload_module()\fP \%<#\:jedi\:.preload_module>\& در Jedi از پیش بارگذاری کنید. با این حال، پس از یک بار بارگذاری، این مسئله دیگر مشکلی نخواهد بود. همین موضوع برای ماژول‌های بسیار بزرگ مانند \fBPySide\fP، \fBwx\fP، \fBtensorflow\fP، \fBpandas\fP و غیره نیز صادق است. .sp برنامه Jedi لایه حافظه موقت (کش) خیلی مناسبی ندارد. این موضوع احتمالاً بزرگ‌ترین و تنها ایراد معماری \% در Jedi است. متأسفانه تغییر دادن آن آسان نیست. Dave Halter در فکر بازنویسی Jedi به زبان Rust است، اما رسیدن Jedi به نسخه 1.0 بیش از ۸ سال به طول انجامید و بازنویسی آن نیز احتمالاً سال‌ها زمان خواهد برد. .SS امنیت (Security) .SS برای \fBScript\fP \%<#\:jedi\:.Script> .sp امنیت موضوع مهمی برای Jedi است\&. به‌طور پیش‌فرض، هیچ کدی درون Jedi اجرا نمی‌شود. تا زمانی که پایتون خالص بنویسید، همه‌چیز به‌صورت ایستا استنتاج می‌شود. اگر گزینهٔ \fBload_unsafe_extensions=True\fP را برای \fBProject\fP \%<#\:jedi\:.Project> خود فعال کنید و از ماژول‌های توکار (\fBc_builtin\fP) بهره بگیرید، Jedi آن ماژول‌ها را اجرا خواهد کرد. اگر به یک پایگاه کد اطمینان ندارید، لطفاً آن گزینه را فعال نکنید؛ چرا که ممکن است به اجرای کدهای دلخواه منجر شود..SS برای \fBInterpreter\fP \%<#\:jedi\:.Interpreter> .sp اگر برای \fBInterpreter\fP \%<#\:jedi\:.Interpreter> به دنبال امنیت هستید، از آن \fBاستفاده نکنید\fP. Jedi ویژگی‌ها (properties) را اجرا می‌کند و به‌طور کلی برای جلوگیری از اجرای کد چندان محتاط نیست. این رفتار عمدی است: بیشتر افراد به پایه‌کدهایی که وارد (import) کرده‌اند اعتماد دارند، چرا که تا آن مرحله، یک پایه‌کد مخرب پیش‌تر امکان اجرای کد را داشته است. .SS نمای کلی API (API Overview) .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 این مستندات عمدتاً برای توسعه‌دهندگان افزونه است که می‌خواهند ویرایشگرها/IDEهای خود را با Jedi بهبود بخشند. .UNINDENT .UNINDENT .sp این API از چند بخش مختلف تشکیل شده است: .INDENT 0.0 .IP \(bu 2 نقطه‌های شروع اصلی برای complete/goto: کلاس‌های \fBScript\fP و \fBInterpreter\fP\&. اگر با Jedi کار می‌کنید، ابتدا باید این کلاس‌ها را بشناسید. .IP \(bu 2 کلاس‌های نتیجهٔ API \%<#\:api-classes> .IP \(bu 2 پشتیبانی از نسخه‌های Python و Virtualenv با توابعی مانند \fBfind_system_environments()\fP و \fBfind_virtualenvs()\fP .IP \(bu 2 روشی برای کار با پوشه‌ها / پروژه‌های مختلف .IP \(bu 2 توابع سودمند: \fBpreload_module()\fP و \fBset_debug_function()\fP .UNINDENT .sp متدهایی که به احتمال زیاد برای کار با Jedi از آن‌ها استفاده خواهید کرد به شرح زیر هستند: .TS box center; l|l. T{ \fBScript.complete\fP T} T{ اشیاء زیر مکان‌نما را تکمیل می‌کند. T} _ T{ \fBScript.goto\fP T} T{ به نامی می‌رود که شیء زیر مکان‌نما را تعریف کرده است. T} _ T{ \fBScript.infer\fP T} T{ تعریف‌های زیر مکان‌نما را بازمی‌گرداند. T} _ T{ \fBScript.help\fP T} T{ برای نمایش پنجرهٔ راهنما به کاربران استفاده می‌شود. T} _ T{ \fBScript.get_signatures\fP T} T{ شیء تابعِ فراخوانی زیر مکان‌نما را بازمی‌گرداند. T} _ T{ \fBScript.get_references\fP T} T{ تمام ارجاعات به یک متغیر را در یک پروژه فهرست می‌کند. T} _ T{ \fBScript.get_context\fP T} T{ زمینهٔ حوزه (scope context) زیر مکان‌نما را بازمی‌گرداند. T} _ T{ \fBScript.get_names\fP T} T{ نام‌های تعریف‌شده در فایل جاری را بازمی‌گرداند. T} _ T{ \fBScript.get_syntax_errors\fP T} T{ تمام خطاهای نحوی موجود در فایل جاری را فهرست می‌کند. T} _ T{ \fBScript.rename\fP T} T{ نام تمام ارجاعات به متغیر زیر مکان‌نما را تغییر می‌دهد. T} _ T{ \fBScript.inline\fP T} T{ متغیر زیر مکان‌نما را درون‌خطی (inline) می‌کند. این عمل اساساً نقطهٔ مقابل استخراج متغیر است؛ برای مثال با قرار داشتن مکان‌نما روی bar::. T} _ T{ \fBScript.extract_variable\fP T} T{ یک عبارت را به یک دستور (statement) جدید منتقل می‌کند. T} _ T{ \fBScript.extract_function\fP T} T{ یک عبارت را به یک تابع جدید منتقل می‌کند. T} _ T{ \fBScript.search\fP T} T{ یک نام را در فایل جاری جستجو می‌کند. T} _ T{ \fBScript.complete_search\fP T} T{ مشابه \fBScript.search()\fP است، اما آن رشته را تکمیل می‌کند. T} _ T{ \fBProject.search\fP T} T{ یک نام را در کل پروژه جستجو می‌کند. T} _ T{ \fBProject.complete_search\fP T} T{ مشابه \fBScript.search()\fP است، اما آن رشته را تکمیل می‌کند. T} .TE.SS Script .INDENT 0.0 .TP .B class jedi.Script(code=None, *, path=None, environment=None, project=None) یک شیء \fBScript\fP پایه‌ای برای تکمیل خودکار (completions)، رفتن به تعاریف (goto) یا هر کار دیگری است که می‌خواهید با Jedi انجام دهید. همتای این کلاس \fBInterpreter\fP است که با دیکشنری‌های واقعی کار می‌کند و می‌تواند در تعامل با یک REPL استفاده شود. این کلاس باید زمانی استفاده شود که کاربر در حال ویرایش کد درون یک ویرایشگر است. .sp می‌توانید برای خواندن فایل از پارامتر \fBcode\fP یا \fBpath\fP استفاده کنید. معمولاً (در یک ویرایشگر) تمایل خواهید داشت از هر دوی آن‌ها استفاده کنید. .sp مقدار \fBsys.path\fP در \fBScript\fP بسیار قابل سفارشی‌سازی است: .INDENT 7.0 .IP \(bu 2 اگر \fIproject\fP همراه با یک \fBsys_path\fP ارائه شده باشد، از آن استفاده خواهد شد. .IP \(bu 2 اگر \fIenvironment\fP ارائه شده باشد، مقدار \fBsys.path\fP آن استفاده خواهد شد (نگاه کنید به \fBEnvironment.get_sys_path\fP)؛ .IP \(bu 2 در غیر این صورت \fBsys.path\fP با محیط پیش‌فرض Jedi مطابقت خواهد داشت، که معمولاً با sys path استفاده‌شده در زمان import شدن Jedi همخوانی دارد. .UNINDENT .sp بیشتر متدها پارامترهای \fBline\fP و \fBcolumn\fP را دارند. شماره سطرها در Jedi همیشه از ۱ شروع می‌شوند (1\-based) و ستون‌ها همیشه بر مبنای صفر (zero based) هستند. برای جلوگیری از تکرار، این موارد همیشه مستندسازی نشده‌اند. می‌توانید هر دو مقدار سطر و ستون را حذف کنید؛ در این صورت Jedi عملیاتی را که فراخوانی کرده‌اید در انتهای فایل اجرا می‌کند. اگر فقط سطر را مشخص کنید، عملیات تکمیل در انتهای همان سطر انجام خواهد شد. .sp \fBهشدار:\fP .INDENT 7.0 .INDENT 3.5 به‌طور پیش‌فرض \fBjedi.settings.fast_parser\fP \%<#\:jedi\:.settings\:.fast_parser> فعال است، به این معنی که parso ماژول‌ها را مجدداً استفاده می‌کند (یعنی تغییرناپذیر نیستند). با این تنظیم، Jedi به صورت \fBthread safe نیست\fP و همچنین استفادهٔ هم‌زمان از چند نمونهٔ \fBScript\fP و تعاریف آن امن نخواهد بود. .sp اگر یک توسعه‌دهندهٔ افزونهٔ عادی هستید این نباید مشکلی ایجاد کند. این مسئله تنها برای افرادی مطرح است که کارهای پیچیده‌تری با Jedi انجام می‌دهند. .sp این صرفاً یک بهینه‌سازی کارایی است و برای تمامی کاربردهای معمول بسیار خوب عمل می‌کند؛ با این حال اگر برای شما مشکلی ایجاد کرد، خاموش کردن این تنظیم را مد نظر قرار دهید. همچنین ببینید: این بحث \%\&. .UNINDENT .UNINDENT .INDENT 7.0 .TP .B پارامترها (Parameters) .INDENT 7.0 .IP \(bu 2 \fBcode\fP (\fIstr\fP \%) \-\- کد منبع فایل جاری، جداشده با خطوط جدید. .IP \(bu 2 \fBpath\fP (\fIstr\fP \%\fI یا \fP\fIpathlib.Path\fP \%\fI یا \fP\fINone\fP) \-\- مسیر فایل در سیستم فایل، یا \fB\(aq\(aq\fP اگر هنوز ذخیره نشده باشد. .IP \(bu 2 \fBenvironment\fP (\fIEnvironment\fP \%<#\:jedi\:.api\:.environment\:.Environment>) \-\- ارائه یک Environment از پیش تعریف‌شده برای کار با نسخهٔ خاصی از Python یا virtualenv. .IP \(bu 2 \fBproject\fP (\fIProject\fP \%<#\:jedi\:.Project>) \-\- ارائه یک \fBProject\fP برای اطمینان از عملکرد صحیح یافتن ارجاعات، زیرا پوشهٔ درست جستجو می‌شود. همچنین راه‌هایی برای تغییر sys path و سایر موارد وجود دارد. .UNINDENT .UNINDENT .INDENT 7.0 .TP .B complete(line=None, column=None, *, fuzzy=False) اشیاء زیر مکان‌نما را تکمیل می‌کند. .sp این اشیاء حاوی اطلاعاتی دربارهٔ موارد تکمیل‌شده هستند، نه صرفاً نام‌ها. .INDENT 7.0 .TP .B پارامترها (Parameters) \fBfuzzy\fP \-\- مقدار پیش‌فرض False. تکمیل‌های فازی را بازمی‌گرداند؛ به این معنی که مثلاً \fBooa\fP با \fBfoobar\fP مطابقت پیدا خواهد کرد. .TP .B مقادیر بازگشتی (Returns) اشیاء Completion، مرتب‌شده بر پایهٔ نام. نام‌های معمولی پیش از نام‌های \(dqخصوصی\(dq که با \fB_\fP آغاز می‌شوند ظاهر می‌گردند و آن‌ها نیز قبل از متدهای جادویی و نام‌های دستکاری‌شده (name mangled) که با \fB__\fP شروع می‌شوند قرار می‌گیرند. .TP .B نوع بازگشتی (Return type) لیستی از \fBCompletion\fP \%<#\:jedi\:.api\:.classes\:.Completion> .UNINDENT .UNINDENT .INDENT 7.0 .TP .B infer(line=None, column=None, *, only_stubs=False, prefer_stubs=False) تعاریف شیء زیر مکان‌نما را بازمی‌گرداند. این متد اساساً یک پوسته در اطراف استنتاج نوع (type inference) در Jedi است. .sp این متد مسیرهای پیچیده را دنبال کرده و نقطهٔ پایان را برمی‌گرداند، نه تعریف اولیه را. تفاوت بزرگ بین \fBgoto()\fP و \fBinfer()\fP در این است که \fBgoto()\fP از importها و عبارات پیروی نمی‌کند. ممکن است چندین شیء بازگردانده شوند، چرا که بسته به شرایط ممکن است دو نسخهٔ مختلف از یک تابع وجود داشته باشد. .INDENT 7.0 .TP .B پارامترها (Parameters) .INDENT 7.0 .IP \(bu 2 \fBonly_stubs\fP \-\- برای این متد تنها stubها را برمی‌گرداند. .IP \(bu 2 \fBprefer_stubs\fP \-\- برای این متد، stubها را به اشیاء Python ترجیح می‌دهد. .UNINDENT .TP .B نوع بازگشتی (Return type) لیستی از \fBName\fP \%<#\:jedi\:.api\:.classes\:.Name> .UNINDENT .UNINDENT .INDENT 7.0 .TP .B goto(line=None, column=None, *, follow_imports=False, follow_builtin_imports=False, only_stubs=False, prefer_stubs=False) به نامی می‌رود که شیء زیر مکان‌نما را تعریف کرده است. به صورت اختیاری می‌توانید importها را دنبال کنید. بسته به اینکه ممکن است دو نسخهٔ متفاوت از یک تابع وجود داشته باشد، امکان بازگرداندن چندین شیء وجود دارد. .INDENT 7.0 .TP .B پارامترها (Parameters) .INDENT 7.0 .IP \(bu 2 \fBfollow_imports\fP \-\- این متد importها را دنبال خواهد کرد. .IP \(bu 2 \fBfollow_builtin_imports\fP \-\- اگر \fBfollow_imports\fP مقدار True باشد، تلاش می‌کند نام‌ها را در builtins (یعنی ماژول‌های کامپایل‌شده یا الحاقی) جستجو کند. .IP \(bu 2 \fBonly_stubs\fP \-\- برای این متد تنها stubها را برمی‌گرداند. .IP \(bu 2 \fBprefer_stubs\fP \-\- برای این متد، stubها را به اشیاء Python ترجیح می‌دهد. .UNINDENT .TP .B نوع بازگشتی (Return type) لیستی از \fBName\fP \%<#\:jedi\:.api\:.classes\:.Name> .UNINDENT .UNINDENT .INDENT 7.0 .TP .B search(string, *, all_scopes=False) یک نام را در فایل جاری جستجو می‌کند. برای توضیح دربارهٔ نحوهٔ قالب رشتهٔ جستجو، لطفاً نگاهی بیندازید به \fBProject.search()\fP\&. .INDENT 7.0 .TP .B پارامترها (Parameters) \fBall_scopes\fP (\fIbool\fP \%) \-\- پیش‌فرض False؛ تعاریف را نه فقط در بالاترین سطح ماژول (top level)، بلکه در توابع و کلاس‌ها نیز جستجو می‌کند. .TP .B خروجی‌های مولد (Yields) \fBName\fP \%<#\:jedi\:.api\:.classes\:.Name> .UNINDENT .UNINDENT .INDENT 7.0 .TP .B complete_search(string, **kwargs) مشابه \fBScript.search()\fP، اما آن رشته را تکمیل می‌کند. اگر می‌خواهید تمام تعاریف ممکن در یک فایل را در اختیار داشته باشید، می‌توانید یک رشتهٔ خالی نیز ارائه دهید. .INDENT 7.0 .TP .B پارامترها (Parameters) .INDENT 7.0 .IP \(bu 2 \fBall_scopes\fP (\fIbool\fP \%) \-\- پیش‌فرض False؛ تعاریف را نه فقط در بالاترین سطح ماژول، بلکه درون توابع و کلاس‌ها نیز جستجو می‌کند. .IP \(bu 2 \fBfuzzy\fP \-\- پیش‌فرض False. تکمیل‌های فازی را بازمی‌گرداند، به این معنی که مثلاً \fBooa\fP با \fBfoobar\fP مطابقت داده خواهد شد. .UNINDENT .TP .B خروجی‌های مولد (Yields) \fBCompletion\fP \%<#\:jedi\:.api\:.classes\:.Completion> .UNINDENT .UNINDENT .INDENT 7.0.TP .B help(line=None, column=None) برای نمایش پنجرهٔ راهنما به کاربران استفاده می‌شود. از \fBScript.goto()\fP استفاده کرده و تعاریف بیشتری را برای کلیدواژه‌ها و عملگرها بازمی‌گرداند. .sp به طور معمول می‌خواهید \fBBaseName.docstring()\fP \%<#\:jedi\:.api\:.classes\:.BaseName\:.docstring> را برای تمام تعاریف بازگردانده‌شده به کاربر نمایش دهید. .sp تعاریف اضافی از نوع \fBName(...).type == \(aqkeyword\(aq\fP\& هستند. این تعاریف به جز ویژگی docstring خود که حاوی خروجی تابع \fBhelp()\fP در پایتون است، ارزش چندانی ندارند. .INDENT 7.0 .TP .B نوع بازگشتی فهرستی از \fBName\fP \%<#\:jedi\:.api\:.classes\:.Name> .UNINDENT .UNINDENT .INDENT 7.0 .TP .B get_references(line=None, column=None, **kwargs) تمام مراجع یک متغیر را در پروژه فهرست می‌کند. از آنجا که این کار می‌تواند برای Jedi بسیار سنگین باشد، در صورت پیچیدگی بیش از حد، Jedi جستجو را متوقف خواهد کرد. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBinclude_builtins\fP \-\- پیش‌فرض \fBTrue\fP است. اگر \fBFalse\fP باشد، توکار بودن تعریف (مانند \fBsys\fP) را بررسی کرده و در این صورت آن را بازنمی‌گرداند. .IP \(bu 2 \fBscope\fP \-\- پیش‌فرض \fB\(aqproject\(aq\fP است. اگر \fB\(aqfile\(aq\fP باشد، مراجع را تنها در ماژول فعلی در بر می‌گیرد. .UNINDENT .TP .B نوع بازگشتی فهرستی از \fBName\fP \%<#\:jedi\:.api\:.classes\:.Name> .UNINDENT .UNINDENT .INDENT 7.0 .TP .B get_signatures(line=None, column=None) شیء تابعِ فراخوانی‌شده زیر مکان‌نما را بازمی‌گرداند. .sp برای نمونه، اگر مکان‌نما در اینجا باشد: .INDENT 7.0 .INDENT 3.5 .sp .EX abs(# <\-\- cursor is here .EE .UNINDENT .UNINDENT .sp این دستور تابع \fBabs\fP را بازمی‌گرداند. از طرف دیگر: .INDENT 7.0 .INDENT 3.5 .sp .EX abs()# <\-\- cursor is here .EE .UNINDENT .UNINDENT .sp این دستور یک فهرست خالی بازخواهد گرداند. .INDENT 7.0 .TP .B نوع بازگشتی فهرستی از \fBSignature\fP \%<#\:jedi\:.api\:.classes\:.Signature> .UNINDENT .UNINDENT .INDENT 7.0 .TP .B get_context(line=None, column=None) بافتار حوزهٔ زیر مکان‌نما را بازمی‌گرداند. این اساساً به معنای تابع، کلاس یا ماژولی است که مکان‌نما در آن قرار دارد. .INDENT 7.0 .TP .B نوع بازگشتی \fBName\fP \%<#\:jedi\:.api\:.classes\:.Name> .UNINDENT .UNINDENT .INDENT 7.0 .TP .B get_names(**kwargs) نام‌های تعریف‌شده در فایل فعلی را بازمی‌گرداند. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBall_scopes\fP \-\- در صورت True بودن، نام‌های تمام حوزه‌ها را به جای تنها فضای نام ماژول فهرست می‌کند. .IP \(bu 2 \fBdefinitions\fP \-\- در صورت True بودن، نام‌هایی را که توسط یک کلاس، تابع یا یک دستور تعریف شده‌اند فهرست می‌کند (\fBa = b\fP مقدار \fBa\fP را بازمی‌گرداند). .IP \(bu 2 \fBreferences\fP \-\- در صورت True بودن، تمام نام‌هایی را که توسط \fBdefinitions=True\fP فهرست نشده‌اند برمی‌شمارد؛ برای نمونه \fBa = b\fP مقدار \fBb\fP را بازمی‌گرداند. .UNINDENT .TP .B نوع بازگشتی فهرستی از \fBName\fP \%<#\:jedi\:.api\:.classes\:.Name> .UNINDENT .UNINDENT .INDENT 7.0 .TP .B get_syntax_errors() تمام خطاهای نحوی در فایل فعلی را فهرست می‌کند. .INDENT 7.0 .TP .B نوع بازگشتی فهرستی از \fBSyntaxError\fP \%<#\:jedi\:.api\:.errors\:.SyntaxError> .UNINDENT .UNINDENT .INDENT 7.0 .TP .B rename(line=None, column=None, *, new_name) تمام مراجع به متغیر زیر مکان‌نما را تغییر نام می‌دهد. .INDENT 7.0 .TP .B پارامترها \fBnew_name\fP \-\- متغیر زیر مکان‌نما به این رشته تغییر نام داده خواهد شد. .TP .B خطاهای پرتابی \fBRefactoringError\fP .TP .B نوع بازگشتی \fBRefactoring\fP \%<#\:jedi\:.api\:.refactoring\:.Refactoring> .UNINDENT .UNINDENT .INDENT 7.0 .TP .B extract_variable(line, column, *, new_name, until_line=None, until_column=None) یک عبارت را به یک دستور جدید منتقل می‌کند. .sp برای نمونه اگر مکان‌نما روی \fBfoo\fP باشد و یک \fBnew_name\fP به نام \fBbar\fP مشخص کنید: .INDENT 7.0 .INDENT 3.5 .sp .EX foo = 3.1 x = int(foo + 1) .EE .UNINDENT .UNINDENT .sp کد بالا به شکل زیر در خواهد آمد: .INDENT 7.0 .INDENT 3.5 .sp .EX foo = 3.1 bar = foo + 1 x = int(bar) .EE .UNINDENT .UNINDENT .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBnew_name\fP \-\- عبارت زیر مکان‌نما به این رشته تغییر نام خواهد یافت. .IP \(bu 2 \fBuntil_line\fP (\fIint\fP \%) \-\- محدودهٔ انتخاب در این خط پایان می‌یابد؛ در صورت حذف، Jedi به طور هوشمند تلاش می‌کند تا محدوده را خودش مشخص کند. .IP \(bu 2 \fBuntil_column\fP (\fIint\fP \%) \-\- محدودهٔ انتخاب در این ستون پایان می‌یابد؛ در صورت حذف، Jedi به طور هوشمند تلاش می‌کند تا محدوده را خودش مشخص کند. .UNINDENT .TP .B خطاهای پرتابی \fBRefactoringError\fP .TP .B نوع بازگشتی \fBRefactoring\fP \%<#\:jedi\:.api\:.refactoring\:.Refactoring> .UNINDENT .UNINDENT .INDENT 7.0.TP .B extract_function(line, column, *, new_name, until_line=None, until_column=None) یک عبارت را به یک تابع جدید منتقل می‌کند. .sp به‌عنوان مثال، اگر مکان‌نما روی \fBfoo\fP قرار داشته باشد و یک \fBnew_name\fP به نام \fBbar\fP مشخص کنید: .INDENT 7.0 .INDENT 3.5 .sp .EX global_var = 3 def x(): foo = 3.1 x = int(foo + 1 + global_var) .EE .UNINDENT .UNINDENT .sp کد بالا به این صورت در خواهد آمد: .INDENT 7.0 .INDENT 3.5 .sp .EX global_var = 3 def bar(foo): return int(foo + 1 + global_var) def x(): foo = 3.1 x = bar(foo) .EE .UNINDENT .UNINDENT .INDENT 7.0 .TP .B پارامترها (Parameters) .INDENT 7.0 .IP \(bu 2 \fBnew_name\fP \-\- عبارتی که زیر مکان‌نما قرار دارد با تابعی به این نام جایگزین خواهد شد. .IP \(bu 2 \fBuntil_line\fP (\fIint\fP \%) \-\- محدودهٔ انتخاب در این خط پایان می‌یابد؛ در صورت مشخص نشدن، Jedi به‌صورت هوشمندانه تلاش می‌کند محدوده را خودش تعیین کند. .IP \(bu 2 \fBuntil_column\fP (\fIint\fP \%) \-\- محدودهٔ انتخاب در این ستون پایان می‌یابد؛ در صورت مشخص نشدن، Jedi به‌صورت هوشمندانه تلاش می‌کند محدوده را خودش تعیین کند. .UNINDENT .TP .B خطاها (Raises) \fBRefactoringError\fP .TP .B نوع بازگشتی (Return type) \fBRefactoring\fP \%<#\:jedi\:.api\:.refactoring\:.Refactoring> .UNINDENT .UNINDENT .INDENT 7.0 .TP .B inline(line=None, column=None) متغیر زیر مکان‌نما را درون‌خطی (inline) می‌کند. این کار اساساً برعکس استخراج یک متغیر است. به‌عنوان مثال با قرار داشتن مکان‌نما روی bar: .INDENT 7.0 .INDENT 3.5 .sp .EX foo = 3.1 bar = foo + 1 x = int(bar) .EE .UNINDENT .UNINDENT .sp کد بالا به این صورت در خواهد آمد: .INDENT 7.0 .INDENT 3.5 .sp .EX foo = 3.1 x = int(foo + 1) .EE .UNINDENT .UNINDENT .INDENT 7.0 .TP .B خطاها (Raises) \fBRefactoringError\fP .TP .B نوع بازگشتی (Return type) \fBRefactoring\fP \%<#\:jedi\:.api\:.refactoring\:.Refactoring> .UNINDENT .UNINDENT .UNINDENT.SS مفسر (Interpreter) .INDENT 0.0 .TP .B class jedi.Interpreter(code, namespaces, *, project=None, **kwds) رابط برنامه‌نویسی (API) کتابخانهٔ Jedi برای REPLهای پایتون. .sp همچنین تمام متدهای موجود در \fBScript\fP را پیاده‌سازی می‌کند. .sp علاوه بر تکمیل‌هایی که تکمیل‌کنندهٔ معمول REPL انجام می‌دهد، مانند \fBstr.upper\fP، کتابخانهٔ Jedi از تکمیل کد مبتنی بر تحلیل ایستای کد نیز پشتیبانی می‌کند. برای نمونه Jedi عبارت \fBstr().upper\fP\& را تکمیل خواهد کرد. .sp .EX >>> from os.path import join >>> namespace = locals() >>> script = Interpreter(\(aqjoin(\(dq\(dq).up\(aq, [namespace]) >>> print(script.complete()[0].name) upper .EE .sp تمام آرگومان‌های کلیدواژه‌ای همانند آرگومان‌های \fBScript\fP هستند. .INDENT 7.0 .TP .B پارامترها (Parameters) .INDENT 7.0 .IP \(bu 2 \fBcode\fP (\fIstr\fP \%) \-\- کدی که باید تجزیه شود. .IP \(bu 2 \fBnamespaces\fP (\fIList\fP \%\fI[\fP\fIdict\fP \%\fI]\fP) \-\- فهرستی از دیکشنری‌های فضای‌نام، مانند آنچه توسط \fBglobals()\fP \% و \fBlocals()\fP \%\& بازگردانده می‌شود. .UNINDENT .UNINDENT .UNINDENT .SS پروژه‌ها (Projects) .sp پروژه‌ها راهکاری برای مدیریت پروژه‌های پایتون درون Jedi هستند. برای افزونه‌های ساده‌تر ممکن است نیازی به درگیر شدن با پروژه‌ها نداشته باشید، اما اگر می‌خواهید انعطاف‌پذیری بیشتری در تعریف مسیرهای sys و مفسرهای پایتون به کاربر بدهید، \fBProject\fP روشی ایده‌آل برای این کار است. .sp پروژه‌ها را می‌توان روی دیسک ذخیره و دوباره بارگذاری کرد تا امکان استفاده از تعاریف پروژه در بین مخازن مختلف فراهم شود. .INDENT 0.0 .TP .B jedi.get_default_project(path=None) اگر پروژه‌ای توسط کاربر تعریف نشده باشد، Jedi تلاش می‌کند تا جای ممکن پروژه را به‌طور خودکار تعریف کند. Jedi پوشه‌ها را پیمایش می‌کند تا زمانی که یکی از موارد زیر را بیابد: .INDENT 7.0 .IP 1. 3 یک فایل \fB\&.jedi/config.json\fP .IP 2. 3 یکی از فایل‌های روبه‌رو: \fBsetup.py\fP، \fB\&.git\fP، \fB\&.hg\fP، \fBrequirements.txt\fP و \fBMANIFEST.in\fP\&. .UNINDENT .UNINDENT .INDENT 0.0 .TP .B class jedi.Project(path, *, environment_path=None, load_unsafe_extensions=False, sys_path=None, added_sys_path=(), smart_sys_path=True) پروژه‌ها روشی ساده برای مدیریت پوشه‌های پایتون و تعریف چگونگی حل و فصل وارد کردن‌ها (import resolution) توسط Jedi هستند. این کلاس بیشتر به‌عنوان پارامتری برای \fBScript\fP\& استفاده می‌شود. علاوه‌براین توابعی برای جستجو در کل پروژه وجود دارد. .INDENT 7.0 .TP .B پارامترها (Parameters) .INDENT 7.0 .IP \(bu 2 \fBpath\fP \-\- مسیر پایه برای این پروژه. .IP \(bu 2 \fBenvironment_path\fP \-\- مسیر فایل اجرایی پایتون، معمولاً مسیر یک محیط مجازی (virtual environment). .IP \(bu 2 \fBload_unsafe_extensions\fP \-\- پیش‌فرض False. افزونه‌هایی را بارگذاری می‌کند که در sys path و دایرکتوری‌های محلی نیستند. با فعال بودن این گزینه، اگر یک مخزن git را کلون کرده و کد آن را تحلیل کنید این عمل بالقوه ناامن است؛ زیرا آن افزونه‌های کامپایل‌شده وارد (import) خواهند شد و در نتیجه دسترسی اجرا دارند. .IP \(bu 2 \fBsys_path\fP \-\- فهرستی از str. در صورت تمایل می‌توانید sys path را بازنویسی کنید. به‌طور پیش‌فرض مقدار \fBsys.path\fP توسط محیط (محیط‌های مجازی و غیره) تولید می‌شود. .IP \(bu 2 \fBadded_sys_path\fP \-\- فهرستی از str. این مسیرها را به انتهای sys path می‌افزاید. .IP \(bu 2 \fBsmart_sys_path\fP \-\- در صورت فعال بودن (پیش‌فرض)، مسیرها را از دایرکتوری‌های محلی اضافه می‌کند. در غیر این صورت باید متکی به پیکربندی درست بسته‌های خود روی \fBsys.path\fP\& باشید. .UNINDENT .UNINDENT .INDENT 7.0 .TP .B classmethod load(path) یک پروژه را از مسیری مشخص بارگذاری می‌کند. شما نباید مسیر \fB\&.jedi/project.json\fP را بدهید، بلکه باید مسیر پوشهٔ پروژه را مشخص کنید. .INDENT 7.0 .TP .B پارامترها (Parameters) \fBpath\fP \-\- مسیر دایرکتوری‌ای که می‌خواهید به‌عنوان یک پروژه استفاده کنید. .UNINDENT .UNINDENT .INDENT 7.0 .TP .B save() پیکربندی پروژه را در درون پروژه در \fB\&.jedi/project.json\fP\& ذخیره می‌کند. .UNINDENT .INDENT 7.0 .TP .B added_sys_path مسیر sys path که قرار است به انتها اضافه شود. .UNINDENT .INDENT 7.0 .TP .B property path مسیر پایه برای این پروژه. .UNINDENT .INDENT 7.0 .TP .B property sys_path مسیر sys path ارائه‌شده به این پروژه. این مقدار می‌تواند None باشد و در این صورت به‌طور خودکار تولید خواهد شد. .UNINDENT .INDENT 7.0 .TP .B property smart_sys_path مشخص می‌کند که آیا sys path قرار است به روشی هوشمندانه محاسبه شود و مسیرهای اضافی اضافه شوند یا خیر. .UNINDENT .INDENT 7.0 .TP .B property load_unsafe_extensions اینکه آیا پروژه افزونه‌های ناامن را بارگذاری می‌کند یا خیر. .UNINDENT .INDENT 7.0 .TP .B search(string, *, all_scopes=False) یک نام را در کل پروژه جستجو می‌کند. اگر پروژه بسیار بزرگ باشد، در نقطه‌ای Jedi جستجو را متوقف خواهد کرد. با این حال بسیار توصیه می‌شود که مولد (generator) را تا انتها مصرف نکنید؛ فقط ده نتیجهٔ نخست را به کاربر نمایش دهید. .sp در حال حاضر سه الگوی جستجوی متفاوت وجود دارد: .INDENT 7.0 .IP \(bu 2 \fBfoo\fP برای جستجوی تعریف foo در هر فایلی یا فایلی به نام \fBfoo.py\fP یا \fBfoo.pyi\fP\&. .IP \(bu 2 \fBfoo.bar\fP برای جستجوی \fBfoo\fP و سپس ویژگی \fBbar\fP درون آن. .IP \(bu 2 \fBclass foo.bar.Bar\fP یا \fBdef foo.bar.baz\fP برای جستجوی یک نوع API مشخص. .UNINDENT .INDENT 7.0 .TP .B پارامترها (Parameters) \fBall_scopes\fP (\fIbool\fP \%) \-\- پیش‌فرض False؛ جستجو را نه‌تنها برای تعاریف در بالاترین سطح ماژول، بلکه در توابع و کلاس‌ها نیز انجام می‌دهد. .TP .B بازدهی (Yields) \fBName\fP \%<#\:jedi\:.api\:.classes\:.Name> .UNINDENT .UNINDENT .INDENT 7.0 .TP .B complete_search(string, **kwargs) مشابه \fBScript.search()\fP عمل می‌کند، اما آن رشته را تکمیل می‌کند. یک رشتهٔ خالی تمام تعاریف موجود در پروژه را فهرست می‌کند، بنابراین هنگام استفاده از آن دقت کنید. .INDENT 7.0 .TP .B پارامترها (Parameters) \fBall_scopes\fP (\fIbool\fP \%) \-\- پیش‌فرض False؛ جستجو را نه‌تنها برای تعاریف در بالاترین سطح ماژول، بلکه در توابع و کلاس‌ها نیز انجام می‌دهد. .TP .B بازدهی (Yields) \fBCompletion\fP \%<#\:jedi\:.api\:.classes\:.Completion> .UNINDENT .UNINDENT .UNINDENT.SS محیط‌ها (Environments) .sp محیط‌ها روشی برای فعال‌سازی نسخه‌های مختلف Python یا Virtualenvها جهت تحلیل ایستا (static analysis) هستند. باینری Python موجود در آن محیط اجرا خواهد شد. .INDENT 0.0 .TP .B jedi.find_system_environments(*, env_vars=None) محیط‌های مجازی (virtualenvs) را نادیده می‌گیرد و نسخه‌های Python نصب‌شده روی سیستم شما را بازمی‌گرداند. اگر برای مثال Python را از یک نسخهٔ قابل‌حمل (portable) اجرا می‌کنید، ممکن است این تابع چیزی بازنگرداند. .sp محیط‌ها از جدیدترین به قدیمی‌ترین نسخهٔ Python مرتب شده‌اند. .INDENT 7.0 .TP .B مقادیر تولیدی (Yields) \fBEnvironment\fP .UNINDENT .UNINDENT .INDENT 0.0 .TP .B jedi.find_virtualenvs(paths=None, *, safe=True, use_environment_vars=True) .INDENT 7.0 .TP .B پارامترها (Parameters) .INDENT 7.0 .IP \(bu 2 \fBpaths\fP \-\- فهرستی از مسیرها در سیستم فایل شما که برای یافتن Virtualenvها پویش می‌شوند. این تابع در این مسیرها جستجو کرده و احتمالاً باینری‌های Python را اجرا می‌کند. .IP \(bu 2 \fBsafe\fP \-\- پیش‌فرض True است. در صورتی که این مقدار False باشد، به این تابع اجازه می‌دهد تا محیط‌های بالقوهٔ \fIpython\fP را اجرا کند. یک مهاجم ممکن است بتواند یک فایل اجرایی را در مسیری که این تابع به‌طور پیش‌فرض جستجو می‌کند قرار دهد. اگر فایل اجرایی توسط ریشه (root) نصب نشده باشد، اجرا نخواهد شد. .IP \(bu 2 \fBuse_environment_vars\fP \-\- پیش‌فرض True است. اگر True باشد، متغیر VIRTUAL_ENV بررسی می‌شود تا مشخص شود آیا حاوی یک VirtualEnv معتبر است یا خیر. متغیر CONDA_PREFIX نیز بررسی می‌شود تا مشخص شود آیا حاوی یک محیط conda معتبر است یا خیر. .UNINDENT .TP .B مقادیر تولیدی (Yields) \fBEnvironment\fP .UNINDENT .UNINDENT .INDENT 0.0 .TP .B jedi.get_system_environment(version, *, env_vars=None) نخستین محیط Python یافت‌شده برای یک رشته به فرم \(aqX.Y\(aq را بازمی‌گرداند که در آن X و Y به ترتیب نسخه‌های اصلی (major) و فرعی (minor) پایتون هستند. .INDENT 7.0 .TP .B استثناها (Raises) \fBInvalidPythonEnvironment\fP .TP .B بازمی‌گرداند (Returns) \fBEnvironment\fP .UNINDENT .UNINDENT .INDENT 0.0 .TP .B jedi.create_environment(path, *, safe=True, env_vars=None) امکان ایجاد دستی یک شیء Environment را با مشخص کردن مسیر یک Virtualenv یا مسیر یک فایل اجرایی و متغیرهای محیطی اختیاری فراهم می‌سازد. .INDENT 7.0 .TP .B استثناها (Raises) \fBInvalidPythonEnvironment\fP .TP .B بازمی‌گرداند (Returns) \fBEnvironment\fP .UNINDENT .UNINDENT .INDENT 0.0 .TP .B jedi.get_default_environment() تلاش می‌کند تا یک Virtualenv یا محیط conda فعال را بازگرداند. اگر هیچ متغیر VIRTUAL_ENV یا متغیر CONDA_PREFIX تنظیم نشده باشد، جدیدترین نسخهٔ Python نصب‌شده روی سیستم را بازمی‌گرداند. این ویژگی استفاده از بیشترین قابلیت‌های جدید ممکن در Python را هنگام بهره‌گیری از تکمیل خودکار (autocompletion) و سایر امکانات میسر می‌سازد. .INDENT 7.0 .TP .B بازمی‌گرداند (Returns) \fBEnvironment\fP .UNINDENT .UNINDENT .INDENT 0.0 .TP .B exception jedi.InvalidPythonEnvironment اگر این استثنا را مشاهده کردید، فایل اجرایی Python یا Virtualenv که سعی در استفاده از آن داشته‌اید، احتمالاً نسخهٔ صحیحی از Python نیست. .UNINDENT .INDENT 0.0 .TP .B class jedi.api.environment.Environment(executable, env_vars=None) این کلاس قرار است توسط معماری درونی Jedi ایجاد شود. نباید آن را مستقیماً ایجاد کنید. لطفاً در عوض از create_environment یا سایر توابع استفاده کنید. سپس شیء ایجادشده توسط آن تابع بازگردانده می‌شود. .INDENT 7.0 .TP .B get_sys_path() مسیر sys (sys path) برای این محیط. شامل تغییرات بالقوه ناشی از افزودن به \fBsys.path\fP \%\& نمی‌شود. .INDENT 7.0 .TP .B بازمی‌گرداند (Returns) list of str .UNINDENT .UNINDENT .UNINDENT.SS توابع کمکی .INDENT 0.0 .TP .B jedi.preload_module(*modules) پیش‌بارگذاری ماژول‌ها به Jedi اعلام می‌کند که یک ماژول را اکنون بارگذاری کند، به جای تجزیه تنبل (lazy parsing) ماژول‌ها. این قابلیت می‌تواند برای محیط‌های توسعه یکپارچه (IDE) جهت کنترل ماژول‌هایی که هنگام راه‌اندازی بارگذاری می‌شوند مفید باشد. .INDENT 7.0 .TP .B پارامترها \fBmodules\fP \-\- نام‌های مختلف ماژول، فهرستی از رشته‌ها. .UNINDENT .UNINDENT .INDENT 0.0 .TP .B jedi.set_debug_function(func_cb=, warnings=True, notices=True, speed=True) تعریف یک تابع بازخوانی (callback) دیباگ برای دریافت تمامی پیام‌های دیباگ. .sp اگر هیچ آرگومانی مشخص نکنید، پیام‌های دیباگ در stdout چاپ خواهند شد. .INDENT 7.0 .TP .B پارامترها \fBfunc_cb\fP \-\- تابع بازخوانی برای پیام‌های دیباگ. .UNINDENT .UNINDENT .SS خطاها .INDENT 0.0 .TP .B exception jedi.InternalError این خطا ممکن است زمانی رخ دهد که یک زیرفرایند (subprocess) از کار بیفتد (crash کند). دلیل این اتفاق معمولاً کدهای C معیوب در کتابخانه‌های شخص ثالث است. این امر چندان رایج نیست و استفاده دوباره از Jedi خطری ندارد. با این حال، استفاده از همان فراخوانی‌ها ممکن است مجدداً به همان خطا منجر شود. .UNINDENT .INDENT 0.0 .TP .B exception jedi.RefactoringError بازآفرینی‌ها (Refactorings) ممکن است به دلایل گوناگونی با شکست مواجه شوند. بنابراین اگر با توابع بازآفرینی مانند \fBScript.rename()\fP، \fBScript.inline()\fP، \fBScript.extract_variable()\fP و \fBScript.extract_function()\fP کار می‌کنید، حتماً این خطاها را دریافت و مدیریت کنید (catch نمایید). توضیحات موجود در خطاها معمولاً برای کاربران نهایی ارزشمند هستند. .sp یک \fBRefactoringError\fP متداول به کاربر اعلام می‌کند در صورتی که هیچ نامی زیر مکان‌نما قرار نداشته باشد، درون‌خط‌سازی (inlining) امکان‌پذیر نیست. .UNINDENT .SS مثال‌ها .SS تکمیل خودکار (Completions) .INDENT 0.0 .INDENT 3.5 .sp .EX >>> import jedi >>> code = \(aq\(aq\(aqimport json; json.l\(aq\(aq\(aq >>> script = jedi.Script(code, path=\(aqexample.py\(aq) >>> script > >>> completions = script.complete(1, 19) >>> completions [, ] >>> completions[1] >>> completions[1].complete \(aqoads\(aq >>> completions[1].name \(aqloads\(aq .EE .UNINDENT .UNINDENT .SS استنتاج نوع / رفتن به (Type Inference / Goto) .INDENT 0.0 .INDENT 3.5 .sp .EX >>> import jedi >>> code = \(aq\(aq\(aq\e \&... def my_func(): \&... print \(aqcalled\(aq \&... \&... alias = my_func \&... my_list = [1, None, alias] \&... inception = my_list[2] \&... \&... inception()\(aq\(aq\(aq >>> script = jedi.Script(code) >>> >>> script.goto(8, 1) [] >>> >>> script.infer(8, 1) [] .EE .UNINDENT .UNINDENT.SS "مراجع (References)" .INDENT 0.0 .INDENT 3.5 .sp .EX >>> import jedi >>> code = \(aq\(aq\(aq\e \&... x = 3 \&... if 1 == 2: \&... x = 4 \&... else: \&... del x\(aq\(aq\(aq >>> script = jedi.Script(code) >>> rns = script.get_references(5, 8) >>> rns [, , ] >>> rns[1].line 3 >>> rns[1].column 4 .EE .UNINDENT .UNINDENT .SS "منسوخ‌سازی‌ها (Deprecations)" .sp فرآیند منسوخ‌سازی به شرح زیر است: .INDENT 0.0 .IP 1. 3 اعلام منسوخ‌سازی در هر نسخه‌ای ممکن است صورت گیرد. .IP 2. 3 نسخهٔ اصلی (major release) بعدی، قابلیت منسوخ‌شده را حذف می‌کند. .UNINDENT .SS "کلاس‌های بازگشتی API (API Return Classes)" .SS "کلاس پایه انتزاعی (Abstract Base Class)" .INDENT 0.0 .TP .B class jedi.api.classes.BaseName(inference_state, name) کلاس‌های پایه: \fBobject\fP \% .sp کلاس پایه برای تمام تعاریف، تکمیل‌ها و امضاها. .INDENT 7.0 .TP .B property module_path: Path \% | None \% مسیر فایل یک ماژول را نشان می‌دهد؛ مانند \fB/usr/lib/python3.14/os.py\fP .UNINDENT .INDENT 7.0 .TP .B property name نام متغیر/تابع/کلاس/ماژول. .sp برای مثال، برای \fBx = None\fP مقدار \fB\(aqx\(aq\fP را بازمی‌گرداند. .INDENT 7.0 .TP .B نوع بازگشتی (Return type) str \% یا None .UNINDENT .UNINDENT .INDENT 7.0 .TP .B property type نوع تعریف. .sp در اینجا مثالی از مقدار این صفت آورده شده است. بیایید کد منبع زیر را در نظر بگیریم. از آنجا که محتوای \fBvariable\fP برای Jedi بدون ابهام است، تابع \fBjedi.Script.infer()\fP \%<#\:jedi\:.Script\:.infer> باید فهرستی از تعاریف را برای \fBsys\fP، \fBf\fP، \fBC\fP و \fBx\fP بازگرداند. .sp .EX >>> from jedi import Script >>> source = \(aq\(aq\(aq \&... import keyword \&... \&... class C: \&... pass \&... \&... class D: \&... pass \&... \&... x = D() \&... \&... def f(): \&... pass \&... \&... for variable in [keyword, f, C, x]: \&... variable\(aq\(aq\(aq .EE .sp .EX >>> script = Script(source) >>> defs = script.infer() .EE .sp پیش از نمایش آنچه درون \fBdefs\fP است، بیایید آن را بر اساس \fBline\fP مرتب کنیم تا ارتباط دادن نتیجه با کد منبع آسان باشد. .sp .EX >>> defs = sorted(defs, key=lambda d: d.line) >>> print(defs) [, , , ] .EE .sp در نهایت، آنچه می‌توانید از \fBtype\fP دریافت کنید به شرح زیر است: .sp .EX >>> defs = [d.type for d in defs] >>> defs[0] \(aqmodule\(aq >>> defs[1] \(aqclass\(aq >>> defs[2] \(aqinstance\(aq >>> defs[3] \(aqfunction\(aq .EE .sp مقادیر معتبر برای نوع عبارتند از \fBmodule\fP، \fBclass\fP، \fBinstance\fP، \fBfunction\fP، \fBparam\fP، \fBpath\fP، \fBkeyword\fP، \fBproperty\fP و \fBstatement\fP\&. .UNINDENT .INDENT 7.0 .TP .B property module_name نام ماژول، تا حدودی شبیه به مقدار \fB__name__\fP در یک ماژول دلخواه پایتون. .sp .EX >>> from jedi import Script >>> source = \(aqimport json\(aq >>> script = Script(source, path=\(aqexample.py\(aq) >>> d = script.infer()[0] >>> print(d.module_name) json .EE .UNINDENT .INDENT 7.0 .TP .B in_builtin_module() در صورتی که این یک ماژول داخلی (builtin) باشد، مقدار True را برمی‌گرداند. .UNINDENT .INDENT 7.0 .TP .B property line خطی که تعریف در آن رخ داده است (شروع از ۱). .UNINDENT .INDENT 7.0 .TP .B property column ستونی که تعریف در آن رخ داده است (شروع از ۰). .UNINDENT .INDENT 7.0 .TP .B get_definition_start_position() موقعیت (سطر، ستون) نقطهٔ شروع محدودهٔ تعریف. سطرها از ۱ و ستون‌ها از ۰ شروع می‌شوند. .INDENT 7.0 .TP .B نوع بازگشتی (Return type) Optional[Tuple[int \%, int \%]] .UNINDENT .UNINDENT .INDENT 7.0 .TP .B get_definition_end_position() موقعیت (سطر، ستون) نقطهٔ پایان محدودهٔ تعریف. سطرها از ۱ و ستون‌ها از ۰ شروع می‌شوند. .INDENT 7.0 .TP .B نوع بازگشتی (Return type) Optional[Tuple[int \%, int \%]] .UNINDENT .UNINDENT .INDENT 7.0 .TP .B docstring(raw=False, fast=True) رشتهٔ مستندات (docstring) را برای این شیء تکمیل بازمی‌گرداند. .sp مثال:.sp .EX >>> from jedi import Script >>> source = \(aq\(aq\(aq\e \&... def f(a, b=1): \&... \(dqDocument for function f.\(dq \&... \(aq\(aq\(aq >>> script = Script(source, path=\(aqexample.py\(aq) >>> doc = script.infer(1, len(\(aqdef f\(aq))[0].docstring() >>> print(doc) f(a, b=1) Document for function f. .EE .sp توجه داشته باشید که اطلاعات مفید اضافی به docstring واقعی افزوده می‌شود؛ برای مثال امضای توابع در ابتدای docstring آن‌ها قرار می‌گیرد. اگر به docstring واقعی نیاز دارید، به جای آن از \fBraw=True\fP استفاده کنید. .sp .EX >>> print(script.infer(1, len(\(aqdef f\(aq))[0].docstring(raw=True)) Document for function f. .EE .INDENT 7.0 .TP .B پارامترها \fBfast\fP \-\- ایمپورت‌هایی را که تنها در یک سطح عمق دارند مانند \fBimport foo\fP دنبال نکن، اما \fBfrom foo import bar\fP را دنبال کن\&. این کار به دلایل افزایش سرعت منطقی است. در صورت استفاده از \fBfoo.docstring(fast=False)\fP روی تمام اشیاء، تکمیل \fIimport a\fP کند خواهد بود، چرا که تمام کتابخانه‌هایی را که با \fBa\fP شروع می‌شوند تجزیه می‌کند\&. .UNINDENT .UNINDENT .INDENT 7.0 .TP .B property description توصیفی از شیء \fBName\fP که به‌طور گسترده در آزمون‌ها استفاده می‌شود؛ برای مثال برای \fBisinstance\fP مقدار \fBdef isinstance\fP را برمی‌گرداند\&. .sp مثال: .sp .EX >>> from jedi import Script >>> source = \(aq\(aq\(aq \&... def f(): \&... pass \&... \&... class C: \&... pass \&... \&... variable = f if random.choice([0,1]) else C\(aq\(aq\(aq >>> script = Script(source) # line is maximum by default >>> defs = script.infer(column=3) >>> defs = sorted(defs, key=lambda d: d.line) >>> print(defs) [, ] >>> str(defs[0].description) \(aqdef f\(aq >>> str(defs[1].description) \(aqclass C\(aq .EE .UNINDENT .INDENT 7.0 .TP .B property full_name مسیر نقطه‌گذاری‌شدهٔ این شیء. .sp این مقدار به شکل \fB[.[...]][.]\fP است\&. زمانی کاربرد دارد که بخواهید در راهنمای پایتون به دنبال شیء مورد نظر بگردید. .sp مثال: .sp .EX >>> from jedi import Script >>> source = \(aq\(aq\(aq \&... import os \&... os.path.join\(aq\(aq\(aq >>> script = Script(source, path=\(aqexample.py\(aq) >>> print(script.infer(3, len(\(aqos.path.join\(aq))[0].full_name) os.path.join .EE .sp توجه داشته باشید که به جای (برای مثال) \fB\(aqposixpath.join\(aq\fP، مقدار \fB\(aqos.path.join\(aq\fP را برمی‌گرداند\&. این از نظر فنی دقیق نیست، چرا که نام ماژول \fB\(ga\fP خواهد بود\&. با این حال بیشتر کاربران این شیوه را کاربردی‌تر می‌دانند. .UNINDENT .INDENT 7.0 .TP .B is_stub() اگر نام فعلی در یک فایل stub تعریف شده باشد، مقدار True را برمی‌گرداند. .UNINDENT .INDENT 7.0 .TP .B is_side_effect() بررسی می‌کند که آیا یک نام به‌صورت \fBself.foo = 3\fP تعریف شده است یا خیر\&. در مورد self، این تابع مقدار False و برای foo مقدار True را برمی‌گرداند. .UNINDENT .INDENT 7.0 .TP .B goto(*, follow_imports=False, follow_builtin_imports=False, only_stubs=False, prefer_stubs=False) مشابه \fBScript.goto()\fP \%<#\:jedi\:.Script\:.goto> (همچنین از همان پارامترها پشتیبانی می‌کند)، اما این کار را برای نام فعلی انجام می‌دهد. این متد معمولاً زمانی کاربرد دارد که از مواردی مانند \fBScript.get_names()\fP \%<#\:jedi\:.Script\:.get_names> استفاده می‌کنید\&. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBfollow_imports\fP \-\- فراخوانی goto ایمپورت‌ها را دنبال خواهد کرد. .IP \(bu 2 \fBfollow_builtin_imports\fP \-\- در صورتی که follow_imports برابر با True باشد، تلاش می‌کند نام‌ها را در builtins (یعنی ماژول‌های کامپایل‌شده یا افزونه‌ها) جستجو کند. .IP \(bu 2 \fBonly_stubs\fP \-\- برای این فراخوانی goto، تنها stubها را برمی‌گرداند. .IP \(bu 2 \fBprefer_stubs\fP \-\- برای این فراخوانی goto، stubها را به اشیاء پایتون ترجیح می‌دهد. .UNINDENT .TP .B نوع بازگشتی لیستی از \fBName\fP .UNINDENT .UNINDENT .INDENT 7.0 .TP .B infer(*, only_stubs=False, prefer_stubs=False) مشابه \fBScript.infer()\fP \%<#\:jedi\:.Script\:.infer>، می‌تواند برای درک اینکه نام فعلی چه نوعی دارد مفید باشد. .sp تعاریف واقعی را برمی‌گرداند. اکیداً توصیه می‌کنم از آن برای تکمیل‌های خودکار خود استفاده نکنید، زیرا ممکن است باعث کندی Jedi شود\&. اگر فقط قصد خواندن تعداد کمی شیء (<=20) را دارید، ممکن است مفید باشد، به‌ویژه برای دریافت docstringهای اصلی. مشکل بنیادین این تابع این است که تمام نتایج را دنبال می‌کند. این بدان معناست که با ۱۰۰۰ تکمیل خودکار (مانند numpy)، بسیار بسیار کند خواهد بود. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBonly_stubs\fP \-\- برای این فراخوانی goto، تنها stubها را برمی‌گرداند. .IP \(bu 2 \fBprefer_stubs\fP \-\- برای این فراخوانی استنتاج نوع، stubها را به اشیاء پایتون ترجیح می‌دهد. .UNINDENT .TP .B نوع بازگشتی لیستی از \fBName\fP .UNINDENT .UNINDENT .INDENT 7.0 .TP .B parent() دامنهٔ والد (parent scope) این شناسه را برمی‌گرداند. .INDENT 7.0 .TP .B نوع بازگشتی Name \%<#\:jedi\:.api\:.classes\:.Name> .UNINDENT .UNINDENT .INDENT 7.0 .TP .B get_line_code(before=0, after=0) خط کدی را که این شیء در آن تعریف شده است برمی‌گرداند. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBbefore\fP \-\- افزودن n خط قبل از خط فعلی به خروجی. .IP \(bu 2 \fBafter\fP \-\- افزودن n خط بعد از خط فعلی به خروجی. .UNINDENT .TP .B مقدار بازگشتی str خط (یا خطوط) کد را برمی‌گرداند یا در صورتی که یک تابع توکار (builtin) باشد، یک رشته خالی برمی‌گرداند. .UNINDENT .UNINDENT .INDENT 7.0.TP .B get_signatures() همهٔ امضاهای محتمل را برای یک تابع یا کلاس برمی‌گرداند. در صورت استفاده از stubهای پایتون به همراه \fB@overload\fP\&، وجود چندین امضا امری متداول است. .INDENT 7.0 .TP .B نوع بازگشتی فهرستی از \fBBaseSignature\fP .UNINDENT .UNINDENT .INDENT 7.0 .TP .B execute() از استنتاج نوع (type inference) برای \(dqاجرای\(dq این شناسه استفاده کرده و اشیای اجراشده را برمی‌گرداند. .INDENT 7.0 .TP .B نوع بازگشتی فهرستی از \fBName\fP .UNINDENT .UNINDENT .INDENT 7.0 .TP .B get_type_hint() راهنماهای نوع نظیر \fBIterable[int]\fP یا \fBUnion[int, str]\fP را برمی‌گرداند\&. .sp این متد ممکن است به‌ویژه برای توابع بسیار کُند باشد. مسئله، یافتن اجراهایی برای آن توابع است تا مقداری مانند \fBCallable[[int, str], str]\fP را بازگرداند\&. .INDENT 7.0 .TP .B نوع بازگشتی str \% .UNINDENT .UNINDENT .UNINDENT .SS Name .INDENT 0.0 .TP .B class jedi.api.classes.Name(inference_state, definition) کلاس‌های پایه: \fBBaseName\fP .sp اشیای \fIName\fP از APIهای گوناگونی از جمله \fBScript.goto()\fP \%<#\:jedi\:.Script\:.goto> یا \fBScript.infer()\fP \%<#\:jedi\:.Script\:.infer> بازگردانده می‌شوند\&. .INDENT 7.0 .TP .B defined_names() تعریف‌های زیرمجموعه (مانند متدهای درون یک کلاس) را فهرست می‌کند. .INDENT 7.0 .TP .B نوع بازگشتی فهرستی از \fBName\fP .UNINDENT .UNINDENT .INDENT 7.0 .TP .B is_definition() اگر به عنوان یک نام در یک عبارت، تابع یا کلاس تعریف شده باشد مقدار True، و چنانچه ارجاعی به چنین تعریفی باشد مقدار False را برمی‌گرداند. .UNINDENT .UNINDENT .SS Completion .INDENT 0.0 .TP .B class jedi.api.classes.Completion(inference_state, name, stack, like_name_length, is_fuzzy, cached_name=None) کلاس‌های پایه: \fBBaseName\fP .sp اشیای \fBCompletion\fP از \fBScript.complete()\fP \%<#\:jedi\:.Script\:.complete> بازگردانده می‌شوند\&. آن‌ها اطلاعات بیشتری را دربارهٔ یک تکمیل ارائه می‌دهند. .INDENT 7.0 .TP .B property complete تنها با تکمیل‌های غیرفازی (non\-fuzzy) کار می‌کند. در صورت استفاده از تکمیل‌های فازی، مقدار None برمی‌گرداند. .sp باقی‌ماندهٔ کلمه را برمی‌گرداند؛ برای نمونه در تکمیل \fBisinstance\fP: .INDENT 7.0 .INDENT 3.5 .sp .EX isinstan# <\-\- Cursor is here .EE .UNINDENT .UNINDENT .sp رشتهٔ \(aqce\(aq را برمی‌گرداند. همچنین بسته به \fBsettings.py\fP شما، موارد دیگری را نیز می‌افزاید\&. .sp با فرض تعریف تابع زیر: .INDENT 7.0 .INDENT 3.5 .sp .EX def foo(param=0): pass .EE .UNINDENT .UNINDENT .sp تکمیل عبارت \fBfoo(par\fP یک \fBCompletion\fP ارائه می‌دهد که مقدار \fBcomplete\fP آن برابر با \fBam=\fP خواهد بود\&. .UNINDENT .INDENT 7.0 .TP .B property name_with_symbols مشابه \fBname\fP است، اما مانند \fBname\fP نمادها را نیز برمی‌گرداند؛ برای نمونه با فرض تعریف تابع زیر: .INDENT 7.0 .INDENT 3.5 .sp .EX def foo(param=0): pass .EE .UNINDENT .UNINDENT .sp تکمیل عبارت \fBfoo(\fP یک \fBCompletion\fP ارائه می‌دهد که مقدار \fBname_with_symbols\fP آن برابر با \(dqparam=\(dq خواهد بود. .UNINDENT .INDENT 7.0 .TP .B docstring(raw=False, fast=True) در \fBBaseName.docstring()\fP مستندسازی شده است\&. .UNINDENT .INDENT 7.0 .TP .B property type در \fBBaseName.type()\fP مستندسازی شده است\&. .UNINDENT .INDENT 7.0 .TP .B get_completion_prefix_length() طول پیشوندی را که در حال تکمیل است برمی‌گرداند. برای نمونه در تکمیل \fBisinstance\fP: .INDENT 7.0 .INDENT 3.5 .sp .EX isinstan# <\-\- Cursor is here .EE .UNINDENT .UNINDENT .sp مقدار 8 را برمی‌گرداند، چرا که len(\(aqisinstan\(aq) == 8 است. .sp با فرض تعریف تابع زیر: .INDENT 7.0 .INDENT 3.5 .sp .EX def foo(param=0): pass .EE .UNINDENT .UNINDENT .sp تکمیل عبارت \fBfoo(par\fP مقدار 3 را برمی‌گرداند. .UNINDENT .UNINDENT.SS BaseSignature .INDENT 0.0 .TP .B class jedi.api.classes.BaseSignature(inference_state, signature) کلاس‌های پایه: \fBName\fP .sp این امضاها توسط فراخوانی‌های \fBBaseName.get_signatures()\fP بازگردانده می‌شوند. .INDENT 7.0 .TP .B property params تعاریف تمام پارامترهایی را که یک امضا مشخص می‌کند بازمی‌گرداند. این شامل مواردی مانند \fB*args\fP و \fB**kwargs\fP می‌شود. .INDENT 7.0 .TP .B نوع بازگشتی فهرستی از \fBParamName\fP .UNINDENT .UNINDENT .INDENT 7.0 .TP .B to_string() یک نمایش متنی از امضا را بازمی‌گرداند. این می‌تواند به عنوان مثال شبیه \fBfoo(bar, baz: int, **kwargs)\fP باشد. .INDENT 7.0 .TP .B نوع بازگشتی str \% .UNINDENT .UNINDENT .UNINDENT .SS Signature .INDENT 0.0 .TP .B class jedi.api.classes.Signature(inference_state, signature, call_details) کلاس‌های پایه: \fBBaseSignature\fP .sp یک شیء کامل امضا، مقدار بازگشتی \fBScript.get_signatures()\fP \%<#\:jedi\:.Script\:.get_signatures>\& است. .INDENT 7.0 .TP .B property index اندیس پارامترِ موقعیت فعلی مکان‌نما را بازمی‌گرداند. اگر اندیس در فراخوانی فعلی یافت نشود، None بازمی‌گرداند. .INDENT 7.0 .TP .B نوع بازگشتی int \% .UNINDENT .UNINDENT .INDENT 7.0 .TP .B property bracket_start یک تاپل سطر/ستون از قلابی که مسئول آخرین فراخوانی تابع است را بازمی‌گرداند. سطر اول ۱ و ستون اول ۰ است. .INDENT 7.0 .TP .B نوع بازگشتی int \%, int \% .UNINDENT .UNINDENT .UNINDENT .SS ParamName .INDENT 0.0 .TP .B class jedi.api.classes.ParamName(inference_state, definition) کلاس‌های پایه: \fBName\fP .INDENT 7.0 .TP .B infer_default() مقادیر پیش‌فرض را مانند \fB1\fP در \fBdef foo(x=1):\fP بازمی‌گرداند. .INDENT 7.0 .TP .B نوع بازگشتی فهرستی از \fBName\fP .UNINDENT .UNINDENT .INDENT 7.0 .TP .B infer_annotation(**kwargs) .INDENT 7.0 .TP .B پارامترها \fBexecute_annotation\fP \-\- پیش‌فرض True؛ اگر False باشد، مقادیر اجرا نمی‌شوند و به‌جای نمونه‌ها، کلاس‌ها بازگردانده می‌شوند. .TP .B نوع بازگشتی فهرستی از \fBName\fP .UNINDENT .UNINDENT .INDENT 7.0 .TP .B to_string() یک نمایش ساده از یک پارامتر را بازمی‌گرداند، مانند \fBf: Callable[..., Any]\fP\&. .INDENT 7.0 .TP .B نوع بازگشتی str \% .UNINDENT .UNINDENT .INDENT 7.0 .TP .B property kind یک نمونه enum از شمارشیِ \fBParameter\fP در ماژول \fBinspect\fP \% را بازمی‌گرداند. .INDENT 7.0 .TP .B نوع بازگشتی \fBinspect.Parameter.kind\fP \% .UNINDENT .UNINDENT .UNINDENT.SS بازسازی کد (Refactoring) .INDENT 0.0 .TP .B class jedi.api.refactoring.Refactoring(inference_state, file_to_node_changes, renames=()) کلاس‌های پایه: \fBobject\fP \% .INDENT 7.0 .TP .B get_renames() -> Iterable \%[Tuple \%[Path \%, Path \%]] فایل‌ها می‌توانند در یک بازسازی کد تغییر نام داده شوند. .UNINDENT .INDENT 7.0 .TP .B apply() کل بازسازی کد را روی فایل‌ها اعمال می‌کند، که شامل تغییر نام‌ها نیز می‌شود. .UNINDENT .UNINDENT .INDENT 0.0 .TP .B class jedi.api.errors.SyntaxError(parso_error) کلاس‌های پایه: \fBobject\fP \% .sp خطاهای نحوی توسط \fBScript.get_syntax_errors()\fP \%<#\:jedi\:.Script\:.get_syntax_errors>\& تولید می‌شوند. .INDENT 7.0 .TP .B property line سطری که خطا از آنجا آغاز می‌شود (شروع از ۱). .UNINDENT .INDENT 7.0 .TP .B property column ستونی که خطا از آنجا آغاز می‌شود (شروع از ۰). .UNINDENT .INDENT 7.0 .TP .B property until_line سطری که خطا در آن به پایان می‌رسد (شروع از ۱). .UNINDENT .INDENT 7.0 .TP .B property until_column ستونی که خطا در آن به پایان می‌رسد (شروع از ۰). .UNINDENT .UNINDENT .SS نصب و پیکربندی (Installation and Configuration) .sp \fBهشدار:\fP .INDENT 0.0 .INDENT 3.5 بیشتر افراد ترجیح می‌دهند Jedi را به عنوان یک زیرماژول (submodule) یا به صورت درون‌پروژه‌ای (vendored) نصب کنند و نه از طریق pip یا در سطح سراسری سیستم. دلیل این امر آن است که منطقی است افزونه‌ای که از Jedi استفاده می‌کند، همواره به آن دسترسی داشته باشد. در غیر این صورت، هنگامی که virtualenvها فعال شوند، Jedi به درستی کار نخواهد کرد. بنابراین لطفاً برای نصب Jedi، مستندات افزونه ویرایشگر یا IDE خود را مطالعه کنید. .sp برای توسعه‌دهندگان افزونه، Jedi زمانی بهترین عملکرد را دارد که همواره در دسترس باشد. استفاده از روش الحاق درون‌برنامه‌ای (Vendoring) گزینه‌ای بسیار مناسب برای این منظور است. .UNINDENT .UNINDENT .sp می‌توانید Jedi را به عنوان یک زیرماژول در افزونه ویرایشگر متن خود بگنجانید (مانند کاری که jedi\-vim \% به طور پیش‌فرض انجام می‌دهد)، یا می‌توانید آن را در سطح کل سیستم نصب کنید. .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 این کار فقط کتابخانه Jedi را نصب می‌کند، نه افزونه‌های ویرایشگر \%<#\:editor-plugins>\& را. برای اطلاعات در مورد چگونگی راه‌اندازی و هماهنگ‌سازی آن با ویرایشگر خود، به مستندات مربوطه مراجعه کنید. .UNINDENT .UNINDENT .SS روش معمول (The normal way) .sp اکثر افراد از Jedi همراه با افزونه‌های ویرایشگر \%<#\:editor-plugins>\& استفاده می‌کنند. معمولاً با نصب افزونه ویرایشگر، Jedi نیز نصب می‌شود. به مراحل اضافه‌ای نیاز نیست؛ فقط کافی است نگاهی به دستورالعمل‌های افزونه بیندازید. .SS با pip (With pip) .sp در هر سیستمی می‌توانید Jedi را مستقیماً از نمایه بسته‌های پایتون (Python Package Index) با استفاده از pip نصب کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX sudo pip install jedi .EE .UNINDENT .UNINDENT .sp اگر می‌خواهید نسخه در حال توسعه فعلی (شاخه master) را نصب کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX sudo pip install \-e git+https://github.com/davidhalter/jedi.git#egg=jedi .EE .UNINDENT .UNINDENT.SS نصب سراسری در سیستم از طریق یک مدیر بسته .SS Arch Linux .sp شما می‌توانید Jedi را مستقیماً از بسته‌های رسمی Arch Linux نصب کنید: .INDENT 0.0 .IP \(bu 2 python\-jedi \% .UNINDENT .sp (نسخه بسته‌بندی‌شده‌ای از افزونه vim نیز موجود است: vim\-jedi در Arch Linux \%\&.) .SS Debian .sp بسته‌های Debian در مخزن unstable موجود هستند \%\&. .SS سایر موارد .sp ما در حال گفتگو برای افزودن Jedi به مخازن Fedora هستیم. .SS نصب دستی از GitHub .sp اگر ترجیح می‌دهید از یک نصب‌کننده خودکار بسته استفاده نکنید، می‌توانید سورس‌کد را از GitHub کلون کرده و آن را به‌صورت دستی نصب کنید. برای نصب آن، این دستورات را اجرا کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX git clone \-\-recurse\-submodules https://github.com/davidhalter/jedi cd jedi sudo python setup.py install .EE .UNINDENT .UNINDENT .SS درج به‌صورت یک submodule .sp اگر از افزونه‌های ویرایشگر مانند jedi\-vim \% استفاده می‌کنید، می‌توانید به سادگی Jedi را به‌عنوان یک submodule در دایرکتوری افزونه قرار دهید. مدیران افزونه Vim مانند Vundle \% یا Pathogen \% به‌روز نگه‌داشتن submoduleها را بسیار ساده می‌کنند. .SS تنظیمات (Settings) .sp این ماژول حاوی متغیرهایی با تنظیمات سراسری Jedi است. برای تغییر دادن رفتار Jedi، متغیرهای تعریف‌شده در \fBjedi.settings\fP را تغییر دهید. .sp افزونه‌ها باید رابطی ارائه دهند تا کاربر بتواند پیکربندی را تنظیم کند. .sp نمونه استفاده: .INDENT 0.0 .INDENT 3.5 .sp .EX from jedi import settings settings.case_insensitive_completion = True .EE .UNINDENT .UNINDENT .SS خروجی تکمیل (Completion output) .INDENT 0.0 .TP .B jedi.settings.case_insensitive_completion = True تکمیل‌ها به صورت پیش‌فرض به کوچک و بزرگ بودن حروف حساس نیستند (case insensitive). .UNINDENT .INDENT 0.0 .TP .B jedi.settings.add_bracket_after_function = False یک براکت/پرانتز بازشونده پس از تابع برای تکمیل خودکار اضافه می‌کند. .UNINDENT .SS حافظه پنهان فایل‌سیستم (Filesystem cache) .INDENT 0.0 .TP .B jedi.settings.cache_directory = \(aq/build/.cache/jedi\(aq مسیری که حافظه پنهان (cache) در آن ذخیره می‌شود. .sp در Linux، مقدار پیش‌فرض آن \fB~/.cache/jedi/\fP، در OS X برابر با \fB~/Library/Caches/Jedi/\fP و در Windows برابر با \fB%LOCALAPPDATA%\eJedi\eJedi\e\fP است. در Linux، اگر متغیر محیطی \fB$XDG_CACHE_HOME\fP تنظیم شده باشد، \fB$XDG_CACHE_HOME/jedi\fP به جای مسیر پیش‌فرض استفاده می‌شود. .UNINDENT .SS تجزیه‌کننده (Parser) .INDENT 0.0 .TP .B jedi.settings.fast_parser = True از تجزیه‌کننده تفاضلی (diff parser) متعلق به Parso استفاده می‌کند. در صورت فعال بودن، ممکن است مشکلاتی ایجاد کند؛ لطفاً هشدار موجود در \fBScript\fP \%<#\:jedi\:.Script> را مطالعه کنید. این قابلیت امکان بازتجزیه تنها بخش‌هایی را فراهم می‌کند که تغییر کرده‌اند، در حالی که باقی درخت نحو (syntax tree) مجدداً استفاده می‌شود. .UNINDENT.SS قابلیت‌های پویا (Dynamic stuff) .INDENT 0.0 .TP .B jedi.settings.dynamic_array_additions = True بررسی برای \fIappend\fP و غیره روی آرایه‌ها: []، {}، () و همچنین فراخوانی‌های list/set. .UNINDENT .INDENT 0.0 .TP .B jedi.settings.dynamic_params = True تکمیل پویای پارامترها؛ توابع فراخوانده‌شده‌ای (callees) را می‌یابد که پارامترهای یک تابع را تعریف می‌کنند. .UNINDENT .INDENT 0.0 .TP .B jedi.settings.dynamic_params_for_other_modules = True همین کار را برای سایر ماژول‌ها انجام می‌دهد. .UNINDENT .INDENT 0.0 .TP .B jedi.settings.auto_import_modules = [\(aqgi\(aq] ماژول‌هایی که تحلیل نخواهند شد، بلکه در صورت داشتن کد Python، ایمپورت می‌شوند. این گزینه تکمیل خودکار را برای کتابخانه‌هایی که از \fBsetattr\fP یا تغییرات \fBglobals()\fP زیاد استفاده می‌کنند، بهبود می‌بخشد. .UNINDENT .SS ذخیره‌سازی موقت (Caching) .INDENT 0.0 .TP .B jedi.settings.call_signatures_validity = 3.0 یافتن فراخوانی‌های تابع ممکن است کُند باشد (0.1\-0.5s). این مقدار برای نوشتن عادی کد قابل قبول نیست؛ بنابراین آن را برای مدتی کوتاه در حافظه موقت (cache) ذخیره می‌کند. .UNINDENT .SS توسعه Jedi (Jedi Development) .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 این مستندات برای توسعه‌دهندگان Jedi است که می‌خواهند خودِ Jedi را بهبود دهند، اما اطلاعی از نحوه کارکرد Jedi ندارند. اگر می‌خواهید از Jedi در IDE خود استفاده کنید، به plugin api در \%\& نگاهی بیندازید. همچنین مهم است توجه داشته باشید که این نسخه نسبتاً قدیمی است و ممکن است برخی موارد دیگر اعمال نشوند. .UNINDENT .UNINDENT .SS مقدمه (Introduction) .sp این صفحه تلاش می‌کند تا به نیاز اساسی برای مستندسازی سازوکارهای داخلی Jedi پاسخ دهد. درک یک زبان پویا کاری پیچیده است؛ به‌ویژه از آنجا که استنتاج نوع (type inference) در Python می‌تواند فرآیندی بسیار بازگشتی باشد. از این رو Jedi نتوانسته است از پیچیدگی دوری کند. می‌دانم که \fBساده بهتر از پیچیده است\fP، اما متأسفانه گاهی برای فهمیدن سیستم‌های پیچیده، به راه‌حل‌های پیچیده نیاز است. .sp در شش فصل تلاش می‌کنم سازوکارهای داخلی Jedi را توصیف کنم: .INDENT 0.0 .IP \(bu 2 هسته Jedi .IP \(bu 2 افزونه‌های هسته .IP \(bu 2 ایمپورت‌ها و ماژول‌ها (Imports & Modules) .IP \(bu 2 استاب‌ها و حاشیه‌نویسی‌ها (Stubs & Annotations) .IP \(bu 2 ذخیره‌سازی موقت و بازگشت‌ها (Caching & Recursions) .IP \(bu 2 ماژول‌های کمکی .UNINDENT .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 آزمون‌ها (Testing) در اینجا مستند نشده‌اند؛ می‌توانید آن‌ها را در اینجا \%\& بیابید. .UNINDENT .UNINDENT .SS هسته Jedi (The Jedi Core) .sp هسته Jedi از سه بخش تشکیل شده است: .INDENT 0.0 .IP \(bu 2 تجزیه‌کننده (Parser) .IP \(bu 2 استنتاج نوع Python .IP \(bu 2 API .UNINDENT .sp بیشتر افراد احتمالاً به استنتاج نوع علاقه‌مند هستند، زیرا تمام جادو در آنجا اتفاق می‌افتد. ابتدا باید تجزیه‌کننده (parser) را معرفی کنم، زیرا \fBjedi.inference\fP به‌طور گسترده از آن استفاده می‌کند..SS تجزیه‌کننده (Parser) .sp پروژه Jedi در گذشته تجزیه‌کنندهٔ درونی خود را داشت، با این حال این بخش اکنون یک پروژهٔ جداگانه است و parso نام دارد \%\&. .sp این تجزیه‌کننده یک درخت نحو ایجاد می‌کند که Jedi آن را تحلیل کرده و تلاش می‌کند آن را بفهمد. گرامری که این تجزیه‌کننده استفاده می‌کند بسیار شبیه به فایل‌های رسمی گرامر پایتون است \%\&. .SS استنتاج نوع در کد پایتون (inference/__init__.py) .sp استنتاج نوع کد پایتون در Jedi بر پایهٔ سه فرض بنا شده است: .INDENT 0.0 .IP \(bu 2 کد تا حد امکان کمترین اثرات جانبی (side effects) را داشته باشد. Jedi برخی از تغییرات list/tuple/set را متوجه می‌شود، اما هیچ تضمینی وجود ندارد که Jedi همه چیز را تشخیص دهد (برای مثال list.append در ماژول‌های مختلف). .IP \(bu 2 هیچ جادویی (magic) به کار نرفته باشد: .INDENT 2.0 .IP \(bu 2 ابَرکلاس‌ها (metaclasses) .IP \(bu 2 \fBsetattr()\fP / \fB__import__()\fP .IP \(bu 2 نوشتن در \fBglobals()\fP، \fBlocals()\fP، \fBobject.__dict__\fP .UNINDENT .IP \(bu 2 برنامه‌نویس کدهای کاملاً موذیانه و مردم‌آزارانه ننویسد، برای نمونه مانند این مورد \% :\-) .UNINDENT .sp الگوریتم اصلی بر مبنای اصلی است که من آن را «استنتاج تنبل نوع» (lazy type inference) می‌نامم. با این حال، نقطهٔ ورود معمول برای تحلیل ایستا، فراخوانی \fBinfer_expr_stmt\fP است. منطق جداگانه‌ای برای تکمیل خودکار در API وجود دارد، و تمام وظیفهٔ inference_state استنتاج یک عبارت (expression) است. .sp یادداشت TODO: این پاراگراف دیگر دقیقاً بیانگر آنچه jedi انجام می‌دهد نیست؛ مشابه است، اما یکسان نیست. .sp اکنون باید بدانید چه چیزی پس از \fBinfer_expr_stmt\fP رخ می‌دهد. بیایید یک مثال بزنیم: .INDENT 0.0 .INDENT 3.5 .sp .EX import datetime datetime.date.toda# <\-\- cursor here .EE .UNINDENT .UNINDENT .sp پیش از هر چیز، این ماژول اهمیتی به تکمیل خودکار نمی‌دهد. واقعاً فقط به \fBdatetime.date\fP اهمیت می‌دهد. در پایان فرایند، \fBinfer_expr_stmt\fP کلاس \fBdate\fP را بازمی‌گرداند. .sp برای \fIتجسم\fP این موضوع (به‌صورت ساده‌شده): .INDENT 0.0 .IP \(bu 2 تابع \fBInferenceState.infer_expr_stmt\fP کار زیادی انجام نمی‌دهد، زیرا هیچ انتسابی وجود ندارد. .IP \(bu 2 تابع \fBContext.infer_node\fP به تفکیک مسیر نقطه‌دار (dotted path) می‌پردازد. .IP \(bu 2 تابع \fBInferenceState.find_types\fP تعاریف سراسری datetime را با پیمایش درخت نحو جستجو می‌کند، که آن را در تعریف یک import می‌یابد. .IP \(bu 2 با استفاده از منطق import، ماژول datetime پیدا می‌شود. .IP \(bu 2 اکنون \fBfind_types\fP دوباره توسط \fBinfer_node\fP فراخوانی می‌شود تا \fBdate\fP را درون ماژول datetime پیدا کند. .UNINDENT .sp حال اگر \fBdatetime.date.foo.bar\fP را می‌خواستیم چه می‌شد؟ دو فراخوانی دیگر برای \fBfind_types\fP انجام می‌گرفت. با این حال فراخوانی دوم نادیده گرفته می‌شد، زیرا اولی چیزی بازنمی‌گرداند (هیچ مشخصهٔ foo در \fBdate\fP وجود ندارد). .sp اگر import حاوی یک \fBExprStmt\fP دیگر باشد چطور، مانند این: .INDENT 0.0 .INDENT 3.5 .sp .EX from foo import bar Date = bar.baz .EE .UNINDENT .UNINDENT .sp خب... متوجه شدید. صرفاً یک بازگشت (recursion) دیگر برای \fBinfer_expr_stmt\fP است. واقعاً ساده است. پایتون مشخصاً می‌تواند بسیار پیچیده‌تر از این شود. برای درک انتساب‌های تاپل، خلاصه‌سازی لیست‌ها (list comprehensions) و هر چیز دیگری، کدهای بسیار بیشتری باید نوشته می‌شد. .sp پروژه Jedi بسیار خوب آزمایش شده است، بنابراین می‌توانید با خیال راحت شروع به دستکاری کد کنید. بهتر است ابتدا آزمون اختصاصی خود را برای ویژگی \(dqجدید\(dq بنویسید. از خراب کردن بخش‌ها نترسید. تا زمانی که آزمون‌ها پاس شوند، به احتمال زیاد مشکلی نخواهید داشت. .sp باید در اینجا اشاره کنم که استنتاج تنبل نوع واقعاً عالی است زیرا تنها چیزی را \fIاستنتاج می‌کند\fP که نیاز به \fIاستنتاج شدن\fP دارد. تمام گزاره‌ها و ماژول‌هایی که استفاده نمی‌شوند، صرفاً نادیده گرفته می‌شوند..SS مقادیر استنتاج (inference/base_value.py) .sp مقادیر همان \(dqvalues\(dq هستند که Python بازمی‌گرداند. با این حال، Values هم‌زمان همان \(dqمقادیری\(dq نیز هستند که کاربر در حال حاضر درون آن‌ها قرار دارد. .sp یک ValueSet معمولاً برای تعیین مقدار بازگشتی یک تابع یا هر عملیات تحلیل ایستای دیگر استفاده می‌شود. در Jedi همواره چندین مقدار بازگشتی وجود دارد و نه فقط یکی. .SS تفکیک نام (inference/finder.py) .sp جستجو برای نام‌ها با دامنه (scope) و نام مشخص. این موضوع در Jedi و Python نقشی بسیار محوری دارد. تفکیک نام با وجود descripter، \fB__getattribute__\fP، \fB__getattr__\fP، \fBglobal\fP و غیره کاملاً پیچیده است. .sp اگر می‌خواهید تفکیک نام را درک کنید، لطفاً چند فصل اول در \%\& را مطالعه کنید. .SS بررسی‌های جریان (Flow checks) .sp بررسی‌های جریان چندان بالغ و کامل نیستند. تنها یک بررسی برای \fBisinstance\fP وجود دارد. این ویژگی بررسی می‌کند که آیا یک جریان به شکل \fBif isinstance(a, type_or_tuple)\fP هست یا خیر. متأسفانه هر مورد دیگری نادیده گرفته می‌شود (به‌عنوان مثال، بررسی a == \(aq\(aq آسان بود \-> a یک رشته است). پتانسیل بالایی در این بررسی‌ها وجود دارد. .SS رابط برنامه‌نویسی API (api/__init__.py و api/classes.py) .sp رابط برنامه‌نویسی (API) طوری طراحی شده است که استفاده از آن تا حد امکان آسان باشد. مستندات API را می‌توان در اینجا یافت: \%\&. خود API شامل کد اندکی است که نیاز به ذکر آن در اینجا باشد. عموماً تلاش می‌کنم در مورد API محافظه‌کار باشم. ترجیح می‌دهم ویژگی‌های جدیدی به API اضافه نکنم مگر اینکه واقعاً ضروری باشند، زیرا منسوخ کردن قابلیت‌ها بسیار دشوارتر از افزودن آن‌ها در آینده است. .SS افزونه‌های هسته (Core Extensions) .sp افزونه‌های هسته خلاصه‌ای از موضوعات زیر است: .INDENT 0.0 .IP \(bu 2 پیمایش‌پذیرها و آرایه‌های پویا (Iterables & Dynamic Arrays) .IP \(bu 2 پارامترهای پویا (Dynamic Parameters) .IP \(bu 2 رشته‌های مستندات (Docstrings) .IP \(bu 2 بازآفرینی کد (Refactoring) .UNINDENT .sp این موضوعات برای درک اقدامات مضاعفی که Jedi انجام می‌دهد بسیار مهم هستند، اما می‌توان آن‌ها را از Jedi حذف کرد و Jedi همچنان کار خواهد کرد؛ هرچند کندتر و بدون برخی از قابلیت‌ها. .SS پیمایش‌پذیرها و آرایه‌های پویا (inference/value/iterable.py) .sp برای درک عمیق‌تر Python، لازم است Jedi برخی از قابلیت‌های پویای Python مانند لیست‌هایی که پس از ایجاد پر می‌شوند را بفهمد: .sp شامل تمام کلاس‌ها و توابعی است که به‌طور کلی با lists، dicts، مولدها (generators) و تکرارکننده‌ها (iterators) سر و کار دارند. .SS تکمیل پارامتر (inference/dynamic_params.py) .sp یکی از ویژگی‌های واقعاً مهم Jedi این است که گزینه‌ای برای درک کدهایی نظیر این داشته باشد: .INDENT 0.0 .INDENT 3.5 .sp .EX def foo(bar): bar. # completion here foo(1) .EE .UNINDENT .UNINDENT .sp شکی نیست که آیا bar یک \fBint\fP است یا خیر، اما اگر فراخوانی دیگری نیز مانند \fBfoo(\(aqstr\(aq)\fP وجود داشته باشد، چه رخ خواهد داد؟ خوب، ما صرفاً هر دو را نشان می‌دهیم؛ زیرا این دقیقاً همان چیزی است که یک انسان انتظار دارد. .sp روال کار به این صورت است: .INDENT 0.0 .IP \(bu 2 Jedi یک پارامتر را مشاهده می‌کند .IP \(bu 2 جستجو برای فراخوانی‌های تابع با نام \fBfoo\fP .IP \(bu 2 اجرای این فراخوانی‌ها و بررسی ورودی. .UNINDENT.SS رشته‌های مستندات (inference/docstrings.py) .sp رشته‌های مستندات (Docstrings) منبع اطلاعاتی دیگری برای توابع و کلاس‌ها هستند. \fBjedi.inference.dynamic_params\fP تلاش می‌کند تا تمامی اجراهای توابع را بیابد، در حالی که تجزیهٔ رشته‌های مستندات بسیار آسان‌تر است. سه نوع مختلف از رشته‌های مستندات وجود دارد که Jedi آن‌ها را می‌فهمد: .INDENT 0.0 .IP \(bu 2 Sphinx \% .IP \(bu 2 Epydoc \% .IP \(bu 2 Numpydoc \% .UNINDENT .sp برای نمونه، حاشیه‌نویسی اسفینکس \fB:type foo: str\fP به‌روشنی بیان می‌کند که نوعِ \fBfoo\fP برابر با \fBstr\fP است\&. .sp به‌عنوان مکملی برای جستجوی پارامترها، این ماژول همچنین حاشیه‌نویسی‌های بازگشتی را ارائه می‌دهد. .SS بازآرایی (api/refactoring.py) .SS وارد کردن‌ها و ماژول‌ها (Imports & Modules) .INDENT 0.0 .IP \(bu 2 ماژول‌ها \% .IP \(bu 2 ماژول‌های توکار .IP \(bu 2 وارد کردن‌ها .UNINDENT .SS ماژول‌های کامپایل‌شده (inference/compiled.py) .SS وارد کردن‌ها (inference/imports.py) .sp \fBjedi.inference.imports\fP برای تفکیک دستورهای import و بازگرداندن ماژول‌ها/کلاس‌ها/توابع یا هر آنچه که معرف آن هستند به کار می‌رود. با این وجود، هیچ عمل وارد کردنِ واقعی انجام نمی‌گیرد. این ماژول به یافتن ماژول‌ها در سیستم‌فایل می‌پردازد. این کار گاهی می‌تواند بسیار قلق‌دار باشد، چرا که وارد کردن‌ها در پایتون همواره آن‌قدر ساده نیستند. .sp این ماژول همچنین از تکمیل خودکار دستورهای import پشتیبانی می‌کند، بدین معنا که عباراتی مانند \fBfrom datetim\fP را تکمیل می‌کند (قرار گرفتن مکان‌نما در انتها \fBdatetime\fP را بازمی‌گرداند). .SS استاب‌ها و حاشیه‌نویسی‌ها (inference/gradual) .sp متأسفانه نحوهٔ کارکرد استاب‌ها (stubs) و حاشیه‌نویسی‌ها (annotations) در Jedi به‌خوبی مستند نشده است. اگر کسی به راهنمایی در این باره نیاز دارد، لطفاً به من اطلاع دهد. .SS حافظهٔ پنهان و بازگشت‌ها (Caching & Recursions) .INDENT 0.0 .IP \(bu 2 حافظهٔ پنهان (Caching) .IP \(bu 2 بازگشت‌ها (Recursions) .UNINDENT .SS حافظهٔ پنهان (cache.py) .sp این حافظهٔ پنهان برای بهینه‌سازی‌های سرعت و حافظه بسیار مهم است. چیز واقعاً خارق‌العاده‌ای وجود ندارد، فقط چند دکوراتور. انواع حافظهٔ پنهان زیر در دسترس هستند: .INDENT 0.0 .IP \(bu 2 از \fBtime_cache\fP می‌توان برای ذخیره در حافظهٔ پنهان تنها برای یک بازهٔ زمانی محدود استفاده کرد، که در هنگام تعامل با کاربر و عدم توانایی کاربر در واکنش سریع‌تر از زمانی مشخص، می‌تواند مفید باشد. .UNINDENT .sp این ماژول یکی از دلایلی است که Jedi از نظر چندنخی امن نیست (thread\-safe نیست). همان‌گونه که می‌بینید، متغیرهای سراسری وجود دارند که اطلاعات حافظهٔ پنهان را نگه‌داری می‌کنند. برخی از این متغیرها پس از هر بار استفاده از API پاک‌سازی می‌شوند. .SS بازگشت‌ها (recursion.py) .sp بازگشت‌ها دستورالعمل Jedi برای تسخیر کد پایتون هستند. با این حال، باید جلوی از کنترل خارج شدن بازگشت‌ها گرفته شود. برخی تنظیمات در اینجا تعبیه شده‌اند تا Jedi را در زمان مناسب متوقف کنند. می‌توانید دربارهٔ آن‌ها در اینجا بیشتر بخوانید\&. .sp در کنار ماژول درونی \fBjedi.inference.cache\fP، این ماژول نیز Jedi را ناامن در برابر چندنخی (غیر thread\-safe) می‌سازد، چرا که \fBexecution_recursion_decorator\fP از متغیرهای کلاس برای شمارش فراخوانی‌های تابع استفاده می‌کند. .SS تنظیمات (Settings) .sp تنظیمات بازگشت زمانی حائز اهمیت هستند که نخواهید کدهای شدیداً بازگشتی پایتون کاملاً مهارنشدنی شوند. .sp مقادیر پیش‌فرض بر پایهٔ آزمون‌ها هنگام تکمیل خودکارِ خود کتابخانهٔ Jedi تعیین شده‌اند (inception!). اما گمان نمی‌کنم کتابخانهٔ پایتون دیگری وجود داشته باشد که به این شیوهٔ مفرط از بازگشت استفاده کند. تکمیل خودکار همچنین باید سریع باشد و از این رو ممکن است کیفیت همواره در بالاترین حد نباشد. .INDENT 0.0 .TP .B jedi.inference.recursion.recursion_limit = 15 مانند \fBsys.getrecursionlimit()\fP \%، فقط مختص Jedi\&. .UNINDENT .INDENT 0.0 .TP .B jedi.inference.recursion.total_function_execution_limit = 200 این یک حد سخت‌گیرانه (hard limit) برای تعداد توابع غیرتوکاری (non\-builtin) است که می‌توانند اجرا شوند. .UNINDENT .INDENT 0.0 .TP .B jedi.inference.recursion.per_function_execution_limit = 6 حداکثر دفعاتی که یک تابع مشخص می‌تواند اجرا شود. .UNINDENT .INDENT 0.0 .TP .B jedi.inference.recursion.per_function_recursion_limit = 2 یک تابع نمی‌تواند بیش از این تعداد دفعات به‌صورت بازگشتی اجرا شود. .UNINDENT.SS ماژول‌های کمکی (Helper Modules) .sp اکثر ماژول‌های دیگر واقعاً نقشی محوری در نحوه کارکرد Jedi ندارند. همه آن‌ها شامل کدهای مرتبط هستند، اما اگر ماژول‌های بالا را درک کنید، تقریباً Jedi را به طور کامل متوجه شده‌اید. .SS آزمایش Jedi (Jedi Testing) .sp مجموعه آزمون به \fBpytest\fP وابسته است: .INDENT 0.0 .INDENT 3.5 .sp .EX pip install pytest .EE .UNINDENT .UNINDENT .sp اگر می‌خواهید فقط یک نسخه خاص پایتون (مثلاً Python 3.14) را آزمایش کنید، اجرای آن به همین سادگی است: .INDENT 0.0 .INDENT 3.5 .sp .EX python3.14 \-m pytest .EE .UNINDENT .UNINDENT .sp آزمون‌ها همچنین به‌طور خودکار روی GitHub Actions \%\& اجرا می‌شوند. .sp می‌خواهید آزمونی برای Jedi اضافه کنید؟ عالی است! ما از آن استقبال می‌کنیم. معمولاً باید آزمون‌های خود را به‌صورت Blackbox Tests بنویسید\&. اغلب آزمون‌ها دقیقاً در همین دسته جای می‌گیرند. .sp برای آزمایش اختصاصی API، ما از آزمون‌های واحد (unit tests) ساده، با تمرکز بر ساختار آزمایشی ساده و خوانا استفاده می‌کنیم. .SS آزمون‌های یکپارچه‌سازی (Integration Tests - run.py) .sp Jedi عمدتاً با آنچه «آزمون‌های یکپارچه‌سازی» (\(dqintegration tests\(dq) می‌نامم سنجیده می‌شود. این آزمون‌ها استنتاج نوع (type inference) را با API عمومی ارزیابی می‌کنند. این رویکرد برای Jedi کاملاً منطقی است\&. همچنین، نوشتن doctests/unittests برای ساختارهای داده داخلی دشوار است. .sp انواع مختلفی از آزمون‌ها وجود دارد: .INDENT 0.0 .IP \(bu 2 تکمیل‌ها / استنتاج \fB#?\fP (completions / inference) .IP \(bu 2 انتقال (goto): \fB#!\fP .IP \(bu 2 ارجاعات (references): \fB#<\fP .UNINDENT .SS چگونه آزمون‌ها را اجرا کنیم؟ (How to run tests?) .sp Jedi برای اجرای آزمون‌های واحد و یکپارچه‌سازی از pytest \% استفاده می‌کند. برای اجرای آزمون‌ها، کافی است \fBpytest\fP را اجرا کنید\&. .sp بیشتر موارد آزمون یکپارچه‌سازی در پوشه \fBtest/completion\fP قرار دارند و هر مورد آزمون با یکی از این کامنت‌ها آغاز می‌شود: .INDENT 0.0 .IP \(bu 2 \fB#?\fP (completions / inference) .IP \(bu 2 \fB#!\fP (goto) .IP \(bu 2 \fB#<\fP (references) .UNINDENT .sp همچنین از کتابخانه‌های شخص ثالث (third-party) نیز پشتیبانی می‌شود. در یک اجرای عادی آزمون، آن‌ها اجرا نمی‌شوند؛ برای اجرای آن‌ها باید گزینه \fB\-\-thirdparty\fP را مشخص کنید. .sp علاوه بر گزینه‌های \fB\-k\fP و \fB\-m\fP در pytest، می‌توانید از گزینه \fB\-T\fP (\fB\-\-test\-files\(ga) برای تعیین این که کدام موارد آزمون باید اجرا شوند استفاده کنید. این گزینه قالب \(ga\(gaFILE_NAME[:LINE[,LINE[,...]]]\fP را می‌پذیرد که در آن \fBFILE_NAME\fP فایلی در پوشه \fBtest/completion\fP و \fBLINE\fP شماره خط کامنت آزمون است. در اینجا چند مثال آورده شده است: .sp اجرای آزمون‌ها تنها در \fBcompletion/basic.py\fP و \fBcompletion/imports.py\fP: .INDENT 0.0 .INDENT 3.5 .sp .EX pytest test/test_integration.py \-T basic.py \-T imports.py .EE .UNINDENT .UNINDENT .sp اجرای آزمون در خطوط 4، 6 و 8 در \fBcompletion/basic.py\fP: .INDENT 0.0 .INDENT 3.5 .sp .EX pytest test/test_integration.py \-T basic.py:4,6,8 .EE .UNINDENT .UNINDENT .sp برای اطلاعات بیشتر، \fBpytest \-\-help\fP را ببینید. .sp اگر می‌خواهید یک آزمون را اشکال‌زدایی (debug) کنید، کافی است از گزینه \fB\-\-pdb\fP استفاده نمایید..SS اجراکننده آزمون جایگزین (Alternate Test Runner) .sp اگر خروجی \fBpytest\fP را نمی‌پسندید، یک اجراکننده آزمون جایگزین وجود دارد که می‌توانید با اجرای \fB\&./run.py\fP آن را آغاز کنید. مثال بالا را می‌توان بدین صورت اجرا کرد: .INDENT 0.0 .INDENT 3.5 .sp .EX \&./run.py basic 4 6 8 50\-80 .EE .UNINDENT .UNINDENT .sp مزیت این اجراکننده، سادگی و گزارش خطاهای سفارشی‌تر است. .SS آزمون‌های تکمیل خودکار (Auto\-Completion Tests) .sp از یک کامنت برای مشخص کردن آزمون در خط بعدی استفاده می‌کند. این کامنت تکمیل‌های مورد انتظار را مشخص می‌سازد. کامنت همواره با \fI#?\fP\& آغاز می‌شود. سطر پایانی نشان‌دهنده موقعیت مکان‌نما است. برای مثال: .INDENT 0.0 .INDENT 3.5 .sp .EX #? [\(aqupper\(aq] a = \(aqfoo\(aq; a.upp .EE .UNINDENT .UNINDENT .SS آزمون‌های استنتاج (Inference Tests) .sp آزمون‌های استنتاج بسیار مشابه هستند. تفاوت در این است که آزمون‌های استنتاج از براکت استفاده نمی‌کنند: .INDENT 0.0 .INDENT 3.5 .sp .EX #? int() ab = 3; ab .EE .UNINDENT .UNINDENT .SS آزمون‌های Goto (Goto Tests) .sp آزمون‌های Goto بدین صورت هستند: .INDENT 0.0 .INDENT 3.5 .sp .EX abc = 1 #! [\(aqabc=1\(aq] abc .EE .UNINDENT .UNINDENT .sp علاوه بر این، می‌توان با افزودن یک عدد که موقعیت آزمون را توصیف می‌کند، ستون را نیز مشخص کرد (در غیر این صورت، موقعیت در انتهای خط در نظر گرفته می‌شود): .INDENT 0.0 .INDENT 3.5 .sp .EX #! 2 [\(aqabc=1\(aq] abc .EE .UNINDENT .UNINDENT .SS آزمون‌های مرجع (Reference Tests) .sp آزمون‌ها بدین صورت هستند: .INDENT 0.0 .INDENT 3.5 .sp .EX abc = 1 #< (1,0), (3,0) abc .EE .UNINDENT .UNINDENT .SS آزمون‌های بازآفرینی کد (Refactoring Tests \- refactor.py) .sp آزمون‌های بازآفرینی کد عملکردی تا حدی مشابه با آزمون‌های یکپارچه‌سازی دارند. اما هدف در اینجا مقایسه دو نسخه از کد است. اگر می‌خواهید مورد آزمون جدیدی اضافه کنید، کافی است به موارد موجود در پوشه \fBtest/refactor\fP نگاهی بیندازید و آن‌ها را کپی کنید..SS "تاریخچه و قدردانی‌ها (History & Acknowledgements)" .SS "قدردانی‌ها (Acknowledgements)" .INDENT 0.0 .IP \(bu 2 Dave Halter برای ایجاد و نگهداری Jedi و Parso. .IP \(bu 2 Takafumi Arakaki (@tkf) برای ایجاد یک محیط آزمون مستحکم و بسیاری از موارد دیگر. .IP \(bu 2 Danilo Bargen (@dbrgn) برای رسیدگی‌های عمومی و دوست خوب بودن :). .IP \(bu 2 Guido van Rossum (@gvanrossum) برای ایجاد مولد تجزیه‌کننده pgen2 (که در ابتدا در lib2to3 استفاده شد). .IP \(bu 2 با تشکر از همه مشارکت‌کنندگان\&. .UNINDENT .SS "کمی درباره تاریخچه (A Little Bit of History)" .sp نوشته‌شده توسط Dave. .sp شوالیه‌های Jedi در Star Wars فوق‌العاده هستند. نرم‌افزار Jedi من تلاش می‌کند اندکی از قابلیت پیش‌آگاهی که Jediها دارند را تقلید کند. حتی یک صحنه عالی \% از جدای‌های Monty Python وجود دارد :\-). .sp اما در واقع این نام ارتباط چندانی با Star Wars ندارد. این بخشی از نام میانی من یعنی Jedidjah است. .sp من در واقع Jedi را در سال ۲۰۱۲ آغاز کردم، چرا که هیچ راهکار مناسبی برای VIM در دسترس نبود. اکثر راهکارهای auto\-completion به‌خوبی کار نمی‌کردند. تنها راهکار خوب PyCharm بود، اما من VIM قدیمی و دوست‌داشتنی خود را بسیار ترجیح می‌دادم. همچنین راهکاری به نام Rope وجود داشت که اصلاً برای من کارایی نداشت. بنابراین تصمیم گرفتم نگارش خودم از یک موتور تکمیل خودکار را بنویسم. .sp ایده اولیه، اجرای کدهای غیرخطرناک بود؛ اما خیلی زود متوجه شدم که این ایده کارساز نخواهد بود. بنابراین ساخت یک ابزار تحلیل ایستا (static analysis) را شروع کردم. بزرگ‌ترین مشکلی که در آن زمان داشتم این بود که هیچ‌چیز درباره تجزیه‌کننده‌ها (parsers) نمی‌دانستم. من حتی عبارت تحلیل ایستا را هم نشنیده بودم. معلوم شد که آن‌ها پایه و اساس یک ابزار تحلیل ایستای خوب هستند. البته من این را نمی‌دانستم و سعی کردم نگارش ضعیفی از یک تجزیه‌کننده را خودم بنویسم که در نهایت دو سال بعد آن را دور انداختم. .sp به دلیل ناآگاهی من، هر کاری پس از ۲۰۱۲ و پیش از ۲۰۲۰ اساساً بازآرایی کد (refactoring) بود. احتمالاً بخش‌های مرکزی Jedi را چیزی حدود ۵ تا ۱۰ بار بازنویسی کردم. آخرین بازنویسی بزرگ (که آن را دو بار انجام دادم) شامل پشتیبانی از gradual typing و stubs بود. .sp در طول آن زمان آموختم که داشتن درک مناسبی از مسئله‌تان بسیار حیاتی است؛ در غیر این صورت فقط کارتان به انجام دوباره آن می‌رسد. من تنها در ابتدا و در انتها قابلیت‌ها را نوشتم؛ هر چیز دیگری رفع باگ و بازآرایی بود. با این حال، اکنون واقعاً از نتیجه خرسندم. به‌خوبی کار می‌کند، رفع باگ‌ها می‌تواند سریع باشد و تقریباً از نظر قابلیت‌ها کامل است. .sp .ce ---- .ce 0 .sp .sp شما را با حکایت کوتاهی که اگر درست به یاد بیاورم در سال ۲۰۱۲ رخ داد، تنها می‌گذارم. پس از آنکه برای Guido van Rossum توضیح دادم که بخش‌هایی از auto\-completion من چگونه کار می‌کنند، او گفت: .INDENT 0.0 .INDENT 3.5 \fI\(dqاوه، این مرا نگران می‌کند...\(dq\fP .UNINDENT .UNINDENT .sp اکنون که به پایان رسیده است، امیدوارم آن را بپسندد :\-). .SS "نویسندگان اصلی (Main Authors)" .INDENT 0.0 .IP \(bu 2 David Halter (@davidhalter) <\%> .IP \(bu 2 Takafumi Arakaki (@tkf) <\%> .UNINDENT .SS "مشارکت‌کنندگان در کد (Code Contributors)" .INDENT 0.0 .IP \(bu 2 Danilo Bargen (@dbrgn) <\%> .IP \(bu 2 Laurens Van Houtven (@lvh) <\%<_@\:lvh\:.cc>> .IP \(bu 2 Aldo Stracquadanio (@Astrac) <\%> .IP \(bu 2 Jean\-Louis Fuchs (@ganwell) <\%> .IP \(bu 2 tek (@tek) .IP \(bu 2 Yasha Borevich (@jjay) <\%> .IP \(bu 2 Aaron Griffin <\%> .IP \(bu 2 andviro (@andviro) .IP \(bu 2 Mike Gilbert (@floppym) <\%> .IP \(bu 2 Aaron Meurer (@asmeurer) <\%> .IP \(bu 2 Lubos Trilety <\%> .IP \(bu 2 Akinori Hattori (@hattya) <\%> .IP \(bu 2 srusskih (@srusskih) .IP \(bu 2 Steven Silvester (@blink1073) .IP \(bu 2 Colin Duquesnoy (@ColinDuquesnoy) <\%> .IP \(bu 2 Jorgen Schaefer (@jorgenschaefer) <\%> .IP \(bu 2 Fredrik Bergroth (@fbergroth) .IP \(bu 2 Mathias Fußenegger (@mfussenegger) .IP \(bu 2 Syohei Yoshida (@syohex) <\%> .IP \(bu 2 ppalucky (@ppalucky) .IP \(bu 2 immerrr (@immerrr) \% .IP \(bu 2 Albertas Agejevas (@alga) .IP \(bu 2 Savor d\(aqIsavano (@KenetJervet) <\%> .IP \(bu 2 Phillip Berndt (@phillipberndt) <\%> .IP \(bu 2 Ian Lee (@IanLee1521) <\%> .IP \(bu 2 Farkhad Khatamov (@hatamov) <\%> .IP \(bu 2 Kevin Kelley (@kelleyk) <\%> .IP \(bu 2 Sid Shanker (@squidarth) <\%> .IP \(bu 2 Reinoud Elhorst (@reinhrst) .IP \(bu 2 Guido van Rossum (@gvanrossum) <\%> .IP \(bu 2 Dmytro Sadovnychyi (@sadovnychyi) <\%> .IP \(bu 2 Cristi Burcă (@scribu) .IP \(bu 2 bstaint (@bstaint) .IP \(bu 2 Mathias Rav (@Mortal) <\%> .IP \(bu 2 Daniel Fiterman (@dfit99) <\%> .IP \(bu 2 Simon Ruggier (@sruggier) .IP \(bu 2 Élie Gouzien (@ElieGouzien) .IP \(bu 2 Robin Roth (@robinro) .IP \(bu 2 Malte Plath (@langsamer) .IP \(bu 2 Anton Zub (@zabulazza) .IP \(bu 2 Maksim Novikov (@m\-novikov) <\%> .IP \(bu 2 Tobias Rzepka (@TobiasRzepka) .IP \(bu 2 micbou (@micbou) .IP \(bu 2 Dima Gerasimov (@karlicoss) <\%> .IP \(bu 2 Max Woerner Chase (@mwchase) <\%> .IP \(bu 2 Johannes Maria Frank (@jmfrank63) <\%> .IP \(bu 2 Shane Steinert\-Threlkeld (@shanest) <\%> .IP \(bu 2 Tim Gates (@timgates42) <\%> .IP \(bu 2 Lior Goldberg (@goldberglior) .IP \(bu 2 Ryan Clary (@mrclary) .IP \(bu 2 Max Mäusezahl (@mmaeusezahl) <\%> .IP \(bu 2 Vladislav Serebrennikov (@endilll).IP \(bu 2 Andrii Kolomoiets (@muffinmad) .IP \(bu 2 Leo Ryu (@Leo\-Ryu) .IP \(bu 2 Joseph Birkner (@josephbirkner) .IP \(bu 2 Márcio Mazza (@marciomazza) .IP \(bu 2 Martin Vielsmaier (@moser) <\%> .IP \(bu 2 TingJia Wu (@WutingjiaX) <\%> .IP \(bu 2 Nguyễn Hồng Quân <\%> .UNINDENT .sp و چند مشارکت‌کنندهٔ \(dqناشناس\(dq دیگر. .sp نکته: (@user) بیانگر نام کاربری GitHub است. .SS تغییرات (Changelog) .SS منتشرنشده (Unreleased) .SS 0.20.0 (2026\-05\-02) .INDENT 0.0 .IP \(bu 2 پشتیبانی از Python 3.14 .IP \(bu 2 حذف پشتیبانی از Python 3.8 و 3.9 .IP \(bu 2 ارتقای Typeshed .IP \(bu 2 پشتیبانی بهتر از Final/ClassVar .IP \(bu 2 اکنون \fB__new__\fP نیز به عنوان یک امضا (signature) و استنتاج TypeVar شناخته می‌شود .IP \(bu 2 پشتیبانی از \fBSelf\fP .IP \(bu 2 پشتیبانی از \fBTypeAlias\fP، جنریک‌ها برای \fBtype[...]\fP و \fBtuple[...]\fP .UNINDENT .SS 0.19.2 (2024\-11\-10) .INDENT 0.0 .IP \(bu 2 پشتیبانی از Python 3.13 .UNINDENT .SS 0.19.1 (2023\-10\-02) .INDENT 0.0 .IP \(bu 2 پشتیبانی از Python 3.12 (با تشکر از Peter!) .UNINDENT .SS 0.19.0 (2023\-07\-29) .INDENT 0.0 .IP \(bu 2 پشتیبانی از Python 3.11 .IP \(bu 2 بهبودهای چشمگیر در کارایی برای کاربران \fBInterpreter\fP (مانند IPython). این تغییر به‌ویژه بر کاربران \fBpandas\fP با مجموعه‌داده‌های بزرگ تأثیر می‌گذارد. .IP \(bu 2 افزودن \fBjedi.settings.allow_unsafe_interpreter_executions\fP جهت تسهیل جلوگیری از اجراهای ناامن برای کاربران IPython. .UNINDENT .SS 0.18.2 (2022\-11\-21) .INDENT 0.0 .IP \(bu 2 افزودن معادل dataclass برای attrs.define .IP \(bu 2 یافتن fixtureها از نقاط ورود (entrypoints) متعلق به Pytest؛ نمونه‌هایی از افزونه‌های pytest که به این شیوه نصب می‌شوند عبارتند از pytest\-django، pytest\-sugar و Faker. .IP \(bu 2 رفع باگ Project.search در مواردی که venv دخیل بود؛ مشکلی که برای مثال باعث می‌شد \fI:Pyimport django.db\fP در برخی موارد در jedi\-vim کار نکند. .IP \(bu 2 و رفع چندین باگ کوچک‌تر .UNINDENT .SS 0.18.1 (2021\-11\-17) .INDENT 0.0 .IP \(bu 2 فضاهای نام ضمنی (Implicit namespaces) اکنون انواع مجزایی در \fBName().type\fP هستند .IP \(bu 2 پشتیبانی از Python 3.10 .IP \(bu 2 عمدتاً رفع باگ‌ها .UNINDENT.SS 0.18.0 (2020\-12\-25) .INDENT 0.0 .IP \(bu 2 حذف پشتیبانی از Python 2 و Python 3.5 .IP \(bu 2 استفاده از \fBpathlib.Path()\fP به عنوان خروجی به جای \fBstr\fP در اکثر موارد: \- \fBProject.path\fP \- \fBScript.path\fP \- \fBDefinition.module_path\fP \- \fBRefactoring.get_renames\fP \- \fBRefactoring.get_changed_files\fP .IP \(bu 2 توابع دارای \fB@property\fP اکنون در \fBName().type\fP به جای \fBfunction\fP، مقدار \fBproperty\fP را برمی‌گردانند .IP \(bu 2 آغاز استفاده از حاشیه‌نویسی‌ها (annotations) .IP \(bu 2 پشتیبانی بهتر از عملگر والروس (walrus operator) .IP \(bu 2 صفت‌های شیء \fBProject\fP اکنون دسترسی خواندن دارند .IP \(bu 2 حذف تمامی موارد منسوخ‌شده .UNINDENT .sp به احتمال زیاد این آخرین انتشار فرعی پیش از نسخه 1.0 خواهد بود. .SS 0.17.2 (2020\-07\-17) .INDENT 0.0 .IP \(bu 2 افزودن گزینه‌ای برای ارسال متغیرهای محیطی به \fBEnvironment\fP .IP \(bu 2 اکنون \fBProject(...).path\fP در دسترس است .IP \(bu 2 پشتیبانی از Python 3.9 .IP \(bu 2 چندین رفع باگ .UNINDENT .sp این آخرین انتشاری خواهد بود که از Python 2 و Python 3.5 پشتیبانی می‌کند. نسخه \fB0.18.0\fP نیازمند Python 3.6+ خواهد بود. .SS 0.17.1 (2020\-06\-20) .INDENT 0.0 .IP \(bu 2 پشتیبانی از فراکلاس (meta class) در \fBModel\fP مربوط به Django .IP \(bu 2 پشتیبانی از Django Manager (تکمیل خودکار روی Managers/QuerySets) .IP \(bu 2 افزودن Django Stubs به Jedi، با تشکر از تمامی مشارکت‌کنندگان پروژه Django Stubs \% .IP \(bu 2 افزودن \fBSyntaxError.get_message\fP .IP \(bu 2 پشتیبانی از Python 3.9 .IP \(bu 2 رفع باگ‌ها (عمدتاً مرتبط با Generics) .UNINDENT .SS 0.17.0 (2020\-04\-14) .INDENT 0.0 .IP \(bu 2 افزودن پشتیبانی از \fBProject\fP. این قابلیت به کاربر امکان می‌دهد مشخص کند Jedi باید با چه پوشه‌هایی کار کند. .IP \(bu 2 افزودن پشتیبانی از بازآرایی (Refactoring). بازآرایی‌های زیر پیاده‌سازی شده‌اند: \fBScript.rename\fP، \fBScript.inline\fP، \fBScript.extract_variable\fP و \fBScript.extract_function\fP\&. .IP \(bu 2 افزودن \fBScript.get_syntax_errors\fP برای نمایش خطاهای نحوی در اسکریپت فعلی. .IP \(bu 2 افزودن قابلیت‌های جستجوی کد هم برای فایل‌های جداگانه و هم پروژه‌ها. توابع جدید عبارتند از: \fBProject.search\fP، \fBProject.complete_search\fP، \fBScript.search\fP و \fBScript.complete_search\fP\&. .IP \(bu 2 افزودن \fBScript.help\fP برای تسهیل نمایش پنجره راهنما به کاربران. اکنون اطلاعات pydoc نیز برای کلیدواژه‌ها/عملگرهای Python برگردانده می‌شود. این بدان معناست که روی کلیدواژه class اکنون رشته مستندات (docstring) تابع توکار \fBhelp(\(aqclass\(aq)\fP در Python برگردانده می‌شود\&. .IP \(bu 2 مستندات API اکنون بسیار خواناتر و کامل‌تر شده است. آن را در \%\& بررسی کنید. بخش زیادی از آن بازنویسی شده است. .IP \(bu 2 حذف پشتیبانی از Python 3.4 .IP \(bu 2 رفع باگ‌های متعدد .UNINDENT .sp به احتمال زیاد این آخرین نسخه فرعی خواهد بود که از Python 2 و Python 3.5 پشتیبانی می‌کند. رفع باگ‌ها در 0.17.1+ ارائه خواهند شد. نسخه فرعی/اصلی بعدی احتمالاً Jedi 1.0.0 خواهد بود..SS 0.16.0 (2020\-01\-26) .INDENT 0.0 .IP \(bu 2 \fBافزوده شدن\fP \fBScript.get_context\fP برای دریافت اطلاعات درباره مکانی که هم‌اکنون در آن قرار دارید. .IP \(bu 2 تکمیل خودکار و استنتاج نوع (type inference) برای \fBPytest fixtures\fP\&. .IP \(bu 2 تکمیل‌های خودکار Tensorflow، Numpy و Pandas اکنون پس از نخستین بار استفاده، باید حدود \fB۴\-۱۰ برابر سریع‌تر\fP باشند. .IP \(bu 2 تکمیل خودکار کلیدهای دیکشنری اکنون کار می‌کند؛ برای مثال \fBd = {1000: 3}; d[10\fP به \fB1000\fP گسترش می‌یابد\&. .IP \(bu 2 تکمیل خودکار برای \(dqproxies\(dq اکنون کار می‌کند. این‌ها کلاس‌هایی هستند که متد \fB__getattr__(self, name)\fP دارند که پس از بارگذاری اولیه‌شان، یک \fBreturn getattr(x, name)\fP انجام می‌دهد\&. .IP \(bu 2 دستور Goto روی یک تابع/مشخصه (attribute) در یک کلاس، اکنون به تعریف آن در ابرکلاس (super class) مربوطه می‌رود. .IP \(bu 2 .INDENT 2.0 .TP \fBتغییرات بزرگ در Script API\fP: .INDENT 7.0 .IP \(bu 2 پارامترهای line و column در \fBjedi.Script\fP اکنون منسوخ شده‌اند .IP \(bu 2 متد \fBcompletions\fP منسوخ شده است، به‌جای آن از \fBcomplete\fP استفاده کنید .IP \(bu 2 متد \fBgoto_assignments\fP منسوخ شده است، به‌جای آن از \fBgoto\fP استفاده کنید .IP \(bu 2 متد \fBgoto_definitions\fP منسوخ شده است، به‌جای آن از \fBinfer\fP استفاده کنید .IP \(bu 2 متد \fBcall_signatures\fP منسوخ شده است، به‌جای آن از \fBget_signatures\fP استفاده کنید .IP \(bu 2 متد \fBusages\fP منسوخ شده است، به‌جای آن از \fBget_references\fP استفاده کنید .IP \(bu 2 تابع \fBjedi.names\fP منسوخ شده است، از \fBjedi.Script(...).get_names()\fP استفاده کنید .UNINDENT .UNINDENT .IP \(bu 2 نام \fBBaseName.goto_assignments\fP به \fBBaseName.goto\fP تغییر یافت .IP \(bu 2 افزوده شدن follow_imports به \fBName.goto\fP\&. اکنون امضای آن با \fBScript.goto\fP مطابقت دارد\&. .IP \(bu 2 \fBپشتیبانی از Python 2 منسوخ شد\fP\&. برای این نسخه، پشتیبانی در حد نهایت تلاش (best effort) است. دوره حیات Python 2 به پایان رسیده و اکنون تنها یک گذار روان مد نظر است. اشکالات مربوط به Python 2 دیگر رفع نخواهند شد و در حال حاضر یک‌سوم آزمون‌ها نادیده گرفته می‌شوند. .IP \(bu 2 گزینه \fBsettings.no_completion_duplicates\fP حذف شد\&. این گزینه آزمایش نشده بود و احتمالاً در هر صورت کسی از آن استفاده نمی‌کرد. .IP \(bu 2 گزینه‌های \fBsettings.use_filesystem_cache\fP و \fBsettings.additional_dynamic_modules\fP حذف شدند؛ آن‌ها دیگر هیچ کاربردی ندارند. احتمالاً تقریباً هیچ‌کس از آن‌ها استفاده نمی‌کرد. .UNINDENT .SS 0.15.2 (2019\-12\-20) .INDENT 0.0 .IP \(bu 2 امضاها اکنون بسیار بهتر تشخیص داده می‌شوند .IP \(bu 2 افزودن تکمیل مبهم (fuzzy) با \fBScript(...).completions(fuzzy=True)\fP .IP \(bu 2 فایل‌های بزرگ‌تر از یک مگابایت (حدود ۲۰ هزار خط کد) برای جلوگیری از گیر کردن کامل، بریده (crop) می‌شوند. .IP \(bu 2 رفع اشکالات جزئی بسیار .IP \(bu 2 یک بازطراحی ساختاری (refactoring) بزرگ پیرامون contexts/values .UNINDENT .SS 0.15.1 (2019\-08\-13) .INDENT 0.0 .IP \(bu 2 رفع اشکال جزئی و حذف یک دستور print .UNINDENT .SS 0.15.0 (2019\-08\-11) .INDENT 0.0 .IP \(bu 2 افزوده شدن تکمیل مسیر فایل، اکنون یک نوع \fBجدید\fP در \fBCompletion.type\fP وجود دارد: \fBpath\fP\&. مثال: \fB\(aq/ho\fP \-> \fB\(aq/home/\fP .IP \(bu 2 تفکیک و حل \fB*args\fP/\fB**kwargs\fP\&. در صورت امکان، Jedi پارامترها را با گزینه‌های واقعی جایگزین می‌کند. .IP \(bu 2 پشتیبانی بهتر از enums/dataclasses .IP \(bu 2 هنگام استفاده از Interpreter، ویژگی‌ها (properties) اکنون اجرا می‌شوند، زیرا افراد زیادی در این باره شکایت کرده بودند. بحث در #1299، #1347. .UNINDENT .sp APIهای جدید: .INDENT 0.0 .IP \(bu 2 \fBName.get_signatures() \-> List[Signature]\fP\&. امضاها شبیه به \fBCallSignature\fP هستند\&. بنابراین \fBName.params\fP منسوخ شده است. .IP \(bu 2 \fBSignature.to_string()\fP برای قالب‌بندی امضاها. .IP \(bu 2 \fBSignature.params \-> List[ParamName]\fP؛ شیء ParamName دارای مشخصه‌های اضافی زیر است: \fBinfer_default()\fP، \fBinfer_annotation()\fP، \fBto_string()\fP و \fBkind\fP\&. .IP \(bu 2 \fBName.execute() \-> List[Name]\fP؛ استنتاج مقادیر بازگشتی توابع را ممکن می‌سازد. .UNINDENT.SS 0.14.1 (2019\-07\-13) .INDENT 0.0 .IP \(bu 2 اکنون CallSignature.index باید بسیار بهتر کار کند .IP \(bu 2 چندین رفع باگ کوچک‌تر .UNINDENT .SS 0.14.0 (2019\-06\-20) .INDENT 0.0 .IP \(bu 2 افزوده شدن \fBgoto_*(prefer_stubs=True)\fP و همچنین \fBgoto_*(prefer_stubs=True)\fP .IP \(bu 2 اکنون از stubها برای استنتاج نوع (type inference) استفاده می‌شود .IP \(bu 2 استفاده از Typeshed برای استنتاج نوع بهتر .IP \(bu 2 بازنویسی Name.full_name؛ اکنون باید مقادیر بازگشتی دقیق‌تری داشته باشد .UNINDENT .SS 0.13.3 (2019\-02\-24) .INDENT 0.0 .IP \(bu 2 رفع مشکل در Python تعبیه‌شده (embedded)، ببینید \% .UNINDENT .SS 0.13.2 (2018\-12\-15) .INDENT 0.0 .IP \(bu 2 رفع باگی که منجر به ایجاد تعداد زیادی زیرپردازش (subprocess) توسط Jedi می‌شد. .UNINDENT .SS 0.13.1 (2018\-10\-02) .INDENT 0.0 .IP \(bu 2 رفع باگ‌ها، زیرا تکمیل خودکار tensorflow همچنان کند بود. .UNINDENT .SS 0.13.0 (2018\-10\-02) .INDENT 0.0 .IP \(bu 2 یک انتشار کوچک. چند مورد رفع باگ. .IP \(bu 2 حذف پشتیبانی از Python 3.3. پشتیبانی از Python 3.3 توسط بنیاد پایتون متوقف شده است. .IP \(bu 2 محیط‌های پیش‌فرض اکنون از همان نسخه Python فرایند Python استفاده می‌کنند. در 0.12.x، آخرین نسخه Python موجود در سیستم بارگذاری می‌شد. .IP \(bu 2 افزودن \fBinclude_builtins\fP به عنوان یک پارامتر به usages. .IP \(bu 2 تابع \fBgoto_assignments\fP دارای پارامتر جدید \fBfollow_builtin_imports\fP است که رفتار قبلی را کمی تغییر می‌دهد. .UNINDENT .SS 0.12.1 (2018\-06\-30) .INDENT 0.0 .IP \(bu 2 این انتشار شما را ملزم به ارتقای parso می‌کند. اگر این کار را انجام ندهید، هیچ چیز کار نخواهد کرد. در غیر این صورت تغییرات باید به رفع باگ‌ها محدود باشد. متأسفانه Jedi هنوز از برخی بخش‌های داخلی parso استفاده می‌کند که حفظ سازگاری در چند نسخه مختلف را دشوار می‌سازد. به parso >=0.3.0 نیاز خواهد بود. .UNINDENT .SS 0.12.0 (2018\-04\-15) .INDENT 0.0 .IP \(bu 2 پشتیبانی از Virtualenv/Environment .IP \(bu 2 پشتیبانی از تکمیل خودکار/Goto برای F\-String .IP \(bu 2 دیگر با خطای segfault دچار فروپاشی (crash) نمی‌شود .IP \(bu 2 پاک‌سازی منطق import .IP \(bu 2 درک async/await و تکمیل خودکار آن (شامل مولدهای ناهمگام یا async generators) .IP \(bu 2 تکمیل خودکار بهتر فضای نام (namespace) .IP \(bu 2 موفقیت در آزمون‌های Windows (شامل CI برای Windows) .IP \(bu 2 حذف پشتیبانی از Python 2.6 .UNINDENT .SS 0.11.1 (2017\-12\-14) .INDENT 0.0 .IP \(bu 2 به‌روزرسانی parso \- لایه حافظه پنهان (caching) با مشکل مواجه شده بود .IP \(bu 2 بهبود usages \- بخش زیادی از کدهای داخلی بازطراحی و ارتقا یافتند. .UNINDENT.SS 0.11.0 (2017\-09\-20) .INDENT 0.0 .IP \(bu 2 تفکیک تجزیه‌گر Jedi به پروژه‌ای مجزا به نام \fBparso\fP\&. .IP \(bu 2 جلوگیری از اثرات جانبی در تکمیل خودکار در REPL. .IP \(bu 2 پشتیبانی از docstringهای Numpy باید بسیار بهتر شده باشد. .IP \(bu 2 تنظیمات \fIsettings.*recursion*\fP کنار گذاشته شدند؛ آن‌ها دیگر قابل استفاده نیستند. .UNINDENT .SS 0.10.2 (2017\-04\-05) .INDENT 0.0 .IP \(bu 2 بسته‌بندی پایتون (Python Packaging) افتضاح است. برخی از فایل‌ها در نسخه 0.10.1 گنجانده نشده بودند. .UNINDENT .SS 0.10.1 (2017\-04\-05) .INDENT 0.0 .IP \(bu 2 رفع چند باگ بسیار آزاردهنده. .IP \(bu 2 آماده‌سازی تجزیه‌گر برای جداسازی و تفکیک از Jedi. .UNINDENT .SS 0.10.0 (2017\-02\-03) .INDENT 0.0 .IP \(bu 2 تکمیل معنایی واقعی برای کل نحو پایتون. .IP \(bu 2 استنتاج نوع (type inference) پایه‌ای برای \fByield from\fP طبق PEP 380. .IP \(bu 2 پشتیبانی از PEP 484 (بیشتر ویژگی‌های مهم آن). با تشکر از Claude! (@reinhrst) .IP \(bu 2 افزودن \fBget_line_code\fP به شیءهای \fBName\fP و \fBCompletion\fP\&. .IP \(bu 2 بازنویسی کامل موتور استنتاج نوع. .IP \(bu 2 یک تجزیه‌گر جدید و بهتر برای تجزیه (سریع) diffهای کدهای پایتون. .UNINDENT .SS 0.9.0 (2015\-04\-10) .INDENT 0.0 .IP \(bu 2 منطق واردسازی (import) بازنویسی شد تا شباهت بیشتری به پایتون داشته باشد. اکنون یک حافظه موقت واردسازی \fBInferState.modules\fP وجود دارد که شبیه به \fBsys.modules\fP عمل می‌کند. .IP \(bu 2 ادغام تجزیه‌گر 2to3. این کار بازسازی کد (refactoring) را ممکن می‌سازد. همچنین در آینده امکان بررسی پیام‌های خطا (مشابه آنچه کامپایل یک AST ایجاد می‌کند) فراهم خواهد شد. .IP \(bu 2 با تجزیه‌گر جدید، استنتاج نوع نیز کاملاً تغییر کرده است. اکنون ساده‌تر و خواناتر است. .IP \(bu 2 بازنویسی کامل تکمیل خودکار REPL. .IP \(bu 2 افزوده شدن \fBjedi.names\fP، دستوری برای انجام تحلیل ایستا (static analysis). با تشکر از بچه‌های sourcegraph برای حمایت مالی از این کار! .IP \(bu 2 نسخه آلفای بررسی‌کننده کد (linter). .UNINDENT .SS 0.8.1 (2014\-07\-23) .INDENT 0.0 .IP \(bu 2 انتشار رفع باگ؛ در انتشار قبلی، اضافه کردن فایل‌هایی که تکمیل خودکار برای کتابخانه‌های داخلی (builtins) را بهبود می‌بخشیدند فراموش شده بود. برطرف شد. .UNINDENT .SS 0.8.0 (2014\-05\-05) .INDENT 0.0 .IP \(bu 2 مصرف حافظه برای ماژول‌های کامپایل‌شده (مانند builtins، sys) به شدت کاهش یافته است. زمان‌های بارگذاری نیز کاهش یافته‌اند (اساساً به همان اندازه یک import زمان می‌برد). .IP \(bu 2 تکمیل خودکار در REPL در حال رسیدن به وضعیتی قابل استفاده است. .IP \(bu 2 تغییرات جزئی گوناگون در API. به‌طور کلی این انتشار بر پایداری و بازسازی ساختار APIهای داخلی تمرکز دارد. .IP \(bu 2 معرفی اولویت عملگرها (operator precedence)، که محاسبه صحیح اندیس‌های Array و رشته‌های \fB__getattr__\fP را امکان‌پذیر می‌سازد. .UNINDENT .SS 0.7.0 (2013\-08\-09) .INDENT 0.0 .IP \(bu 2 تغییر مجوز از LGPL به MIT. .IP \(bu 2 افزودن کلاس Interpreter به API برای امکان‌پذیر ساختن تکمیل خودکار در REPL. .IP \(bu 2 افزودن پشتیبانی تکمیل خودکار برای بسته‌های فضای نام (namespace packages). .IP \(bu 2 افزودن sith.py، روشی نوین برای آزمون تصادفی. .UNINDENT.SS 0.6.0 (2013\-05\-14) .INDENT 0.0 .IP \(bu 2 تجزیه‌کننده بسیار سریع‌تر همراه با کش‌سازی توکار بخش‌ها. .IP \(bu 2 مجموعه آزمون، با تشکر از @tkf. .UNINDENT .SS "نسخه‌های 0.5 (2012)" .INDENT 0.0 .IP \(bu 2 توسعه اولیه. .UNINDENT .SH "منابع (RESOURCES)" .sp اگر می‌خواهید از انتشارها \fBبه‌روز\fP بمانید، لطفاً در این فهرست پستی \fBعضو شوید\fP: \%\&. برای عضویت می‌توانید به‌سادگی یک ایمیل خالی به \fBjedi\-announce+subscribe@googlegroups.com\fP ارسال کنید\&. .INDENT 0.0 .IP \(bu 2 کد منبع در Github \% .IP \(bu 2 Python Package Index \% .UNINDENT .SH "نویسندگان (AUTHORS)" مشارکت‌کنندگان Jedi .SH "کپی‌رایت و تکثیر (COPYRIGHT)" مشارکت‌کنندگان jedi .\" End of generated man page.