内部检查系统错误 - 传递命令行参数
Internal check system error - passing command line arguments
您好,我在 HyperSkill 从事信用计算器项目,在检查信用计算器最后阶段的代码结果时,当我尝试检查它时出现“内部系统检查错误”。该代码在我的 IDE(pycharm) 上运行,但不知何故出现“内部系统检查错误”。能帮忙解答一下吗?
项目描述:
在此阶段,您需要实现以下功能:
正在计算差异化支付。为此,用户可以运行程序指定利息、期数和信用本金。
能够计算与前一阶段年金支付相同的值(本金、期数和支付值)。用户使用命令行参数指定所有已知参数,因此会有一个未知参数。这是用户想要计算的值。
处理无效参数。如果参数无效,最好显示一条错误消息 Incorrect parameters。
您的程序的最终版本应该可以从命令行运行并解析以下参数:
- --type,表示支付的类型:“年金”或“diff”(差异化)。如果 --type 既未指定为“年金”也未指定为“差异”,或根本未指定,则显示错误消息。
python creditcalc.py --principal=1000000 --periods=60 --interest=10
Incorrect parameters
- --payment,指按月支付。对于--type=diff,每个月的payment都是不同的,所以不能计算期数和本金,所以它和--payment的组合也是无效的:
python creditcalc.py --type=diff --principal=1000000 --interest=10 --payment=100000
Incorrect parameters
- --本金用于计算两种类型的付款。知道利息、年金支付、期数就可以知道它的价值。
- --periods 参数表示偿还贷款所需的月数and/or 年。它是根据利息、年金支付和本金计算的。
- --利息不带百分号。请注意,它可以接受浮点值。我们的信用计算器无法计算利息,所以这些参数不正确:
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
您好,我在 HyperSkill 从事信用计算器项目,在检查信用计算器最后阶段的代码结果时,当我尝试检查它时出现“内部系统检查错误”。该代码在我的 IDE(pycharm) 上运行,但不知何故出现“内部系统检查错误”。能帮忙解答一下吗?
项目描述: 在此阶段,您需要实现以下功能:
正在计算差异化支付。为此,用户可以运行程序指定利息、期数和信用本金。 能够计算与前一阶段年金支付相同的值(本金、期数和支付值)。用户使用命令行参数指定所有已知参数,因此会有一个未知参数。这是用户想要计算的值。 处理无效参数。如果参数无效,最好显示一条错误消息 Incorrect parameters。 您的程序的最终版本应该可以从命令行运行并解析以下参数:
- --type,表示支付的类型:“年金”或“diff”(差异化)。如果 --type 既未指定为“年金”也未指定为“差异”,或根本未指定,则显示错误消息。
python creditcalc.py --principal=1000000 --periods=60 --interest=10 Incorrect parameters
- --payment,指按月支付。对于--type=diff,每个月的payment都是不同的,所以不能计算期数和本金,所以它和--payment的组合也是无效的:
python creditcalc.py --type=diff --principal=1000000 --interest=10 --payment=100000 Incorrect parameters
- --本金用于计算两种类型的付款。知道利息、年金支付、期数就可以知道它的价值。
- --periods 参数表示偿还贷款所需的月数and/or 年。它是根据利息、年金支付和本金计算的。
- --利息不带百分号。请注意,它可以接受浮点值。我们的信用计算器无法计算利息,所以这些参数不正确:
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