一个帮助您避免意大利面代码的库
macaroni的Python项目详细描述
py通心粉
这是一个图书馆,可以帮助你避免 Spaghetti Code。它帮助你 以可测试的方式表达应用程序逻辑。这次解放的全部想法 基于函数式编程和rust的一些概念,主要是 从铁锈中“解开”概念。
为什么
在为应用程序创建业务逻辑时,有时很难 以易于理解的方式构造复杂逻辑。为了帮助你,这个 库已创建。主要目的是帮助您构建 以清晰易读的方式应用程序,使 代码。
例如,如果您有一个crud应用程序,一些逻辑将在 在本例中,create和update函数lib可以通过链接 实现主业务规则所需的功能,并使 需要时重用函数。
importmacaroniasmciclassBussinessLogic(mci.Macaroni):defvalidate_request(self,data):# ...defcheck_user_permissions(self,data):# ...deflog_operation(self,data):# ...defcreate_item(self,data):# ...defupdate_item(self,data):# ...@mci.errordefhandle_error(self,data,error):# ...@mci.exception(DuplicateKey)defhandle_duplicate_item(self,data,exception):# ...defcreate_item(data):bl=BussinessLogic(data)result=(bl.validate_request().check_user_permissions().create_item().log_operation().handle_error().handle_duplicate_item().unwrap())returnresultdefupdate_item(data):bl=BussinessLogic(data)result=(bl.validate_request().check_user_permissions().update_item().log_operation().handle_error().unwrap())returnresult
它还可以帮助您避免处理每个部分的错误和异常处理 您的应用程序逻辑,只允许您在 应用程序执行,自动跳过应用程序逻辑中的步骤 当发生错误或异常时。
安装
pip install macaroni
用法
更多示例可以在./examples目录中找到。
importmacaroniasmciclassCalculator(mci.Macaroni):defincrement(self,value,increment=None):ifincrementisNone:increment=1returnvalue+incrementdefdivide(self,value,denominator):ifdenominator==0:returnmci.Error('invalid denominator {0}'.format(denominator))returnvalue/denominatordefinvalid(self,value):raiseValueError('invalid data')base_val=10calc=Calcultator(base_val)result=calc \ .increment(2) \ .divide(2) \ .unwrap()# this returns the final resultassertresult==6
错误处理:
calc=Calculator(10)result=calc \ .increment(2)# this is executed \.divide(-3)# this causes an error \.increment()# this is not executed \.unwrap()# returns the errorassertbool(calc.error)==Trueassertresult=='invalid denominator 0'
异常处理:
calc=Calculator(10)try:calc \ .increment(2)# this is executed \.invalid()# this causes an exception \.increment()# this is not executed \.unwrap()# the exception ValueError is raised on unwrapexceptValueError:passassertbool(calc.exception)==True
测试时,可以使用参数magic=False
禁用自动值传递、链接和错误/异常处理:
deftest_increment():calc=Calculator(magic=False)result=calc.increment(10,2)assertresult==12deftest_error():calc=Calculator(magic=False)result=calc.divide(10,0)assertcalc.errorisnotNoneassertresult='invalid denominator 0'deftest_exception()calc=Calculator(magic=False)raised_error=Falsetry:calc.invalid(10)exceptValueError:raised_error=Trueassertraised_error