
Hy Pythonista! Saya dengan senang hati menyajikan kepada Anda pyoload , seperti dari kata -kata saya:
Modul Python untuk Pemeriksaan Jenis Perpanjangan dan Rekursif dan Pengecoran Argumen Fungsi dan Atribut Kelas Selama Runtime
Di sini kami menggunakan beberapa fitur indah dan bersih yang ditawarkan oleh Python, termasuk dekorator dan deskriptor untuk membantu Anda mengetik pemeriksaan selama runtime
Berikut adalah beberapa contoh penggunaan sederhana untuk mengisi halaman PYPI ini.
Fungsi dekorator ini menggunakan kekuatan inspect.signature
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
...Ini menggunakan prinsip yang sama seperti anotasi tetapi memungkinkan beberapa pengiriman (alias runtime overloading?) Dari.
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 ()Inilah yang ditambahkan PyOLoad ke anotasi standar:
Catatan
Anotasi tambahan masih belum dapat digabungkan dengan tipe standar.
pyoload.Values Subkelas tuple sederhana, menggunakannya sebagai anotasi dan hanya akan memvalidasi nilai yang disertakan.
@ annotate
def foo ( bar : Values ( range ( 5 ))):
...pyoload.Cast Ini melakukan casting rekursif dari argumen yang disahkan ke dalam tipe yang ditentukan itu mendukung alias generik dict sebagai dict[str, int | str] dan mencoba dilemparkan dalam urutan yang ditentukan saat jenisnya adalah persatuan.
@ annotate
def foo ( bar : Cast ( tuple [ int | str ])):
print ( bar )
foo (( 3 , "3" )) # (3, 3)
foo (( 3j , " " )) # ('3j', ' ')pyoload.ChecksMemungkinkan Anda menggunakan metode pemeriksa khusus, misalnya
from pyoload import *
test = lambda val : True # put your check here
def foo ( a : Checks ( func = test ):
... Jika nama cek dipersiapkan dengan _ , itu akan dinegasikan, dan pengecualian dinaikkan jika gagal. Anda dapat mendaftarkan cek Anda sendiri menggunakan Check.register , sebagai
@ 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' )):
... Cek dapat digunakan sebagai anotasi; disebut menggunakan pyoload.Checks sebagai Checks(foo=bar)(val) ; atau dipanggil langsung menggunakan pyoload.Checks sebagai: Check.check(name, param, arg)
Menerima sebagai argumen nilai integer menentukan panjang yang diharapkan atau irisan di mana panjangnya harus ditemukan
Membandingkan parutan dari, kurang dari dan aqual dengan dari parameter ke nilai.
Menggunakan fungsi untuk validasi, fungsi dapat mengembalikan boolean atau meningkatkan kesalahan. Itu bisa diteruskan secara langsung sebagai argumen posisi ke pyoload.checks sebagai: Checks(func1, func2, foo=bar, foo2=bar2)
CheckedAttr dan CastedAttr , adalah deskriptor sederhana yang akan melakukan casting atau cek pada penugasan.
from pyoload import *
class address :
number = CastedAttr ( tuple [ int ])
Nilai -nilainya diperiksa atau dilemparkan pada penugasan
Catatan
Atribut tidak akan mengembalikan None jika belum diinisialisasi