JEDI(1) Jedi JEDI(1)

jedi - مستندات Jedi، ابزار تحلیل ایستا و تکمیل خودکار برای پایتون [تصویر: ستاره‌های GitHub] [تصویر]
https://github.com/davidhalter/jedi[تصویر: درصد ایشوها و پول‌ریکوئست‌های باز] [تصویر]
https://github.com/davidhalter/jedi/issues[تصویر: زمان حل، میانگین زمانی است که یک ایشو یا پول‌ریکوئست باز می‌ماند.] [تصویر]
https://github.com/davidhalter/jedi/issues[تصویر: آزمون‌ها] [تصویر]
https://github.com/davidhalter/jedi/actions[تصویر: وضعیت پوشش کد] [تصویر]
https://coveralls.io/r/davidhalter/jedi[تصویر: تعداد دانلود‌های PyPI] [تصویر]
https://pepy.tech/project/jedi

مخزن گیت‌هاب: https://github.com/davidhalter/jedi

ابزار Jedi یک ابزار تحلیل ایستا برای Python است که معمولاً در افزونه‌های IDEها و ویرایشگرها به کار می‌رود. تمرکز اصلی Jedi بر روی تکمیل خودکار (autocompletion) و قابلیت رفتن به تعریف (goto) است. ویژگی‌های دیگر شامل بازسازی کد (refactoring)، جستجوی کد و یافتن ارجاعات است.

ابزار Jedi دارای یک API ساده برای استفاده است. یک پیاده‌سازی مرجع به‌صورت افزونه برای VIM در https://github.com/davidhalter/jedi-vim وجود دارد. همچنین امکان تکمیل خودکار در REPL شما نیز فراهم است؛ IPython به‌صورت بومی از آن استفاده می‌کند و برای CPython REPL نیز می‌توانید آن را نصب کنید. ابزار Jedi به‌خوبی آزموده شده است و وجود باگ در آن باید بسیار نادر باشد.

در اینجا یک مثال ساده از قابلیت تکمیل خودکار آورده شده است:

>>> import jedi
>>> source = '''
... import json
... json.lo'''
>>> script = jedi.Script(source, path='example.py')
>>> script
<Script: 'example.py' ...>
>>> completions = script.complete(3, len('json.lo'))
>>> completions
[<Completion: load>, <Completion: loads>]
>>> print(completions[0].complete)
ad
>>> print(completions[0].name)
load

برای نمونه، قابلیت تکمیل خودکار در jedi-vim می‌تواند به این شکل باشد:

[تصویر]

می‌توان از Jedi به همراه انواع افزونه‌ها، سرورهای زبان و نرم‌افزارهای دیگر استفاده کرد. همچنین استفاده از Jedi در شل Python یا به همراه IPython امکان‌پذیر است.

در ادامه همچنین می‌توانید فهرستی از دستورالعمل‌ها را برای راهنمایی نوع (type hinting) بیابید.

•
Textmate https://github.com/lawrenceakka/python-jedi.tmbundle (مشخص نیست که آیا واقعاً کار می‌کند یا خیر)

•
Kate https://kate-editor.org در نسخهٔ 4.13+ به‌صورت بومی از آن پشتیبانی می‌کند https://projects.kde.org/projects/kde/applications/kate/repository/entry/addons/kate/pate/src/plugins/python_autocomplete_jedi.py?rev=KDE%2F4.13، اگرچه باید آن را فعال کنید.

•
GNOME Builder https://wiki.gnome.org/Apps/Builder به‌صورت بومی از آن پشتیبانی می‌کند https://git.gnome.org/browse/gnome-builder/tree/plugins/jedi، و به‌طور پیش‌فرض فعال است.

Jedi یک افزونهٔ از پیش نصب‌شده در پوستهٔ xonsh است https://xon.sh/contents.html. برای فعال‌سازی دستور زیر را اجرا کنید:

xontrib load jedi

و موارد بسیار دیگر!

Jedi یکی از وابستگی‌های IPython است؛ بنابراین تکمیل خودکار در IPython بدون نیاز به پیکربندی اضافه امکان‌پذیر است.

در اینجا یک ویدیوی نمونه https://vimeo.com/122332037 وجود دارد که نشان می‌دهد تکمیل خودکار REPL در یک پوستهٔ دیگر چگونه خواهد بود.

دو روش مختلف برای استفاده از تکمیل خودکار Jedi در مفسر python شما وجود دارد: یکی با فایل سفارشی $HOME/.pythonrc.py شما، و دیگری با استفاده از PYTHONSTARTUP.

برای استفاده از تکمیل خودکار Jedi در مفسر پایتون، عبارت زیر را به پیکربندی پوستهٔ خود (مانند .bashrc) اضافه کنید. این روش تنها در Linux/Mac کار می‌کند، چرا که readline روی Windows در دسترس نیست. اگر با این وجود خواهان تکمیل خودکار Jedi در REPL خود هستید، به جای آن از IPython استفاده کنید:

export PYTHONSTARTUP="$(python -m jedi repl)"

سپس قادر خواهید بود از تکمیل‌کنندهٔ Jedi در مفسر پایتون خود استفاده کنید:

$ python
Python 3.14.0+ (default, Jul 20 2020, 22:15:08)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.path.join('a', 'b').split().in<TAB>            # doctest: +SKIP
..dex   ..sert

این تابع readline https://docs.python.org/3/library/readline.html#module-readline را برای استفاده از Jedi در یک پوستهٔ تعاملی پایتون پیکربندی می‌کند.

اگر می‌خواهید از یک فایل سفارشی PYTHONSTARTUP (معمولاً $HOME/.pythonrc.py) استفاده کنید، می‌توانید این قطعه کد را اضافه کنید:

try:
    from jedi.utils import setup_readline
except ImportError:
    # Fallback to the stdlib readline completer if it is installed.
    # Taken from http://docs.python.org/2/library/rlcompleter.html
    print("Jedi is not installed, falling back to readline")
    try:
        import readline
        import rlcompleter
        readline.parse_and_bind("tab: complete")
    except ImportError:
        print("Readline is not installed either. No tab completion is enabled.")
else:
    setup_readline()

این کار در صورت نصب نبودن Jedi، به تکمیل‌کنندهٔ readline بازمی‌گردد. تکمیل‌کنندهٔ readline تنها نام‌های موجود در فضای نام سراسری (global namespace) را کامل می‌کند؛ بنابراین برای نمونه:

ran<TAB>

به range تکمیل خواهد شد.

با Jedi کد زیر:

range(10).cou<TAB>

به range(10).count تکمیل خواهد شد؛ این مورد در تکمیل‌کنندهٔ پیش‌فرض readline https://docs.python.org/3/library/readline.html#module-readline در cPython کار نمی‌کند.

همچنین باید عبارت export PYTHONSTARTUP=$HOME/.pythonrc.py را به پروفایل پوستهٔ خود (معمولاً در صورت استفاده از bash، فایل .bash_profile یا .profile) اضافه کنید.

در اینجا نکاتی برای استفادهٔ بهینه و کارآمد از Jedi آورده شده است.

اگر Jedi به دلیل ماهیت پویای Python نتواند نوع یک آرگومان تابع را به درستی تشخیص دهد، می‌توانید با مشخص کردن نوع آن با استفاده از یکی از سبک‌های docstring یا حاشیه‌نویسی (annotation) زیر به آن کمک کنید. تنها نوع‌دهی تدریجی (gradual typing) همیشه کار خواهد کرد؛ تمام راهکارهای مبتنی بر docstring ترفندهایی بزک‌شده هستند و در موارد پیچیده‌تر احتمالاً کار نخواهند کرد.

می‌توانید مطالب زیادی دربارهٔ سیستم نوع‌دهی تدریجی Python در PEPهای مربوطه بخوانید، مانند:

در ادامه چند مثال از نحوهٔ استفاده از این قابلیت آورده شده است.

حاشیه‌نویسی توابع (Function annotations):

def myfunction(node: ProgramNode, foo: str) -> None:
    """Do something with a ``node``.
    """
    node.| # complete here

تعیین نوع در انتساب، حلقه‌های for و دستورات with:

import typing
x: int = foo()
y: typing.Optional[int] = 3
key: str
value: Employee
for key, value in foo.items():
    pass
f: Union[int, float]
with foo() as f:
    print(f + 3)

استاندارد PEP-0484 باید به طور کامل پشتیبانی شود. در صورتی که این‌گونه نبود، با خیال راحت یک issue باز کنید. همچنین می‌توانید از فایل‌های stub استفاده کنید.

http://www.sphinx-doc.org/en/stable/domains.html#info-field-lists

def myfunction(node, foo):
    """
    Do something with a ``node``.
    :type node: ProgramNode
    :param str foo: foo parameter description
    """
    node.| # complete here

http://epydoc.sourceforge.net/manual-fields.html

def myfunction(node):
    """
    Do something with a ``node``.
    @type node: ProgramNode
    """
    node.| # complete here

https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt

برای پشتیبانی از قالب numpydoc، باید بستهٔ numpydoc https://pypi.python.org/pypi/numpydoc را نصب کنید.

def foo(var1, var2, long_var_name='hi'):
    r"""
    A one-line summary that does not use variable names or the
    function name.
    ...
    Parameters
    ----------
    var1 : array_like
        Array_like means all those objects -- lists, nested lists,
        etc. -- that can be converted to an array. We can also
        refer to variables like `var1`.
    var2 : int
        The type above can either refer to an actual Python type
        (e.g. ``int``), or describe the type of the variable in more
        detail, e.g. ``(N,) ndarray`` or ``array_like``.
    long_variable_name : {'hi', 'ho'}, optional
        Choices in brackets, default first when optional.
    ...
    """
    var2.| # complete here

فراخوانی‌های اصلی API و قابلیت‌های Jedi عبارت‌اند از:

  • تکمیل خودکار: Script.complete() <#jedi.Script.complete>؛ همچنین راه‌اندازی و استفاده از آن در REPL شما (مانند IPython و غیره) امکان‌پذیر است <#repl-completion>
  • پرش/استنتاج نوع: Script.goto() <#jedi.Script.goto> و Script.infer() <#jedi.Script.infer>
  • تحلیل ایستا: Script.get_names() <#jedi.Script.get_names> و Script.get_syntax_errors() <#jedi.Script.get_syntax_errors>
  • بازآفرینی‌ها: Script.rename() <#jedi.Script.rename>، Script.inline() <#jedi.Script.inline>، Script.extract_variable() <#jedi.Script.extract_variable> و Script.extract_function() <#jedi.Script.extract_function>
  • جستجوی کد: Script.search() <#jedi.Script.search> و Project.search() <#jedi.Project.search>

  • پشتیبانی از Python 3.10+
  • نادیده گرفتن خطاهای نحوی و تورفتگی نادرست
  • توانایی کار با ساختارهای پیچیدهٔ ماژول / تابع / کلاس
  • پشتیبانی عالی از virtualenv/venv
  • عملکرد عالی با قابلیت type hinting در پایتون <#type-hinting>،
  • شناسایی و درک فایل‌های stub
  • امکان استنتاج آرگومان‌های تابع برای docstringهای sphinx، epydoc و numpydoc پایه
  • در کل نرم‌افزاری بسیار پایدار و قابل اتکا است که در طول مدتی طولانی صیقل خورده است. از گزارش باگ‌ها به گرمی استقبال می‌شود و معمولاً ظرف چند هفته برطرف می‌گردند.

    Jedi از بسیاری از قابلیت‌های پرکاربرد پایتون پشتیبانی می‌کند:

  • عناصر توکار (builtins)
  • دستورهای returns،‏ yields و yield from
  • انتساب چندتایی‌ها (tuple assignments) / نمایه‌سازی آرایه‌ها / نمایه‌سازی دیکشنری‌ها / باز کردن بسته‌بندی با ستاره (star unpacking)
  • عبارت‌های with-statement / مدیریت استثناها
  • *args / **kwargs
  • دکوراتورها / توابع lambda / کلوژرها (closures)
  • مولدها (generators) / تکرارکننده‌ها (iterators)
  • توصیف‌کننده‌ها (descriptors): شامل property / staticmethod / classmethod / توصیف‌کننده‌های سفارشی
  • برخی متدهای جادویی: __call__، __iter__، __next__، __get__، __getitem__، __init__
  • list.append()، set.add()، list.extend() و غیره
  • ساخت لیست‌های تو در تو (list comprehensions) / عبارت‌های سه‌گانه (ternary expressions)
  • واردسازی‌های نسبی (relative imports)
  • getattr() / __getattr__ / __getattribute__
  • حاشیه‌نویسی توابع (function annotations)
  • تغییرات ساده و رایج در sys.path
  • بررسی‌های isinstance برای if/while/assert
  • بسته‌های فضای نام (شامل فضاهای نام pkgutil، pkg_resources و PEP420)
  • پشتیبانی از Django / Flask / Buildout
  • شناسایی فیکسچرهای Pytest

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

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

  • متاکلاس‌های دلخواه: برخی متاکلاس‌ها مانند enumها و dataclassها در Jedi بازپیاده‌سازی شده‌اند تا به درستی کار کنند. در بیشتر مواقع، پرونده‌های استاب (stubs) برای کارکرد صحیح استنتاج نوع کافی هستند، حتی هنگامی که متاکلاس‌ها دخیل باشند.
  • setattr()، __import__()
  • نوشتن روی برخی دیکشنری‌ها: globals()، locals()، object.__dict__
  • دستکاری نمونه‌ها خارج از متغیرهای نمونه بدون استفاده از متدها

وارد کردن numpy گاهی اوقات می‌تواند بسیار کند باشد، همچنین بارگذاری اولیهٔ توابع توکار نیز زمان‌بر است. اگر می‌خواهید سرعت کار را بالا ببرید، می‌توانید کتابخانه‌ها را با دستور preload_module() <#jedi.preload_module> در Jedi از پیش بارگذاری کنید. با این حال، پس از یک بار بارگذاری، این مسئله دیگر مشکلی نخواهد بود. همین موضوع برای ماژول‌های بسیار بزرگ مانند PySide، wx، tensorflow، pandas و غیره نیز صادق است.

برنامه Jedi لایه حافظه موقت (کش) خیلی مناسبی ندارد. این موضوع احتمالاً بزرگ‌ترین و تنها ایراد معماری https://github.com/davidhalter/jedi/issues/1059 در Jedi است. متأسفانه تغییر دادن آن آسان نیست. Dave Halter در فکر بازنویسی Jedi به زبان Rust است، اما رسیدن Jedi به نسخه 1.0 بیش از ۸ سال به طول انجامید و بازنویسی آن نیز احتمالاً سال‌ها زمان خواهد برد.

امنیت موضوع مهمی برای Jedi است. به‌طور پیش‌فرض، هیچ کدی درون Jedi اجرا نمی‌شود. تا زمانی که پایتون خالص بنویسید، همه‌چیز به‌صورت ایستا استنتاج می‌شود. اگر گزینهٔ load_unsafe_extensions=True را برای Project <#jedi.Project> خود فعال کنید و از ماژول‌های توکار (c_builtin) بهره بگیرید، Jedi آن ماژول‌ها را اجرا خواهد کرد. اگر به یک پایگاه کد اطمینان ندارید، لطفاً آن گزینه را فعال نکنید؛ چرا که ممکن است به اجرای کدهای دلخواه منجر شود..SS برای Interpreter <#jedi.Interpreter>

اگر برای Interpreter <#jedi.Interpreter> به دنبال امنیت هستید، از آن استفاده نکنید. Jedi ویژگی‌ها (properties) را اجرا می‌کند و به‌طور کلی برای جلوگیری از اجرای کد چندان محتاط نیست. این رفتار عمدی است: بیشتر افراد به پایه‌کدهایی که وارد (import) کرده‌اند اعتماد دارند، چرا که تا آن مرحله، یک پایه‌کد مخرب پیش‌تر امکان اجرای کد را داشته است.

نکته:

این مستندات عمدتاً برای توسعه‌دهندگان افزونه است که می‌خواهند ویرایشگرها/IDEهای خود را با Jedi بهبود بخشند.

این API از چند بخش مختلف تشکیل شده است:

  • نقطه‌های شروع اصلی برای complete/goto: کلاس‌های Script و Interpreter. اگر با Jedi کار می‌کنید، ابتدا باید این کلاس‌ها را بشناسید.
  • کلاس‌های نتیجهٔ API <#api-classes>
  • پشتیبانی از نسخه‌های Python و Virtualenv با توابعی مانند find_system_environments() و find_virtualenvs()
  • روشی برای کار با پوشه‌ها / پروژه‌های مختلف
  • توابع سودمند: preload_module() و set_debug_function()

متدهایی که به احتمال زیاد برای کار با Jedi از آن‌ها استفاده خواهید کرد به شرح زیر هستند:

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