| PARSO(1) | parso | PARSO(1) |
نام (NAME)
python-parso - مستندات کتابخانه تجزیهکننده پایتون parso
انتشار نسخه v0.8.7. (نصب <>)
کتابخانه Parso یک تجزیهکننده پایتون است که از بازیابی خطا (error recovery) و تجزیه رفت و برگشتی (round-trip parsing) برای نسخههای مختلف پایتون (در چندین نسخه پایتون) پشتیبانی میکند. Parso همچنین قادر است چندین خطای نحوی را در فایل پایتون شما فهرست کند.
کتابخانه Parso توسط jedi https://github.com/davidhalter/jedi در شرایط عملی و سنگین آزموده شده است. این ابزار از jedi جدا شد تا برای سایر پروژهها نیز قابل استفاده باشد.
کتابخانه Parso شامل یک API کوچک برای تجزیه پایتون و تحلیل درخت نحو است.
یک مثال ساده:
>>> import parso
>>> module = parso.parse('hello + 1', version="3.9")
>>> expr = module.children[0]
>>> expr
PythonNode(arith_expr, [<Name: hello@1,0>, <Operator: +>, <Number: 1>])
>>> print(expr.get_code())
hello + 1
>>> name = expr.children[0]
>>> name
<Name: hello@1,0>
>>> name.end_pos
(1, 5)
>>> expr.end_pos
(1, 9)
برای فهرست کردن چندین مورد یا خطا:
>>> grammar = parso.load_grammar()
>>> module = grammar.parse('foo +\nbar\ncontinue')
>>> error1, error2 = grammar.iter_errors(module)
>>> error1.message
'SyntaxError: invalid syntax'
>>> error2.message
"SyntaxError: 'continue' not properly in loop"
مستندات (DOCS)
نصب و پیکربندی (Installation and Configuration)
روش ترجیحی (pip)
در هر سیستمی میتوانید parso را مستقیماً از شاخص بستههای پایتون (PyPI) با استفاده از pip نصب کنید:
sudo pip install parso
نصب از git
اگر میخواهید نسخه توسعه جاری (شاخه master) را نصب کنید:
sudo pip install -e git+https://github.com/davidhalter/parso.git#egg=parso
نصب دستی از بسته دانلودشده (توصیه نمیشود)
اگر ترجیح میدهید از یک نصبکننده خودکار بسته استفاده نکنید، میتوانید یک نسخه جاری از parso را دانلود کرده https://github.com/davidhalter/parso/archive/master.zip و آن را به صورت دستی نصب کنید.
برای نصب آن، در کنسول خود به دایرکتوری حاوی setup.py رفته و تایپ کنید:
sudo python setup.py install
نحوه استفاده (Usage)
کتابخانه parso بر مبنای گرامرها کار میکند. شما میتوانید به سادگی با فراخوانی parso.load_grammar() گرامرهای پایتون را بسازید. گرامرها (همراه با توکنساز سفارشی و درختهای تجزیه سفارشی) را نیز میتوان با نمونهسازی مستقیم از parso.Grammar() ایجاد کرد. اطلاعات بیشتر درباره اشیاء حاصل را میتوانید در مستندات درخت تجزیهکننده <#parser-tree> بیابید.
سادهترین روش استفاده از parso حتی بدون بارگذاری گرامر است (parso.parse()):
>>> import parso
>>> parso.parse('foo + bar')
<Module: @1-1>
بارگذاری گرامر (Loading a Grammar)
به طور معمول اگر میخواهید با یک نسخه مشخص از پایتون کار کنید، از این دستور استفاده کنید:
- parso.load_grammar(*, version: str <https://docs.python.org/3/library/stdtypes.html#str> = None, path: str <https://docs.python.org/3/library/stdtypes.html#str> = None)
- یک parso.Grammar را بارگذاری میکند. نسخه پیشفرض، نسخه جاری پایتون است.
- پارامترها (Parameters)
- version (str https://docs.python.org/3/library/stdtypes.html#str) -- یک رشته نسخه پایتون، مانند version='3.8'.
- path (str https://docs.python.org/3/library/stdtypes.html#str) -- مسیر فایل گرامر
متدهای گرامر (Grammar methods)
یک شیء گرامر دریافت خواهید کرد که میتوانید از آن برای تجزیه کد و یافتن اشکالات موجود در آن استفاده کنید:
- class parso.Grammar(text: str <https://docs.python.org/3/library/stdtypes.html#str>, *, tokenizer, parser=<class 'parso.parser.BaseParser'>, diff_parser=None)
- تابع parso.load_grammar()
نمونههایی
از این کلاس
را
برمیگرداند.
ایجاد گرامرهای سفارشی غیر پایتونی با فراخوانی این کلاس هنوز پشتیبانی نمیشود.
- پارامترها (Parameters)
- text -- نمایش BNF از گرامر شما.
- parse(code: str <https://docs.python.org/3/library/stdtypes.html#str> | bytes <https://docs.python.org/3/library/stdtypes.html#bytes> = None, *, error_recovery=True, path: PathLike <https://docs.python.org/3/library/os.html#os.PathLike> | str <https://docs.python.org/3/library/stdtypes.html#str> = None, start_symbol: str <https://docs.python.org/3/library/stdtypes.html#str> = None, cache=False, diff_cache=False, cache_path: PathLike <https://docs.python.org/3/library/os.html#os.PathLike> | str <https://docs.python.org/3/library/stdtypes.html#str> = None, file_io: FileIO = None) -> _NodeT
- اگر قصد
تجزیه یک
فایل
پایتون را
دارید، به
احتمال
زیاد باید
از اینجا
شروع کنید.
اگر به کنترل دقیقتری روی نمونه تجزیهشده نیاز دارید، روشهای دیگری برای دسترسی به آن وجود خواهد داشت.
- پارامترها (Parameters)
- code (str https://docs.python.org/3/library/stdtypes.html#str) -- یک رشته یونیکد یا بایت. هنگامی که امکان رمزگشایی بایتها به رشته وجود نداشته باشد، یک UnicodeDecodeError https://docs.python.org/3/library/exceptions.html#UnicodeDecodeError بازمیگرداند.
- error_recovery (bool https://docs.python.org/3/library/functions.html#bool) -- در صورت فعال بودن، هر کدی بازگردانده میشود. اگر کد نامعتبر باشد، به صورت یک گره خطا بازگردانده خواهد شد. در صورت غیرفعال بودن، هنگام مواجهه با خطاهای نحوی در کد خود با ParseError مواجه خواهید شد.
- start_symbol (str https://docs.python.org/3/library/stdtypes.html#str) -- قاعده گرامر (پایانناپذیر یا nonterminal) که میخواهید تجزیه کنید. تنها زمانی مجاز به استفاده است که error_recovery برابر False باشد.
- path (str https://docs.python.org/3/library/stdtypes.html#str) -- مسیر فایلی که میخواهید باز کنید. فقط برای حافظه موقت (کش) مورد نیاز است.
- cache (bool https://docs.python.org/3/library/functions.html#bool) -- در صورت ارائه مسیر، رونوشتی از درخت تجزیهکننده را در حافظه RAM و دیسک نگه میدارد. در صورتی که فایلهای متناظر روی دیسک تغییر نکرده باشند، درختهای کششده را بازمیگرداند. توجه داشته باشید که این گزینه فایلهای pickle را روی سیستم فایل شما ذخیره میکند (به عنوان مثال برای لینوکس در ~/.cache/parso/).
- diff_cache (bool https://docs.python.org/3/library/functions.html#bool) -- ماژول پایتون کششده را با کد جدید مقایسه کرده (diff) و تلاش میکند تنها بخشهایی را که تغییر کردهاند تجزیه کند. همان ماژول (تغییریافته) موجود در کش را بازمیگرداند. استفاده از این گزینه مستلزم آن است که دیگر هیچ عملیاتی با ماژولهای کششده تحت آن مسیر انجام ندهید، زیرا محتویات آن ممکن است تغییر کند. این گزینه همچنان تا حدی آزمایشی است. اگر به پایداری نیاز دارید، لطفاً از آن استفاده نکنید.
- cache_path (bool https://docs.python.org/3/library/functions.html#bool) -- در صورت مشخص شدن، حافظه موقت parso را در این دایرکتوری ذخیره میکند. در صورت عدم تعیین، به مسیرهای کش پیشفرض در هر پلتفرم متوسل میشود.
- مقادیر بازگشتی (Returns)
- یک زیرکلاس از parso.tree.NodeOrLeaf <#parso.tree.NodeOrLeaf>. به طور معمول یک parso.python.tree.Module <#parso.python.tree.Module>.
- iter_errors(node)
- با دریافت یک parso.tree.NodeOrLeaf <#parso.tree.NodeOrLeaf> یک مولد از اشیاء parso.normalizer.Issue بازمیگرداند. برای پایتون این یک فهرست از خطاهای نحوی/فاصلهگذاری (syntax/indentation) است.
بازیابی خطاها (Error Retrieval)
کتابخانه parso قادر به یافتن چندین خطا در کد منبع شماست. پیمایش این خطاها نمونههای زیر را به دست میدهد:
ابزارهای کمکی (Utility)
کتابخانه parso همچنین توابع کمکی مفیدی ارائه میدهد:
- parso.parse(code=None, **kwargs)
- یک تابع کمکی برای اجتناب از بارگذاری دستی گرامرها. پارامترها در parso.Grammar.parse() مستند شدهاند.
- پارامترها (Parameters)
- version (str https://docs.python.org/3/library/stdtypes.html#str) -- نسخهای که توسط parso.load_grammar() استفاده میشود.
- parso.split_lines(string: str <https://docs.python.org/3/library/stdtypes.html#str>, keepends: bool <https://docs.python.org/3/library/functions.html#bool> = False) -> list <https://docs.python.org/3/library/stdtypes.html#list>[str <https://docs.python.org/3/library/stdtypes.html#str>]
- برای کدهای
پایتون در
نظر گرفته
شده است. بر
خلاف str.splitlines()
https://docs.python.org/3/library/stdtypes.html#str.splitlines
در پایتون،
کاراکترهای
پرش به صفحه
جدید (form feeds) و
سایر
نویسههای
خاص را به
عنوان متن
عادی در نظر
میگیرد.
فقط بر اساس
\n و \r\n خطوط
را جدا
میکند.
همچنین
تفاوت دیگر:
برای ورودی
رشته خالی،
[""]
بازمیگرداند.
در پایتون 2.7 هنگام استفاده از str.splitlines کاراکترهای form feed به عنوان نویسههای عادی استفاده میشدند. با این حال در پایتون ۳ تصمیمی گرفته شد که بر اساس form feed نیز جداسازی انجام شود.
- parso.python_bytes_to_unicode(source: str <https://docs.python.org/3/library/stdtypes.html#str> | bytes <https://docs.python.org/3/library/stdtypes.html#bytes>, encoding: str <https://docs.python.org/3/library/stdtypes.html#str> = 'utf-8', errors: str <https://docs.python.org/3/library/stdtypes.html#str> = 'strict') -> str <https://docs.python.org/3/library/stdtypes.html#str>
- وجود BOMهای یونیکد و اعلانات انکودینگ PEP 263 را بررسی میکند. سپس یک شیء یونیکد مشابه bytes.decode() https://docs.python.org/3/library/stdtypes.html#bytes.decode بازمیگرداند.
- پارامترها (Parameters)
- encoding -- مستندات bytes.decode() https://docs.python.org/3/library/stdtypes.html#bytes.decode را ببینید.
- errors -- مستندات bytes.decode() https://docs.python.org/3/library/stdtypes.html#bytes.decode را ببینید. گزینه errors میتواند 'strict'، 'replace' یا 'ignore' باشد.
پروژههای استفادهکننده (Used By)
- کتابخانه jedi https://github.com/davidhalter/jedi (که توسط IPython و بسیاری از افزونههای ویرایشگر استفاده میشود).
- ابزار mutmut https://github.com/boxed/mutmut (آزمونگر جهش یا mutation tester)
درخت تجزیه (Parser Tree)
درخت تجزیه با فراخوانی parso.Grammar.parse() <#parso.Grammar.parse> بازگردانده میشود.
یادداشت:
کلاسهای پایه درخت تجزیه (Parser Tree Base Classes)
بهطور کلی دو نوع کلاس وجود دارد که با آنها سر و کار خواهید داشت: parso.tree.Leaf و parso.tree.BaseNode.
- class parso.tree.BaseNode(children)
- Bases: NodeOrLeaf
کلاس پایه (super class) برای تمام گرهها. یک گره دارای فرزندان، یک نوع (type) و احتمالاً یک گره والد است.
- children
- فهرستی از گرههای فرزند NodeOrLeaf.
- property start_pos: Tuple <https://docs.python.org/3/library/typing.html#typing.Tuple>[int <https://docs.python.org/3/library/functions.html#int>, int <https://docs.python.org/3/library/functions.html#int>]
- موقعیت آغازین پیشوند را بهصورت یک تاپل بازمیگرداند؛ مانند (3, 4).
- تاپل بازگشتی از نوع عدد صحیح (Return tuple of int)
- (خط، ستون)
- get_start_pos_of_prefix()
- موقعیت start_pos پیشوند را بازمیگرداند. این عملاً به این معنی است که end_pos آخرین پیشوند را بازمیگرداند. مقدار get_start_pos_of_prefix() برای پیشوند + در 2 + 1 برابر (1, 1) خواهد بود، در حالی که start_pos برابر (1, 2) است.
- تاپل بازگشتی از نوع عدد صحیح (Return tuple of int)
- (خط، ستون)
- property end_pos: Tuple <https://docs.python.org/3/library/typing.html#typing.Tuple>[int <https://docs.python.org/3/library/functions.html#int>, int <https://docs.python.org/3/library/functions.html#int>]
- موقعیت پایانی پیشوند را بهصورت یک تاپل بازمیگرداند؛ مانند (3, 4).
- تاپل بازگشتی از نوع عدد صحیح (Return tuple of int)
- (خط، ستون)
- get_code(include_prefix=True)
- کدی را بازمیگرداند که ورودی تجزیهکننده برای این گره بوده است.
- پارامترها (Parameters)
- include_prefix -- پیشوند (فاصلههای خالی و کامنتها) مثلاً یک عبارت را حذف میکند.
- get_leaf_for_position(position, include_prefixes=False)
- برگ (parso.tree.Leaf) موجود در position را دریافت میکند.
- پارامترها (Parameters)
- position (tuple https://docs.python.org/3/library/stdtypes.html#tuple) -- یک تاپل موقعیت شامل خط، ستون. خطوط از ۱ شروع میشوند.
- include_prefixes (bool https://docs.python.org/3/library/functions.html#bool) -- در صورت False بودن، اگر position روی فاصلههای خالی یا کامنتهای قبل از یک برگ قرار گیرد، None بازگردانده میشود.
- مقادیر بازگشتی (Returns)
- شیء parso.tree.Leaf در position یا None
- get_first_leaf()
- نخستین برگ یک گره یا خود شیء را در صورت برگ بودن بازمیگرداند.
- get_last_leaf()
- آخرین برگ یک گره یا خود شیء را در صورت برگ بودن بازمیگرداند.
- class parso.tree.Leaf(value: str <https://docs.python.org/3/library/stdtypes.html#str>, start_pos: Tuple <https://docs.python.org/3/library/typing.html#typing.Tuple>[int <https://docs.python.org/3/library/functions.html#int>, int <https://docs.python.org/3/library/functions.html#int>], prefix: str <https://docs.python.org/3/library/stdtypes.html#str> = '')
- Bases: NodeOrLeaf
برگها اساساً توکنهایی با رابط برنامهنویسی (API) بهتر هستند. برگها دقیقاً میدانند در کجا تعریف شدهاند و چه متنی پیش از آنها قرار دارد.
- value
- str() مقدار توکن جاری.
- prefix: str <https://docs.python.org/3/library/stdtypes.html#str>
- str() معمولاً ترکیبی از فاصلههای خالی و کامنتها؛ مواردی که از نظر نحوی برای درخت نحو بیاهمیت هستند.
- property start_pos: Tuple <https://docs.python.org/3/library/typing.html#typing.Tuple>[int <https://docs.python.org/3/library/functions.html#int>, int <https://docs.python.org/3/library/functions.html#int>]
- موقعیت آغازین پیشوند را بهصورت یک تاپل بازمیگرداند؛ مانند (3, 4).
- تاپل بازگشتی از نوع عدد صحیح (Return tuple of int)
- (خط، ستون)
- get_start_pos_of_prefix()
- موقعیت start_pos پیشوند را بازمیگرداند. این عملاً به این معنی است که end_pos آخرین پیشوند را بازمیگرداند. مقدار get_start_pos_of_prefix() برای پیشوند + در 2 + 1 برابر (1, 1) خواهد بود، در حالی که start_pos برابر (1, 2) است.
- تاپل بازگشتی از نوع عدد صحیح (Return tuple of int)
- (خط، ستون)
- get_first_leaf()
- نخستین برگ یک گره یا خود شیء را در صورت برگ بودن بازمیگرداند.
- get_last_leaf()
- آخرین برگ یک گره یا خود شیء را در صورت برگ بودن بازمیگرداند.
- get_code(include_prefix=True)
- کدی را بازمیگرداند که ورودی تجزیهکننده برای این گره بوده است.
- پارامترها (Parameters)
- include_prefix -- پیشوند (فاصلههای خالی و کامنتها) مثلاً یک عبارت را حذف میکند.
- property end_pos: Tuple <https://docs.python.org/3/library/typing.html#typing.Tuple>[int <https://docs.python.org/3/library/functions.html#int>, int <https://docs.python.org/3/library/functions.html#int>]
- موقعیت پایانی پیشوند را بهصورت یک تاپل بازمیگرداند؛ مانند (3, 4).
- تاپل بازگشتی از نوع عدد صحیح (Return tuple of int)
- (خط، ستون)
تمام گرهها و برگها دارای این متدها و خصوصیات هستند:
- class parso.tree.NodeOrLeaf
- Bases: object
https://docs.python.org/3/library/functions.html#object
کلاس پایه برای گرهها و برگها.
- type: str <https://docs.python.org/3/library/stdtypes.html#str>
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- parent: BaseNode <#parso.tree.BaseNode> | None <https://docs.python.org/3/library/constants.html#None>
- گره والد (BaseNode) این گره یا برگ. در صورت ریشه بودن گره، مقدار آن None خواهد بود.
- get_root_node()
- گره ریشه یک درخت تجزیه را بازمیگرداند. گره بازگرداندهشده بر خلاف سایر گرهها و برگها گره والد ندارد.
- get_next_sibling()
- گرهای را بازمیگرداند که بلافاصله پس از این گره در فهرست فرزندان والد آن قرار دارد. اگر این گره همنیای بعدی نداشته باشد، None است.
- get_previous_sibling()
- گرهای را بازمیگرداند که بلافاصله پیش از این گره در فهرست فرزندان والد آن قرار دارد. اگر این گره همنیای قبلی نداشته باشد، None است.
- get_previous_leaf()
- برگ قبلی در درخت تجزیه را بازمیگرداند. اگر این عنصر نخستین عنصر در درخت تجزیه باشد، None بازمیگرداند.
- get_next_leaf()
- برگ بعدی در درخت تجزیه را بازمیگرداند. اگر این عنصر آخرین عنصر در درخت تجزیه باشد، None بازمیگرداند.
- abstract property start_pos: Tuple <https://docs.python.org/3/library/typing.html#typing.Tuple>[int <https://docs.python.org/3/library/functions.html#int>, int <https://docs.python.org/3/library/functions.html#int>]
- موقعیت آغازین پیشوند را بهصورت یک تاپل بازمیگرداند؛ مانند (3, 4).
- تاپل بازگشتی از نوع عدد صحیح (Return tuple of int)
- (خط، ستون)
- abstract property end_pos: Tuple <https://docs.python.org/3/library/typing.html#typing.Tuple>[int <https://docs.python.org/3/library/functions.html#int>, int <https://docs.python.org/3/library/functions.html#int>]
- موقعیت پایانی پیشوند را بهصورت یک تاپل بازمیگرداند؛ مانند (3, 4).
- تاپل بازگشتی از نوع عدد صحیح (Return tuple of int)
- (خط، ستون)
- abstractmethod get_start_pos_of_prefix()
- موقعیت start_pos پیشوند را بازمیگرداند. این عملاً به این معنی است که end_pos آخرین پیشوند را بازمیگرداند. مقدار get_start_pos_of_prefix() برای پیشوند + در 2 + 1 برابر (1, 1) خواهد بود، در حالی که start_pos برابر (1, 2) است.
- تاپل بازگشتی از نوع عدد صحیح (Return tuple of int)
- (خط، ستون)
- abstractmethod get_first_leaf()
- نخستین برگ یک گره یا خود شیء را در صورت برگ بودن بازمیگرداند.
- abstractmethod get_last_leaf()
- آخرین برگ یک گره یا خود شیء را در صورت برگ بودن بازمیگرداند.
- abstractmethod get_code(include_prefix=True)
- کدی را بازمیگرداند که ورودی تجزیهکننده برای این گره بوده است.
- پارامترها (Parameters)
- include_prefix -- پیشوند (فاصلههای خالی و کامنتها) مثلاً یک عبارت را حذف میکند.
- search_ancestor(*node_types: str <https://docs.python.org/3/library/stdtypes.html#str>) -> BaseNode <#parso.tree.BaseNode> | None <https://docs.python.org/3/library/constants.html#None>
- بهصورت بازگشتی والدین این گره یا برگ را بررسی میکند و نخستین گره یافتشده منطبق با node_types را بازمیگرداند. در صورت نیافتن گره منطبق، مقدار None بازگردانده میشود.
- پارامترها (Parameters)
- node_types -- نام انواعی که جستجو میشوند.
- dump(*, indent: int <https://docs.python.org/3/library/functions.html#int> | str <https://docs.python.org/3/library/stdtypes.html#str> | None <https://docs.python.org/3/library/constants.html#None> = 4) -> str <https://docs.python.org/3/library/stdtypes.html#str>
- یک خروجی
ساختاریافته
(dump) از درخت
تجزیه به
ریشه این
گره یا برگ
بازمیگرداند.
این قابلیت
عمدتاً
برای مقاصد
اشکالزدایی
مفید است.
پارامتر indent مشابه با ast.dump() https://docs.python.org/3/library/ast.html#ast.dump تفسیر میشود. اگر indent یک عدد صحیح غیرمنفی یا رشته باشد، درخت با آن سطح تورفتگی بهصورت خوانا (pretty-print) نمایش داده میشود. سطح تورفتگی صفر، منفی یا "" تنها خط جدید درج میکند. مقدار None نمایش تکخطی را انتخاب میکند. استفاده از یک عدد صحیح مثبت به همان تعداد فاصله در هر سطح تورفتگی ایجاد میکند. اگر indent یک رشته باشد (مانند "\t")، از آن رشته برای تورفتگی هر سطح استفاده میشود.
- پارامترها (Parameters)
- indent -- سبک تورفتگی همانطور که در بالا توضیح داده شد. تورفتگی پیشفرض ۴ فاصله است که خروجی مرتب و خوانایی تولید میکند.
>>> import parso
>>> print(parso.parse("lambda x, y: x + y").dump())
Module([
Lambda([
Keyword('lambda', (1, 0)),
Param([
Name('x', (1, 7), prefix=' '),
Operator(',', (1, 8)),
]),
Param([
Name('y', (1, 10), prefix=' '),
]),
Operator(':', (1, 11)),
PythonNode('arith_expr', [
Name('x', (1, 13), prefix=' '),
Operator('+', (1, 15), prefix=' '),
Name('y', (1, 17), prefix=' '),
]),
]),
EndMarker('', (1, 18)),
])
درخت تجزیه پایتون (Python Parser Tree)
این درخت نحو برای نحوهای پایتون ۳ است. کلاسها عناصر نحوی مانند توابع و دستورات وارد کردن (imports) را نشان میدهند.
تمامی گرهها را میتوان تا فایل گرامر پایتون https://docs.python.org/3/reference/grammar.html ردیابی کرد. اگر میخواهید بدانید یک درخت چگونه ساختار یافته است، کافی است آن فایل را بررسی کنید (که برای هر نسخه پایتون کمی متفاوت است).
منطق زیادی در اینجا پیاده شده است که کار با درخت نحو پایتون را برای Jedi (و سایر کتابخانهها) سادهتر میکند.
با استفاده از parso.tree.NodeOrLeaf.get_code() روی یک ماژول، میتوانید نمایش متناظر یکبهیک ورودی دادهشده به تجزیهکننده را دریافت کنید. این ویژگی هنگام بازآفرینی (refactor) یک درخت تجزیه بسیار مهم است.
>>> from parso import parse
>>> parser = parse('import os')
>>> module = parser.get_root_node()
>>> module
<Module: @1-1>
هر زیرکلاسی از Scope، از جمله Module، دارای مشخصه iter_imports است:
>>> list(module.iter_imports()) [<ImportName: import os@1,0>]
تغییرات در گرامر پایتون (Changes to the Python Grammar)
با بررسی فایلهای گرامر پایتون، چند مورد تغییر کرده است:
- کلاس Param در فایلهای گرامر پایتون وجود ندارد؛ این بخش در اصل جزئی از یک گره parameters است. کتابخانه parso آن را تفکیک میکند تا تحلیل پارامترها آسانتر شود. با این حال این کار تنها تعامل با درخت نحو را راحتتر میکند و نحو معتبر را تغییر نمیدهد.
- چند گره مانند lambdef و lambdef_nocond در درخت نحو ادغام شدهاند تا کار با آنها سادهتر گردد.
- class parso.python.tree.DocstringMixin
- Bases: object https://docs.python.org/3/library/functions.html#object
- get_doc_node()
- برگ رشتهای یک docstring را بازمیگرداند؛ مانند r'''foo'''.
- class parso.python.tree.PythonMixin
- Bases: object
https://docs.python.org/3/library/functions.html#object
برخی ابزارهای کمکی ویژه پایتون.
- get_name_of_position(position)
- با دریافت یک تاپل (خط، ستون)، شیء Name مربوطه را بازمیگرداند یا اگر نامی در آن موقعیت وجود نداشته باشد مقدار None بازمیگرداند.
- get_start_pos_of_prefix()
- اساساً متد parso.tree.NodeOrLeaf.get_start_pos_of_prefix() را فراخوانی میکند.
- class parso.python.tree.PythonBaseNode(children)
- Bases: PythonMixin, BaseNode
- class parso.python.tree.PythonNode(type, children)
- Bases: PythonMixin, Node
- class parso.python.tree.PythonErrorNode(children)
- Bases: PythonMixin, ErrorNode
- class parso.python.tree.PythonErrorLeaf(token_type, value, start_pos, prefix='')
- Bases: ErrorLeaf, PythonLeaf
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'endmarker'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- class parso.python.tree.Newline(value: str <https://docs.python.org/3/library/stdtypes.html#str>, start_pos: Tuple <https://docs.python.org/3/library/typing.html#typing.Tuple>[int <https://docs.python.org/3/library/functions.html#int>, int <https://docs.python.org/3/library/functions.html#int>], prefix: str <https://docs.python.org/3/library/stdtypes.html#str> = '')
- Bases: PythonLeaf
حاوی توکنهای NEWLINE و ENDMARKER است.
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'newline'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- class parso.python.tree.Name(value: str <https://docs.python.org/3/library/stdtypes.html#str>, start_pos: Tuple <https://docs.python.org/3/library/typing.html#typing.Tuple>[int <https://docs.python.org/3/library/functions.html#int>, int <https://docs.python.org/3/library/functions.html#int>], prefix: str <https://docs.python.org/3/library/stdtypes.html#str> = '')
- Bases: _LeafWithoutNewlines
یک رشته. گاهی اوقات مهم است بدانیم آیا رشته متعلق به یک نام (شناسه) است یا خیر.
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'name'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- is_definition(include_setitem=False)
- در صورتی که نام در حال تعریف شدن باشد مقدار True بازمیگرداند.
- get_definition(import_name_always=False, include_setitem=False)
- اگر تعریفی برای نام وجود نداشته باشد مقدار None بازمیگرداند.
- پارامترها (Parameters)
- import_name_always -- مشخص میکند که آیا نام واردشده (import name) همیشه یک تعریف به حساب میآید یا خیر. به طور معمول foo در عبارت from foo import bar یک تعریف نیست.
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'number'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'string'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- class parso.python.tree.FStringString(value: str <https://docs.python.org/3/library/stdtypes.html#str>, start_pos: Tuple <https://docs.python.org/3/library/typing.html#typing.Tuple>[int <https://docs.python.org/3/library/functions.html#int>, int <https://docs.python.org/3/library/functions.html#int>], prefix: str <https://docs.python.org/3/library/stdtypes.html#str> = '')
- Bases: PythonLeaf
رشتههای قالببندیشده (f-strings) حاوی عبارات f-string و رشتههای عادی پایتون هستند. این کلاس بخشهای رشتهای f-stringها را نشان میدهد.
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'fstring_string'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- class parso.python.tree.FStringStart(value: str <https://docs.python.org/3/library/stdtypes.html#str>, start_pos: Tuple <https://docs.python.org/3/library/typing.html#typing.Tuple>[int <https://docs.python.org/3/library/functions.html#int>, int <https://docs.python.org/3/library/functions.html#int>], prefix: str <https://docs.python.org/3/library/stdtypes.html#str> = '')
- Bases: PythonLeaf
رشتههای قالببندیشده (f-strings) حاوی عبارات f-string و رشتههای عادی پایتون هستند. این کلاس بخش آغازین f-stringها را نشان میدهد.
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'fstring_start'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- class parso.python.tree.FStringEnd(value: str <https://docs.python.org/3/library/stdtypes.html#str>, start_pos: Tuple <https://docs.python.org/3/library/typing.html#typing.Tuple>[int <https://docs.python.org/3/library/functions.html#int>, int <https://docs.python.org/3/library/functions.html#int>], prefix: str <https://docs.python.org/3/library/stdtypes.html#str> = '')
- Bases: PythonLeaf
رشتههای قالببندیشده (f-strings) حاوی عبارات f-string و رشتههای عادی پایتون هستند. این کلاس بخش پایانی f-stringها را نشان میدهد.
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'fstring_end'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- class parso.python.tree.Operator(value: str <https://docs.python.org/3/library/stdtypes.html#str>, start_pos: Tuple <https://docs.python.org/3/library/typing.html#typing.Tuple>[int <https://docs.python.org/3/library/functions.html#int>, int <https://docs.python.org/3/library/functions.html#int>], prefix: str <https://docs.python.org/3/library/stdtypes.html#str> = '')
- Bases: _LeafWithoutNewlines, _StringComparisonMixin
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'operator'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- class parso.python.tree.Keyword(value: str <https://docs.python.org/3/library/stdtypes.html#str>, start_pos: Tuple <https://docs.python.org/3/library/typing.html#typing.Tuple>[int <https://docs.python.org/3/library/functions.html#int>, int <https://docs.python.org/3/library/functions.html#int>], prefix: str <https://docs.python.org/3/library/stdtypes.html#str> = '')
- Bases: _LeafWithoutNewlines, _StringComparisonMixin
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'keyword'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- class parso.python.tree.Scope(children)
- Bases: PythonBaseNode, DocstringMixin
کلاس والد برای درخت تجزیه که وضعیت یک فایل متنی پایتون را نشان میدهد. یک محدوده (Scope) یا یک تابع، کلاس یا لامبدا (lambda) است.
- iter_funcdefs()
- تولیدکنندهای (generator) از گرههای funcdef بازمیگرداند.
- iter_classdefs()
- تولیدکنندهای از گرههای classdef بازمیگرداند.
- iter_imports()
- تولیدکنندهای از گرههای import_name و import_from بازمیگرداند.
- get_suite()
- بخشی را که توسط تابع اجرا میشود بازمیگرداند.
- class parso.python.tree.Module(children)
- Bases: Scope
بالاترین محدوده (top scope) که همیشه یک ماژول است. بسته به تجزیهکننده زیرین، این ممکن است یک ماژول کامل یا تنها بخشی از یک ماژول باشد.
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'file_input'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- get_used_names()
- تمام برگهای Name موجود در این ماژول را بازمیگرداند. این شامل هر دو مورد تعاریف و ارجاعات نامها میشود.
- class parso.python.tree.Decorator(children)
- Bases: PythonBaseNode
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'decorator'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- class parso.python.tree.ClassOrFunc(children)
- Bases: Scope
- property name
- برگ Name را بازمیگرداند که نام تابع یا کلاس را تعریف میکند.
- نوع بازگشتی (Return type)
- فهرستی از Decorator
- class parso.python.tree.Class(children)
- Bases: ClassOrFunc
برای ذخیره محتوای تجزیهشده یک کلاس پایتون استفاده میشود.
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'classdef'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- get_super_arglist()
- گره arglist را که کلاسهای والد (super classes) را تعریف میکند بازمیگرداند. در صورت نبود آرگومان، مقدار None بازمیگرداند.
- class parso.python.tree.Function(children)
- Bases: ClassOrFunc
برای ذخیره محتوای تجزیهشده یک تابع پایتون استفاده میشود.
فرزندان:
0. <Keyword: def> 1. <Name> 2. فهرست پارامترها (شامل عملگرهای <Operator> پرانتز باز و بسته) 3. یا 5. <Operator: :> 4. یا 6. Node() که بدنه تابع را نشان میدهد 3. -> (در صورت وجود یادداشت نوع) 4. یادداشت نوع (در صورت وجود)
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'funcdef'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- get_params()
- فهرستی از Param() بازمیگرداند.
- property name
- برگ Name را بازمیگرداند که نام تابع یا کلاس را تعریف میکند.
- iter_yield_exprs()
- تولیدکنندهای از yield_expr بازمیگرداند.
- iter_return_stmts()
- تولیدکنندهای از return_stmt بازمیگرداند.
- iter_raise_stmts()
- تولیدکنندهای از raise_stmt بازمیگرداند؛ شامل عبارات raise درون بلوکهای try-except.
- مقدار بولی بازگشتی (Return bool)
- بررسی میکند که آیا تابع یک مولد (generator) است یا خیر.
- property annotation
- گره آزمون (test node) پس از -> یا در صورت عدم وجود یادداشت نوع، None را بازمیگرداند.
- class parso.python.tree.Lambda(children)
- Bases: Function
توابع لامبدا (Lambdas) اساساً توابع خلاصهشده هستند، بنابراین همان رابط را ارائه میدهند.
فرزندان:
0. <Keyword: lambda> *. <Param x> به ازای هر آرگومان x -2. <Operator: :> -1. Node() نشاندهنده بدنه
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'lambdef'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- property name
- خطای AttributeError ایجاد میکند؛ لامبداها نام تعریفشدهای ندارند.
- property annotation
- مقدار None بازمیگرداند؛ لامبداها یادداشت نوع ندارند.
- class parso.python.tree.Flow(children)
- Bases: PythonBaseNode
- class parso.python.tree.IfStmt(children)
- Bases: Flow
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'if_stmt'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- get_test_nodes()
- به عنوان مثال تمام گرههای test را که در زیر به نام x آمدهاند بازمیگرداند:
- get_corresponding_test_node(node)
- شاخهای را که گره در آن قرار دارد جستجو کرده و گره آزمون متناظر را بازمیگرداند (به تابع بالا مراجعه کنید). با این حال اگر گره در خود گره آزمون باشد و نه در بلوک اجرایی (suite)، مقدار None بازمیگرداند.
- is_node_after_else(node)
- بررسی میکند که آیا یک گره پس از else تعریف شده است یا خیر.
- class parso.python.tree.WhileStmt(children)
- Bases: Flow
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'while_stmt'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- class parso.python.tree.ForStmt(children)
- Bases: Flow
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'for_stmt'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- get_testlist()
- گره ورودی y را از عبارت for x in y: بازمیگرداند.
- class parso.python.tree.TryStmt(children)
- Bases: Flow
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'try_stmt'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- get_except_clause_tests()
- گرههای test یافتشده در گرههای except_clause را بازمیگرداند. برای بندهای except بدون مشخص کردن استثنا، مقدار [None] بازمیگرداند.
- class parso.python.tree.WithStmt(children)
- Bases: Flow
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'with_stmt'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- get_defined_names(include_setitem=False)
- فهرستی از Name را که عبارت with تعریف میکند بازمیگرداند. نامهای تعریفشده پس از as قرار میگیرند.
- class parso.python.tree.Import(children)
- Bases: PythonBaseNode
- get_path_for_name(name)
- مسیر، فهرستی از نامها است که به نام مورد جستجو منتهی میشود.
- فهرستی از Name (Return list of Name)
- class parso.python.tree.ImportFrom(children)
- Bases: Import
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'import_from'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- get_defined_names(include_setitem=False)
- فهرستی از Name را که دستور import تعریف میکند بازمیگرداند. نامهای تعریفشده پس از import قرار میگیرند یا در صورت وجود نام مستعار - as - آن نام بازگردانده میشود.
- property level
- پارامتر level در متد __import__.
- get_paths()
- مسیرهای وارد کردن تعریفشده در یک عبارت import. معمولاً آرایهای شبیه به این است: [<Name: datetime>, <Name: date>].
- فهرستی از فهرستهای Name (Return list of list of Name)
- class parso.python.tree.ImportName(children)
- Bases: Import
برای گرههای import_name. دستورات وارد کردن عادی بدون from را پوشش میدهد.
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'import_name'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- get_defined_names(include_setitem=False)
- فهرستی از Name را که دستور import تعریف میکند بازمیگرداند. نام تعریفشده همیشه نخستین نام پس از import است یا در صورت وجود نام مستعار - as - آن نام بازگردانده میشود.
- property level
- پارامتر level در متد __import__.
- is_nested()
- حالت خاص وارد کردنهای تو در تو، بدون نام مستعار و بدون دستور from را بررسی میکند:
import foo.bar
- class parso.python.tree.KeywordStatement(children)
- Bases: PythonBaseNode
برای عبارات زیر: assert، del، global، nonlocal، raise، return، yield.
کلمات کلیدی pass، continue و break در اینجا قرار ندارند، زیرا فقط کلمات کلیدی ساده هستند و تجزیهکننده آنها را به یک کلمه کلیدی تقلیل میدهد.
- property type
- دستورات کلمه کلیدی با کلمه کلیدی شروع شده و با _stmt پایان مییابند. میتوانید این موضوع را با گرامر پایتون مطابقت دهید.
- class parso.python.tree.AssertStmt(children)
- Bases: KeywordStatement
- class parso.python.tree.GlobalStmt(children)
- Bases: KeywordStatement
- class parso.python.tree.ReturnStmt(children)
- Bases: KeywordStatement
- class parso.python.tree.YieldExpr(children)
- Bases: PythonBaseNode
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'yield_expr'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- class parso.python.tree.ExprStmt(children)
- Bases: PythonBaseNode, DocstringMixin
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'expr_stmt'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- get_defined_names(include_setitem=False)
- فهرستی از Name تعریفشده قبل از علامت = را بازمیگرداند.
- get_rhs()
- سمت راست (right-hand-side) علامت مساوی را بازمیگرداند.
- yield_operators()
- تولیدکنندهای از عملگرهای +=، = و غیره یا در صورت نبود هیچ عملیاتی None بازمیگرداند.
- class parso.python.tree.NamedExpr(children)
- Bases: PythonBaseNode
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'namedexpr_test'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- class parso.python.tree.Param(children, parent=None)
- Bases: PythonBaseNode
یک کلاس کمکی است که منطق کار با پارامترها را بسیار آسانتر میکند. گرامر پایتون هیچ گره param مستقلی تعریف نمیکند، بلکه آن را به شیوهای دیگر تعریف میکند که برای کار با پارامترها چندان مناسب نیست.
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'param'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- property star_count
- برای foo برابر 0، برای *foo برابر 1 یا برای **foo برابر 2 است.
- property default
- مقدار پیشفرض، گره آزمونی است که پس از = ظاهر میشود. در صورت عدم وجود مقدار پیشفرض، برابر None است.
- property annotation
- گره آزمونی است که پس از : ظاهر میشود. در صورت عدم وجود یادداشت نوع، برابر None است.
- property name
- برگ Name مربوط به پارامتر.
- property position_index
- ویژگی شاخص موقعیتی یک پارامتر.
- get_parent_function()
- تابع یا لامبدای والد یک پارامتر را بازمیگرداند.
- get_code(include_prefix=True, include_comma=True)
- مانند تمام توابع دیگر get_code، اما پارامتر include_comma را نیز شامل میشود.
- پارامترها (Parameters)
- bool (include_comma) -- در صورت فعال بودن، کاما را در رشته خروجی لحاظ میکند.
- class parso.python.tree.SyncCompFor(children)
- Bases: PythonBaseNode
- type: str <https://docs.python.org/3/library/stdtypes.html#str> = 'sync_comp_for'
- نوع یک رشته است که معمولاً با انواع فایل گرامر مطابقت دارد.
- get_defined_names(include_setitem=False)
- فهرستی از Name را که عبارت درک (comprehension) تعریف میکند بازمیگرداند.
- parso.python.tree.CompFor
- نام مستعار (alias) برای SyncCompFor
- class parso.python.tree.UsedNamesMapping(dct)
- Bases: Mapping
https://docs.python.org/3/library/collections.abc.html#collections.abc.Mapping
این کلاس صرفاً با هدف ایجاد یک دیکشنری تغییرناپذیر (immutable dict) ایجاد شده است.
ابزارهای کمکی (Utility)
- parso.tree.search_ancestor(node: NodeOrLeaf <#parso.tree.NodeOrLeaf>, *node_types: str <https://docs.python.org/3/library/stdtypes.html#str>) -> BaseNode <#parso.tree.BaseNode> | None <https://docs.python.org/3/library/constants.html#None>
- بهطور
بازگشتی
والدین یک
گره را
بررسی
میکند و
نخستین گره
یافتشده
منطبق با
node_types را
بازمیگرداند.
در صورت
نیافتن گره
منطبق،
مقدار None
بازگردانده
میشود.
این تابع منسوخ شده است؛ به جای آن از NodeOrLeaf.search_ancestor() استفاده کنید.
- پارامترها (Parameters)
- node -- اجداد این گره بررسی خواهند شد.
- node_types -- نام انواعی که جستجو میشوند.
توسعه (Development)
اگر تمایل به هرگونه مشارکت در توسعه parso دارید، برای بحث و گفتگو یک issue یا pull request باز کنید. ما از تغییرات استقبال میکنیم! لطفاً ابتدا فایل CONTRIBUTING.md موجود در مخزن را بررسی کنید.
فرآیند منسوخسازی (Deprecations Process)
فرآیند منسوخسازی به شرح زیر است:
- 1.
- منسوخسازی در انتشار اصلی یا فرعی بعدی (major/minor release) اعلام میشود.
- 2.
- پیش از حذف قابلیت منسوخشده، حداقل یک سال و حداقل دو نسخه فرعی منتظر میمانیم.
آزمون و تست (Testing)
مجموعه آزمون به pytest وابسته است:
pip install pytest
برای اجرای آزمونها از دستور زیر استفاده کنید:
pytest
اگر میخواهید تنها یک نسخه خاص از پایتون (مثلاً پایتون ۳.۹) را تست کنید، به سادگی زیر قابل انجام است:
python3.9 -m pytest
آزمونها همچنین به صورت خودکار در GitHub Actions https://github.com/davidhalter/parso/actions اجرا میشوند.
منابع (RESOURCES)
- کد منبع در گیتهاب https://github.com/davidhalter/parso
- آزمونهای GitHub Actions https://github.com/davidhalter/parso/actions
- نمایه بستههای پایتون (PyPI) http://pypi.python.org/pypi/parso
نویسنده (AUTHOR)
مشارکتکنندگان parso
حق نشر (COPYRIGHT)
مشارکتکنندگان parso
| August 30, 2026 | 0.8 |