为了账号安全,请及时绑定邮箱和手机立即绑定

内部检查系统错误 - 传递命令行参数

内部检查系统错误 - 传递命令行参数

一只萌萌小番薯 2023-06-27 17:25:52
您好,我正在 HyperSkill 的信用计算器项目工作,在检查信用计算器最后阶段的代码结果时,当我尝试检查它时,我收到“内部系统检查错误”。该代码正在我的 IDE(pycharm) 上运行,但不知何故出现“内部系统检查错误”。您能帮忙解决一下吗?项目描述:本阶段需要实现以下功能:计算差异化支付。为此,用户可以运行指定利息、周期数和信用本金的程序。能够计算与前一阶段相同的年金支付值(本金、期数和支付金额)。用户使用命令行参数指定所有已知参数,因此将会有一个未知参数。这是用户想要计算的值。处理无效参数。如果参数无效,最好显示错误消息“参数不正确”。程序的最终版本应该可以从命令行运行并解析以下参数:--type,表示支付类型:“annuity”或“diff”(有区别的)。如果 --type 既没有指定为“annuity”也没有指定为“diff”,或者根本没有指定,则显示错误消息。python Creditcalc.py --principal=1000000 --periods=60 --interest=10 参数错误--付款,指每月付款。对于--type=diff,每月的付款额不同,因此我们无法计算期数或本金,因此它与-- payment 的组合也是无效的:python Creditcalc.py --type=diff --principal=1000000 --interest=10 -- payment=100000 参数错误--principal 用于计算两种类型的付款。您可以通过了解利息、年金付款和期数来获得其价值。--periods 参数表示偿还信用所需的月数和/或年数。它是根据利息、年金支付和本金计算的。--利息指定时不带百分号。请注意,它可以接受浮点值。我们的信用计算器无法计算利息,因此这些参数不正确:python Creditcalc.py --type=annuity --principal=100000 -- payment=10400 --periods=8 参数错误我的代码:# Stage 4/4 of the credit calculator projectimport sysimport mathargs = sys.argvif len(sys.argv) == 5:    type1 = sys.argv[1].split('=')[1]    credit_principal = int(sys.argv[2].split('=')[1])    periods = int(sys.argv[3].split('=')[1])    credit_interest = float(sys.argv[4].split('=')[1])    nominal_interest = credit_interest / (12 * 100)    if type1 == 'diff' or type1 == 'annuity' and credit_principal > 0 \            and credit_interest > 0 and periods > 0:        if type1 == "diff":            sum_diff_payments = 0            for i in range(1, periods + 1):                montly_diff_payment = math.ceil(credit_principal / periods + nominal_interest * (                        credit_principal - credit_principal * (i - 1) / periods))                sum_diff_payments += montly_diff_payment                print(f"Month {i}: payment is {montly_diff_payment}")            print("\nOverpayment =", int(sum_diff_payments - credit_principal))
查看完整描述

2 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

我合理的解释是,它的发生是由于无限循环,很可能是等待解析系统参数向量时出现错误。这里也提到了同样的问题(信用计算器阶段 4 - 内部系统检查错误),但没有提出解决方案。

不要通过命令行解析输入,而是尝试使用argparse等模块并预设输入的值。

这是一个脱离上下文的示例,展示了如何使用它

import argparse

    

# check command line options

parser = argparse.ArgumentParser()


parser.add_argument("--type", dest="type_of_payment", type=str, choices=["diff", "annuity"], required=True, help="Add some help text here")

parser.add_argument("--periods", dest="period_count", type=int, required=True)

parser.add_argument("--payment", dest="monthly_payment", type=float, required=True)

parser.add_argument("--interest", dest="credit_interest", type=float, required=True)

parser.add_argument("--principal", dest="credit_principal", type=float, required=True)


args = parser.parse_args()


# show the values

print(f"Type of payment: {args.type_of_payment}")

print(f"Periods: {args.period_count}")

print(f"Payment: {args.monthly_payment}")

print(f"Interest: {args.credit_interest}")

print(f"Principal: {args.credit_principal}")


查看完整回答
反对 回复 2023-06-27
?
慕斯709654

TA贡献1840条经验 获得超5个赞

终于我找到问题所在和解决办法了!如 HyperSkill 项目示例所示 - 正确的参数可以是五个,并且它们可以是不同的元素。例子:


> python creditcalc.py --type=annuity --principal=1000000 --periods=60 --interest=10


> python creditcalc.py --type=annuity --payment=8722 --periods=120 --interest=5.6

是正确的输入,注意元素的差异。第一个中没有付款参数,第二个中有主要参数。因此,根据输入参数的类型,其顺序将不同,但长度相同。


首先,需要使用 argparser 声明所有参数并设置 required=False


parser = argparse.ArgumentParser()

parser.add_argument("--type", type=str, choices=["diff", "annuity"], required=False)

parser.add_argument("--principal", type=float, required=False)

parser.add_argument("--periods", type=int, required=False)

parser.add_argument("--payment", type=float, required=False)

parser.add_argument("--interest", type=float, required=False)

读取变量的参数:


args, leftovers = parser.parse_known_args()

然后找出传递了哪些参数 - 要么你需要计算


> python creditcalc.py --type=annuity --payment=8722 --periods=120 --interest=5.6

或者


> python creditcalc.py --type=diff --principal=1000000 --payment=104000

或者


> python creditcalc.py --type=annuity --principal=500000 --payment=23000 --interest=7.8

您可以使用简单的 if 语句来检查它,如下所示:


if args.type is not None and args.principal is not None and args.periods is not None and args.interest is not None:

pass

elif args.type is not None and args.payment is not None and args.periods is not None and args.interest is not None:

pass


查看完整回答
反对 回复 2023-06-27
  • 2 回答
  • 0 关注
  • 152 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信