Pytype ตรวจสอบและอนุมานประเภทของโค้ด Python ของคุณ - โดยไม่ต้องใช้คำอธิบายประกอบประเภท ไพไทป์สามารถ:
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 ' ]
ตอนนี้คุณสามารถรันคำสั่ง no-argument 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 การติดตั้งอาจล้มเหลวเนื่องจากปัญหาเกี่ยวกับการขึ้นต่อกันของอัปสตรีม ดูรายละเอียดของปัญหานี้สำหรับการแก้ไขที่เป็นไปได้
** หากการติดตั้งการพึ่งพานินจาล้มเหลว ตรวจสอบให้แน่ใจว่าได้ติดตั้ง cmake แล้ว ดูปัญหานี้สำหรับรายละเอียด
Pytype สามารถติดตั้งผ่าน pip โปรดทราบว่าการติดตั้งต้องใช้ 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 แบบกำหนดเองแทนสำเนาที่รวมกลุ่มของตัวเองได้โดยการตั้งค่า $TYPESHED_HOME
เพื่อความสะดวก คุณสามารถบันทึกการกำหนดค่า pytype ของคุณในไฟล์ได้ ไฟล์กำหนดค่าอาจเป็นไฟล์สไตล์ TOML ที่มีส่วน [tool.pytype]
(แนะนำ) หรือไฟล์สไตล์ INI ที่มีส่วน [pytype]
หากไม่มีไฟล์กำหนดค่าที่ชัดเจน pytype จะค้นหาส่วน pytype ในไฟล์ pyproject.toml
หรือ setup.cfg
ไฟล์แรกที่พบโดยการเดินขึ้นไปจากไดเร็กทอรีการทำงานปัจจุบัน
เริ่มต้นด้วยการสร้างไฟล์ปรับแต่งตัวอย่าง:
$ pytype --generate-config pytype.toml
ตอนนี้ปรับแต่งไฟล์ตามการตั้งค่าในเครื่องของคุณ โดยเก็บเฉพาะส่วนที่คุณต้องการเท่านั้น ไดเร็กทอรีอาจสัมพันธ์กับตำแหน่งของไฟล์กำหนดค่า ซึ่งมีประโยชน์หากคุณต้องการเช็คอินไฟล์กำหนดค่าโดยเป็นส่วนหนึ่งของโปรเจ็กต์ของคุณ
ตัวอย่างเช่น สมมติว่าคุณมีโครงสร้างไดเร็กทอรีต่อไปนี้ และต้องการวิเคราะห์ package ~/repo1/foo
ซึ่งขึ้นอยู่กับ package ~/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
ซึ่งเป็นคำอธิบายประกอบประเภทที่กำลังดำเนินการสำหรับ ASTmerge-pyi
สำหรับการรวมข้อมูลประเภทจากไฟล์ .pyi ลงในไฟล์ Pythonpytd-tool
ตัวแยกวิเคราะห์สำหรับไฟล์ .pyipytype-single
เป็นเครื่องมือดีบั๊กสำหรับนักพัฒนา pytype ซึ่งวิเคราะห์ไฟล์ Python ไฟล์เดียวโดยสมมติว่าไฟล์ .pyi ถูกสร้างขึ้นแล้วสำหรับการขึ้นต่อกันทั้งหมดpyxref
ซึ่งเป็นเครื่องกำเนิดการอ้างอิงโยง อาปาเช่ 2.0
นี่ไม่ใช่ผลิตภัณฑ์อย่างเป็นทางการของ Google