[英]Internal check system error - passing command line arguments
嗨,我在 HyperSkill 從事信用計算器項目,在檢查信用計算器最后階段的代碼結果時,我嘗試檢查它時收到“內部系統檢查錯誤”。 該代碼正在我的 IDE(pycharm) 上運行,但不知何故出現“內部系統檢查錯誤”。 你能幫忙弄清楚嗎?
項目描述:本階段需要實現以下功能:
計算差異化支付。 為此,用戶可以運行指定利息、期數和信貸本金的程序。 能夠計算與前一階段年金支付相同的值(本金、期數和支付值)。 用戶使用命令行參數指定所有已知參數,因此會有一個未知參數。 這是用戶想要計算的值。 處理無效參數。 如果參數無效,最好顯示錯誤消息 Incorrect parameters。 程序的最終版本應該從命令行運行並解析以下參數:
python creditcalc.py --principal=1000000 --periods=60 --interest=10 不正確的參數
python creditcalc.py --type=diff --principal=1000000 --interest=10 --payment=100000 不正確的參數
python creditcalc.py --type=annuity --principal=100000 --payment=10400 --periods=8 不正確的參數
我的代碼:
# 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()
我的合理解釋是它的發生是由於無限循環,很可能是等待解析系統參數向量的錯誤。 這里也提到了同樣的問題( 信用計算器階段 4 - 內部系統檢查錯誤),沒有提出解決方案。
與其通過 cmd 行解析輸入,不如嘗試使用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}")
最后,我想出了問題和解決方案! 如 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.