يتحقق Pytype من أنواع كود Python الخاص بك ويستنتجها - دون الحاجة إلى تعليقات توضيحية للنوع. يمكن لـ Pytype:
Pytype هو محلل ثابت. لا ينفذ الكود الذي يعمل عليه.
تعتمد آلاف المشاريع في Google على pytype للحفاظ على كود Python مكتوبًا جيدًا وخاليًا من الأخطاء.
لمزيد من المعلومات، راجع دليل المستخدم أو الأسئلة الشائعة أو الميزات المدعومة.
يستخدم Pytype الاستدلال بدلاً من الكتابة التدريجية. هذا يعني أنه سيستنتج الأنواع الموجودة على الكود حتى عندما لا يحتوي الكود على تلميحات للنوع عليه. لذلك يمكنه اكتشاف مشكلات في التعليمات البرمجية مثل هذه، والتي قد تفوتها مدققات النوع الأخرى:
def f ():
return "PyCon"
def g ():
return f () + 2019
# pytype: line 4, in g: unsupported operand type(s) for +: 'str'
# and 'int' [unsupported-operands]
Pytype متساهل بدلاً من صارم. وهذا يعني أنه يسمح لجميع العمليات التي تنجح في وقت التشغيل ولا تتعارض مع التعليقات التوضيحية. على سبيل المثال، سوف يمر هذا الكود على أنه آمن في pytype، ولكنه يفشل في أدوات فحص النوع الأخرى، التي تقوم بتعيين الأنواع للمتغيرات بمجرد تهيئتها:
from typing import List
def get_list () -> List [ str ]:
lst = [ "PyCon" ]
lst . append ( 2019 )
return [ str ( x ) for x in lst ]
# mypy: line 4: error: Argument 1 to "append" of "list" has
# incompatible type "int"; expected "str"
راجع أيضًا إدخال الأسئلة الشائعة المطابق.
للبدء سريعًا في التحقق من نوع ملف أو دليل، قم بتشغيل ما يلي، مع استبدال file_or_directory
بإدخالك:
pip install pytype
pytype file_or_directory
لإعداد pytype على حزمة بأكملها، قم بإضافة ما يلي إلى ملف pyproject.toml
في الدليل أعلى الحزمة مباشرة، مع استبدال package_name
باسم الحزمة:
[ tool . pytype ]
inputs = [ ' package_name ' ]
يمكنك الآن تشغيل الأمر pytype
بدون وسيطة للتحقق من نوع الحزمة. من السهل أيضًا إضافة pytype إلى الاختبار الآلي الخاص بك؛ راجع هذا المثال لمشروع GitHub الذي يقوم بتشغيل pytype على GitHub Actions.
وأخيرًا، ينشئ pytype ملفات تحتوي على معلومات النوع المستنتج، والموجودة افتراضيًا في .pytype/pyi
. يمكنك استخدام هذه المعلومات لكتابة التعليق التوضيحي على الملف المصدر المقابل:
merge-pyi -i < filepath > .py .pytype/pyi/ < filename > .pyi
أنت بحاجة إلى مترجم Python 3.8-3.12 لتشغيل pytype، بالإضافة إلى مترجم في $PATH
لإصدار Python من الكود الذي تقوم بتحليله (مدعوم: 3.8-3.12).
دعم المنصة:
* في Alpine Linux، قد يفشل التثبيت بسبب مشكلات تتعلق بالتبعيات الأولية. راجع تفاصيل هذه المشكلة للحصول على حل محتمل.
** إذا فشل تثبيت تبعية ninja، فتأكد من تثبيت cmake. راجع هذه المشكلة للحصول على التفاصيل.
يمكن تثبيت Pytype عبر النقطة. لاحظ أن التثبيت يتطلب wheel
وأدوات setuptools
. (إذا كنت تعمل في virtualenv، فيجب أن تكون هاتان الحزمتان موجودتين بالفعل.)
pip install pytype
أو من الكود المصدري على GitHub.
git clone --recurse-submodules https://github.com/google/pytype.git
cd pytype
pip install .
بدلاً من استخدام --recurse-submodules
، كان من الممكن أيضًا تشغيله
git submodule init
git submodule update
في الدليل pytype
. لتحرير الكود وتتبع تعديلاتك مباشرة، استبدل أمر pip install بما يلي:
pip install -e .
اتبع الخطوات المذكورة أعلاه، ولكن تأكد من حصولك على المكتبات الصحيحة أولاً:
sudo apt install build-essential python3-dev libpython3-dev
usage: pytype [options] input [input ...]
positional arguments:
input file or directory to process
الخيارات الشائعة:
-V, --python-version
: إصدار Python (major.minor) من الكود الهدف. الإعدادات الافتراضية للإصدار الذي يعمل عليه pytype.-o, --output
: الدليل الذي تنتقل إليه جميع مخرجات pytype، بما في ذلك ملفات .pyi التي تم إنشاؤها. الإعدادات الافتراضية هي .pytype
.-d, --disable
. قائمة بأسماء الأخطاء التي يجب تجاهلها بفواصل أو مفصولة بمسافات. توجد شرح تفصيلي لأسماء أخطاء pytype في هذا المستند. الإعدادات الافتراضية فارغة. للحصول على قائمة كاملة بالخيارات، قم بتشغيل pytype --help
.
بالإضافة إلى ما سبق، يمكنك توجيه pytype لاستخدام تثبيت مكتوب مخصص بدلاً من نسخته المجمعة عن طريق تعيين $TYPESHED_HOME
.
للراحة، يمكنك حفظ تكوين pytype الخاص بك في ملف. يمكن أن يكون ملف التكوين ملفًا بنمط TOML مع قسم [tool.pytype]
(مفضل) أو ملفًا بنمط INI مع قسم [pytype]
. إذا لم يتم توفير ملف تكوين صريح، فسيبحث pytype عن قسم pytype في أول ملف pyproject.toml
أو setup.cfg
الذي تم العثور عليه من خلال الانتقال لأعلى من دليل العمل الحالي.
ابدأ بإنشاء نموذج لملف التكوين:
$ pytype --generate-config pytype.toml
الآن قم بتخصيص الملف بناءً على الإعداد المحلي الخاص بك، مع الاحتفاظ بالأقسام التي تحتاجها فقط. قد تكون الأدلة مرتبطة بموقع ملف التكوين، وهو أمر مفيد إذا كنت تريد التحقق من ملف التكوين كجزء من مشروعك.
على سبيل المثال، لنفترض أن لديك بنية الدليل التالية وتريد تحليل الحزمة ~/repo1/foo
، والتي تعتمد على الحزمة ~/repo2/bar
:
~/
├── repo1
│ └── foo
│ ├── __init__.py
│ └── file_to_check.py
└── repo2
└── bar
├── __init__.py
└── dependency.py
إليك ملف التكوين المملوء، الذي يوجه pytype للتحقق من النوع ~/repo1/foo
كرمز Python 3.9، والبحث عن الحزم في ~/repo1
و ~/repo2
، وتجاهل أخطاء السمات. لاحظ أن المسار إلى الحزمة لا يتضمن الحزمة نفسها.
$ cat ~/repo1/pytype.toml
# NOTE: All relative paths are relative to the location of this file.
[ tool . pytype ]
# Space-separated list of files or directories to process.
inputs = [
' foo ' ,
]
# Python version (major.minor) of the target code.
python_version = ' 3.9 '
# Paths to source code directories, separated by ':'.
pythonpath = . :~/repo2
# Space-separated list of error names to ignore.
disable = [
' attribute-error ' ,
]
كان من الممكن أن نكتشف أن ~/repo2
بحاجة إلى إضافته إلى مسار pythonpath عن طريق تشغيل مدقق التبعيات المعطلة لـ pytype:
$ pytype --config=~/repo1/pytype.toml ~/repo1/foo/*.py --unresolved
Unresolved dependencies:
bar.dependency
يأتي Pytype مع عدد قليل من البرامج النصية بالإضافة إلى pytype
نفسه:
annotate-ast
، نوع التعليقات التوضيحية قيد التقدم لـ ASTs.merge-pyi
، لدمج معلومات النوع من ملف .pyi في ملف Python.pytd-tool
، محلل لملفات .pyi.pytype-single
، أداة تصحيح الأخطاء لمطوري pytype، والتي تقوم بتحليل ملف Python واحد على افتراض أن ملفات .pyi قد تم إنشاؤها بالفعل لجميع تبعياتها.pyxref
، مولد المراجع الترافقية. أباتشي 2.0
هذا ليس أحد منتجات Google الرسمية.