
Hy Pythonista! Я рад представить вам pyoload , как из моих слов:
Модуль Python для расширенного и рекурсивного типа проверки и литья функциональных аргументов и атрибутов класса во время выполнения
Здесь мы используем некоторые из красивых и чистых функций, предлагаемых Python, включая декораторы и дескрипторы, чтобы помочь вам ввести чек во время выполнения.
Вот несколько простых примеров использования для заполнения этой страницы PYPI.
Эта функция декоратора использует силу 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
...Это использует те же принципы, что и аннотат, но позволяет множественной диспетчеризации (он же перегрузка времени выполнения?) Функций.
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 Простой подкласс tuple , используйте их в качестве аннотации, и он будет проверять только включенные значения.
@ annotate
def foo ( bar : Values ( range ( 5 ))):
...pyoload.Cast Это выполняет рекурсивное литье прошедших аргументов в указанный dict[str, int | str] 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 , как
@ 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 as: Check.check(name, param, arg)
Получает в качестве аргумента. Целостное значение указано на ожидаемую длину или срез, в котором должна быть найдена длина
Сравнивает терпение, чем, меньше, чем и aqual с от параметра с значением.
Использует функцию для проверки, функция может вернуть логин или вызвать ошибку. Это может быть передано непосредственно в качестве позиционных аргументов в pyoload.cecks as: Checks(func1, func2, foo=bar, foo2=bar2)
CheckedAttr и CastedAttr , являются простыми дескрипторами, которые будут выполнять кастинг или проверки при назначении.
from pyoload import *
class address :
number = CastedAttr ( tuple [ int ])
Значения проверяются или нанесены на назначение
Примечание
Атрибуты None вернется, если не инициализированы