簡體   English   中英

內部檢查系統錯誤 - 傳遞命令行參數

[英]Internal check system error - passing command line arguments

嗨,我在 HyperSkill 從事信用計算器項目,在檢查信用計算器最后階段的代碼結果時,我嘗試檢查它時收到“內部系統檢查錯誤”。 該代碼正在我的 IDE(pycharm) 上運行,但不知何故出現“內部系統檢查錯誤”。 你能幫忙弄清楚嗎?

項目描述:本階段需要實現以下功能:

計算差異化支付。 為此,用戶可以運行指定利息、期數和信貸本金的程序。 能夠計算與前一階段年金支付相同的值(本金、期數和支付值)。 用戶使用命令行參數指定所有已知參數,因此會有一個未知參數。 這是用戶想要計算的值。 處理無效參數。 如果參數無效,最好顯示錯誤消息 Incorrect parameters。 程序的最終版本應該從命令行運行並解析以下參數:

  • --type,表示支付的類型:“年金”或“差異”(差異化)。 如果 --type 既未指定為“年金”也未指定為“差異”,或根本未指定,則顯示錯誤消息。

python creditcalc.py --principal=1000000 --periods=60 --interest=10 不正確的參數

  • --payment,指的是月供。 對於--type=diff,每個月的payment是不同的,所以我們無法計算周期數或本金,因此它與--payment的組合也是無效的:

python creditcalc.py --type=diff --principal=1000000 --interest=10 --payment=100000 不正確的參數

  • --principal 用於計算兩種類型的付款。 您可以通過了解利息、年金支付和期數來獲得其價值。
  • --periods 參數表示償還信用所需的月數和/或年數。 它是根據利息、年金支付和本金計算的。
  • --interest 沒有指定百分比符號。 請注意,它可以接受浮點值。 我們的信用計算器無法計算利息,因此這些參數不正確:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM