0

以下は私のコードの一部です。基本的にこれが行うことは、実行時に乱数と指定された通貨コードとクレジット カードの限度額を使用してクレジット カードを作成することです。クレジットカードはクラスであり、そこに保管されているお金もクラスです (簡潔にするため、また私の質問には関係ないと思うため、ここには含めていません)。正常に動作しますが、リストに 2 つのクレジット カードがあり、2 番目のクレジット カードをキャンセルしようとすると、NO_SUCH_CARD が再び出力されます。リストにある場合、カードはとにかく削除されます。私の推測では、for ループがリストを反復処理し、指定された番号とは異なる番号のカードを最初に検出したために発生したと考えられます。そのため、そのようなカードは出力されませんが、これを修正する方法がわかりません。助けていただければ幸いです。

PATH = 'saved_cards.txt'
creditcard_list = []
import decimal
import ast
import collections
import os
import random


def currency_dictionary():
    '''Initialized at the start of the program. It finds and reads a currency.txt
       file and stores those in a dictionary'''
    final_dict = collections.defaultdict(list)
    with open("currency.txt", 'r') as f:
        currency_lines = f.readlines()
    for item in currency_lines:
        m = item.split(' ')
        final_dict[m[0]] = [int(m[1]), decimal.Decimal(m[2])]
    return final_dict





class Money():
    def __init__(self, money_amount: decimal, currency_code: str):
        self.m = decimal.Decimal(money_amount)
        self.c = str(currency_code)
        self.d = currency_dictionary()


def __repr__(self):
    return 'Money({}, {})'.format(self.m, self.c)

def __eq__(self, other):
    if type(other) != Money:
        return False

    elif self.c == other.c:
        return self.m == other.m

    elif self.c != other.c:
        dictionary_key1 = self.d[self.c]
        decimal_point1 = dictionary_key1[0]
        conversion_factor1 = dictionary_key1[1]
        x = self.m / conversion_factor1

        dictionary_key2 = self.d[other.c]
        decimal_point = dictionary_key2[0]
        conversion_factor = dictionary_key2[1]
        y = other.m / conversion_factor

        return x == y

def __ne__(self, other):
    if type(other) != Money:
        return True

    elif self.c == other.c:
        return self.m != other.m

    elif self.c != other.c:
        dictionary_key1 = self.d[self.c]
        decimal_point1 = dictionary_key1[0]
        conversion_factor1 = dictionary_key1[1]
        x = self.m / conversion_factor1

        dictionary_key2 = self.d[other.c]
        decimal_point = dictionary_key2[0]
        conversion_factor = dictionary_key2[1]
        y = other.m / conversion_factor

        return x != y

def __add__(self, other):
    if self.c == other.c:
        return Money((self.m + other.m), self.c)

    elif self.c != other.c:
        dictionary_key1 = self.d[self.c]
        decimal_point1 = dictionary_key1[0]
        conversion_factor1 = dictionary_key1[1]
        x = self.m / conversion_factor1

        dictionary_key2 = self.d[other.c]
        decimal_point = dictionary_key2[0]
        conversion_factor2 = dictionary_key2[1]
        y = other.m / conversion_factor2

        total = x + y
        return Money((total * conversion_factor1), self.c)


def __sub__(self, other):
    if self.c == other.c:
        return Money((self.m - other.m), self.c)

    elif self.c != other.c:
        dictionary_key1 = self.d[self.c]
        decimal_point1 = dictionary_key1[0]
        conversion_factor1 = dictionary_key1[1]
        x = self.m / conversion_factor1

        dictionary_key2 = self.d[other.c]
        decimal_point = dictionary_key2[0]
        conversion_factor2 = dictionary_key2[1]
        y = other.m / conversion_factor2

        total = x - y
        return Money((total * conversion_factor1), self.c)

class Credit_Card():
    def __init__(self, card_number, money_amount: Money, card_limit: int):
        if type(money_amount) != Money or type(card_limit) != int:
            raise TypeError('one of the types of the parameters entered is not valid')
        self.number = card_number
        self.amount = money_amount
        self.limit = card_limit

def __repr__(self):
    return 'Card#{}({}, {})'.format(self.number, self.amount, self.limit)

def user_interface():
    boolean = True

    while boolean:
        temp_list = []
        command = input()
        if command.split()[0] == 'ISSUE':
            if len(command.split()) == 3:
                x = "%0.5d" % random.randint(0,99999)
                currency_code = command.split()[1]
                card_limit = int(command.split()[2])
            if card_limit < 0:
                print("NEGATIVE_LIMIT")
            elif not currency_dictionary()[currency_code]:
                print("NO_SUCH_CURRENCY")
            else:
                for card in creditcard_list:
                    temp_list.append(card.number)
                if x not in temp_list and currency_dictionary()[currency_code]:
                    creditcard_list.append(Credit_Card(x, Money(0, currency_code), card_limit))
                    print('ISSUED', x)
                    print(creditcard_list)

        else:
            print("INVALID_ISSUE_COMMAND")


    elif command.split()[0] == 'CANCEL':
        templist2 = []
        if len(command.split()) == 2:
            card_number = command.split()[1]

            for card in creditcard_list:
                templist2.append(card)
            for i, card in enumerate(templist2):
                if card_number not in templist2[i].number:
                    print('NO_SUCH_CARD')
                elif templist2[i].amount.m != 0:
                    print('NONZERO_BALANCE')
                elif templist2[i].number == command.split()[1] and card.amount.m == 0:
                    del creditcard_list[i]
                    print('CANCELLED', card_number)


            print(creditcard_list)


    elif command.split()[0] == 'PURCHASE':
        if len(command.split()) == 4:
            card_number = command.split()[1]
            currency_code = command.split()[2]
            amount = int(command.split()[3])
            if currency_code not in currency_dictionary().keys():
                print('NO_SUCH_CURRENCY')
            elif amount < 0:
                print('NONPOSITIVE_AMOUNT')
            else:
                for i, card in enumerate(creditcard_list):
                    if card.number == card_number and 0 <= amount <= card.limit :
                        x = card.amount + Money(amount, currency_code)
                        creditcard_list[i] = Credit_Card(card.number, x, card.limit)
                    elif creditcard_list[i].number != card_number:
                        print('NO_SUCH_CARD')
                    elif amount > creditcard_list[i].limit:
                        print('OVER_LIMIT')

    elif command.split(0) == 'PAYMENT':


            print(creditcard_list)



if __name__ == '__main__':
    user_interface()

私のキャンセル コマンドの出力は基本的に次のようになります。太字が入力、太字でないものが出力です。

**ISSUE USD 5000**
ISSUED 50695
[Card#50695(Money(0, USD), 5000)]
**ISSUE RON 3000**
ISSUED 25282
[Card#50695(Money(0, USD), 5000), Card#25282(Money(0, RON), 3000)]
**CANCEL 25282**
[Card#50695(Money(0, USD), 5000), Card#25282(Money(0, RON), 3000)]
*NO_SUCH_CARD*
CANCELLED 25282
[Card#50695(Money(0, USD), 5000)]

リストは、現在メイン リストにあるカードを追跡するためにのみ印刷されていることに注意してください。最終的には、これらの印刷ステートメントを削除します。問題のある出力をイタリック体にしました。

4

1 に答える 1