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

Internal check system error - passing command line arguments

您好,我在 HyperSkill 从事信用计算器项目,在检查信用计算器最后阶段的代码结果时,当我尝试检查它时出现“内部系统检查错误”。该代码在我的 IDE(pycharm) 上运行,但不知何故出现“内部系统检查错误”。能帮忙解答一下吗?

项目描述: 在此阶段,您需要实现以下功能:

正在计算差异化支付。为此,用户可以运行程序指定利息、期数和信用本金。 能够计算与前一阶段年金支付相同的值(本金、期数和支付值)。用户使用命令行参数指定所有已知参数,因此会有一个未知参数。这是用户想要计算的值。 处理无效参数。如果参数无效,最好显示一条错误消息 Incorrect parameters。 您的程序的最终版本应该可以从命令行运行并解析以下参数:

python creditcalc.py --principal=1000000 --periods=60 --interest=10 Incorrect parameters

python creditcalc.py --type=diff --principal=1000000 --interest=10 --payment=100000 Incorrect parameters

python creditcalc.py --type=annuity --principal=100000 --payment=10400 --periods=8 Incorrect parameters

我的代码:

# Stage 4/4 of the credit calculator project
import sys
import math

args = sys.argv

if 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))

        else:
            if sys.argv[2].split('=')[0] == '--principal' and sys.argv[3].split('=')[0] == '--periods':

                annuity = math.ceil(credit_principal * (nominal_interest * math.pow(1 + nominal_interest, periods) / (
                        math.pow(1 + nominal_interest, periods) - 1)))
                print(f"Your annuity payment =  {annuity}!")
                print("Overpayment =", int(annuity * periods - credit_principal))

            elif sys.argv[2].split('=')[0] == '--payment' and sys.argv[3].split('=')[0] == '--periods':

                annuity = int(sys.argv[2].split('=')[1])
                credit = math.floor(annuity / ((nominal_interest * math.pow(1 + nominal_interest, periods)) / (
                            math.pow(1 + nominal_interest, periods) - 1)))
                print(f"Your credit principal = {credit}!")
                print("Overpayment = ", annuity * periods - credit)
                #Your credit principal = 800018!
                #Overpayment = 246622

            else:

                payment = int(sys.argv[3].split('=')[1])

                months = math.ceil(math.log(payment / (payment - nominal_interest * credit_principal),
                                            1 + nominal_interest))
                years = months // 12
                months = months % 12
                if months != 0:
                    print(f"You need {years} years and {months} months to repay this credit!")
                else:
                    print(f"You need {years} ", "years" if years > 1 else "year", "to repay this credit!")

                print("Overpayment =", int(payment * (years * 12 + months) - credit_principal))

    else:
        print("Incorrect parameters")
        sys.exit()

else:
    print("Incorrect parameters")
    sys.exit()

我的合理解释是它是由于无限循环而发生的,很可能是等待解析系统参数向量的错误。这里也提到了同样的问题(Credit Calculator Stage 4 - Internal System Check Error),但没有提出解决方案。

与其通过 cmd-line 解析输入,不如尝试使用 argparse 和 pre-set 输入值等模块。

这是一个 out-of-context 示例,展示了它的使用方式

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}")

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

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

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

是正确的输入,注意元素的不同。第一个没有付款参数,第二个有本金参数。因此,根据输入的类型,args 的顺序不同,但长度相同。

首先,需要使用 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