
Hy Pythonista! ฉันมีความสุขที่จะนำเสนอให้คุณ pyoload ตามคำพูดของฉัน:
โมดูล Python สำหรับการตรวจสอบประเภทเพิ่มเติมและแบบเรียกซ้ำ
ที่นี่เราใช้คุณสมบัติที่สวยงามและสะอาดบางอย่างที่นำเสนอโดย Python รวมถึงนักตกแต่งและคำอธิบายเพื่อช่วยคุณพิมพ์การตรวจสอบในช่วงเวลา
นี่คือตัวอย่างการใช้งานง่าย ๆ เพื่อเติมเต็มหน้า PYPI นี้
ฟังก์ชั่นมัณฑนากรนี้ใช้พลังของ inspect.signature เข้าใช้เพื่อตรวจสอบอาร์กิวเมนต์ที่ส่งผ่านไปยังฟังก์ชั่นโดยใช้คำอธิบายประกอบด้วยการสนับสนุนค่าเริ่มต้น Aliase ทั่วไปและคำอธิบายประกอบเพิ่มประเภทคำอธิบายประกอบเพิ่มเติมเพื่อความสะดวกลดรหัสบางส่วน
from pyoload import *
@ annotate
def foo (
a : str , # this has an annotation
b = 3 , # this uses a default value
c : int = 0 # here both
) -> tuple [ str , int ]: # The return type
... from pyoload import *
@ annotate
def foo (
b = dict [ str | int , float ], # here a GenericAlias
c : Cast ( list [ int ]) = '12345' # here a recursive cast
): # No return type
...สิ่งนี้ใช้หลักการเดียวกันกับคำอธิบายประกอบ แต่อนุญาตให้มีการจัดส่งหลายรายการ (aka runtime overloading?) ของฟังก์ชั่น
from pyoload import *
@ multimethod
def foo ( a , b ):
print ( "two arguments" )
@ multimethod
def foo ( a : Values (( 1 , 2 , 3 ))):
print ( 'either 1, 2 or 3' )
@ foo . overload
def _ ( a : Any ):
raise ValueError ()นี่คือสิ่งที่ Pyoload เพิ่มลงในคำอธิบายประกอบมาตรฐาน:
บันทึก
คำอธิบายประกอบที่เพิ่มขึ้นยังคงไม่สามารถผสมกับประเภทมาตรฐานได้
pyoload.Values subclass tuple อย่างง่ายใช้เป็นคำอธิบายประกอบและจะตรวจสอบค่ารวมเฉพาะค่าเท่านั้น
@ annotate
def foo ( bar : Values ( range ( 5 ))):
...pyoload.Cast สิ่งนี้ดำเนินการคัดเลือกนักแสดงแบบเรียกซ้ำของอาร์กิวเมนต์ที่ผ่านเข้ามาในประเภทที่ระบุไว้สนับสนุนนามแฝงทั่วไป dict เป็น dict[str, int | str] และพยายามคัดเลือกตามลำดับที่ระบุเมื่อประเภทคือสหภาพ
@ annotate
def foo ( bar : Cast ( tuple [ int | str ])):
print ( bar )
foo (( 3 , "3" )) # (3, 3)
foo (( 3j , " " )) # ('3j', ' ')pyoload.Checksอนุญาตให้คุณใช้วิธีการตรวจสอบแบบกำหนดเองเช่น
from pyoload import *
test = lambda val : True # put your check here
def foo ( a : Checks ( func = test ):
... หากชื่อตรวจสอบถูกเตรียมไว้ล่วงหน้าด้วย _ มันจะถูกลบล้างและมีการยกข้อยกเว้นหากล้มเหลว คุณสามารถลงทะเบียนเช็คของคุณเองได้โดยใช้ Check.register , AS
@ Check . register ( 'mycheck' )
def _ ( param , value ):
print ( param , value )
Checks ( mycheck = 'param' )( 'val' ) # Will raise error on check failure
@ annotate
def foo ( a : Checks ( mycheck = 'param' )):
... การตรวจสอบสามารถใช้เป็นคำอธิบายประกอบ; เรียกว่าใช้ pyoload.Checks เป็น Checks(foo=bar)(val) ; หรือเรียกใช้โดยตรงโดยใช้ pyoload.Checks เป็น: Check.check(name, param, arg)
ได้รับเป็นอาร์กิวเมนต์ค่าจำนวนเต็มระบุความยาวที่คาดหวังหรือชิ้นที่ควรพบความยาว
เปรียบเทียบเครื่องขูดมากกว่าน้อยกว่าและน้ำจากพารามิเตอร์กับค่า
ใช้ฟังก์ชั่นสำหรับการตรวจสอบความถูกต้องฟังก์ชั่นสามารถส่งคืนบูลีนหรือเพิ่มข้อผิดพลาด มันสามารถส่งผ่านโดยตรงเป็นอาร์กิวเมนต์ตำแหน่งไปยัง pyoload.checks AS: Checks(func1, func2, foo=bar, foo2=bar2)
CheckedAttr และ CastedAttr เป็นคำอธิบายที่เรียบง่ายซึ่งจะทำการคัดเลือกหรือตรวจสอบการมอบหมาย
from pyoload import *
class address :
number = CastedAttr ( tuple [ int ])
ค่าจะถูกตรวจสอบหรือหล่อเมื่อได้รับมอบหมาย
บันทึก
แอตทริบิวต์จะ None กลับมาหากยังไม่ได้เริ่มต้น