본문 바로가기

Back-End/Python

[Python][파이썬] 고객 정보 관리 시스템 만들기 실습 3 - module, import

~ 목차 ~

첫번째 실습 파일을 이용해서 고객정보 관리 시스템을 module화 하여 메인을 간소화 하였다.

 

1. 함수 만들기 (do_I, do_P, do_C, do_N, do_U, do_D)

 

2. 각 함수에 해당하는 module 생성 ( cust 디렉토리 안에 각 폴더 생성 후 module 파일 만들기 )

 

3. main에 각 module을 import하기

 

4. main 간소화 하기

 

5. do_I와 do_U도 module화하여 간소화하기
 : 사용자로부터 데이터를 입력 받고 입력 받는 데이터를 검토 한다.(chk_input_data 함수)

 

6. global 변수를 main 안에 넣고 각 module의 변수 연결하기

customers = list()
index = -1

 

 

 


 

1. 함수 만들기 (do_I, do_P, do_C, do_N, do_U, do_D)

5. do_I와 do_U도 module화하여 간소화하기
 : 사용자로부터 데이터를 입력 받고 입력 받는 데이터를 검토 한다.(chk_input_data 함수)

def chk_input_data(msg, func):
    while True:
        x = input(msg).upper()
        if func(x):
            break
        else:
            print('잘못 입력하셨습니다. 다시 입력 해 주세요.')
    return x
    
def print_menu():
    return input('''
        다음 중에서 하실 작업의 메뉴를 입력하세요.
        I - 고객 정보 입력
        P - 이전 고객 정보 조회
        C - 현재 고객 정보 조회
        N - 다음 고객 정보 조회
        U - 현재 고객 정보 수정
        D - 현재 고객 정보 삭제
        Q - 프로그램 종료
    ''').upper()

def do_I():
    global customers, index
    print('고객정보 입력')
    customer = { 'name':'', 'gender': '', 'email': '', 'year': 0 }

    #이름 입력 3글자 이상 체크(람다식)
    customer['name'] = chk_input_data('이름을 입력하세요 : ', lambda x: True if len(x) > 2 else False)

    #성별 M, F 입력
    customer['gender'] = chk_input_data('성별 (M/F)를 입력하세요 : ', lambda x: True if x in ('M', 'F') else False)

    #이메일 입력
    customer['email'] = chk_input_data('이메일 주소를 입력하세요 : ', lambda x: True if '@' in x else False)

    #출생연도 입력
    customer['year'] = chk_input_data('출생년도 4자리 입력하세요 : ', lambda x: True if len(x) == 4 and x.isdigit() else False)

    print(customer)
    customers.append(customer)
    print(customers)
    index = len(customers) - 1

def do_P():
    global customers, index
    print('이전 고객 정보 조회')
    if index < 0:
        print('이전 데이타로 이동 불가.')
        print(index)
    else:
        index -= 1
        print(f'{index + 1}번째 고객 정보 입니다.')
        print(customers[index])

def do_C():
    global customers, index
    print('현재 고객 정보 조회')
    if index >= 0:
        print(f'{index + 1}번째 고객 정보 입니다.')
        print(customers[index])
    else:
        print('입력된 정보가 없습니다. 정보 입력은 I를 선택하세요.')

def do_N():
    global customers, index
    print('다음 고객 정보 조회')
    if index >= (len(customers) - 1):
        print('이후 데이터 이동 불가')
        print(index)
    else:
        index += 1
        print(f'{index + 1}번째 고객 정보 입니다.')
        print(customers[index])

def do_U():
    global customers, index
    print('현재 고객 정보 수정')
    customer = { 'name':'', 'gender': '', 'email': '', 'year': 0 }
    customer['name'] = input('이름을 입력하세요 : ')
    while True:
        customer['gender'] = input('성별 (M/F)를 입력하세요 : ').upper()
        if customer['gender'] in ('M', 'F'):
            break
        else:
            print('잘못입력하셨습니다. 다시 입력 해 주세요.')
    while True:
        customer['email'] = input('이메일 주소를 입력하세요 : ')
        golbang = '@' in customer['email']
        if golbang:
            break
        else:
            print('"@"를 포함한 이메일 주소를 입력하세요.')

    while True:
        customer['year'] = input('출생년도 4자리 입력하세요 : ')
        check = len(customer['year']) == 4 and customer['year'].isdigit()
        if check:
            break
        else:
            print('잘 입력 해라....')
    print(customer)
    customers[index] = customer

def do_D():
    global customers, index
    print(f'현재 고객 정보{customers[index]["name"]} 삭제')
    del customers[index]

2. 각 함수에 해당하는 module 생성 ( cust 디렉토리 안에 각 폴더 생성 후 module 파일 만들기 )

  • common.py (cust.ver1폴더에 생성)
def print_menu():
    return input('''
        다음 중에서 하실 작업의 메뉴를 입력하세요.
        I - 고객 정보 입력
        P - 이전 고객 정보 조회
        C - 현재 고객 정보 조회
        N - 다음 고객 정보 조회
        U - 현재 고객 정보 수정
        D - 현재 고객 정보 삭제
        S - 고객 정보 저장 
        Q - 프로그램 종료
    ''').upper()

def chk_input_data(msg, func, upper=True):
    while True:
        x = input(msg)
        if upper:
            x = x.upper()
        if func(x):
            break
        else:
            print('잘못 입력하셨습니다. 다시 입력 해 주세요.')
    return x

 

※ 계속 반복적으로 나오는 print_menu와 짜투리 함수는 common.py에 넣어 메인을 간소화 시켰다. 

 

 

  • do_I.py (cust.insert폴더에 생성)
from cust.ver1.common import chk_input_data as check

def do_I(customers, index):
    #customers는 주소값이 넘어오는것(여기서 수정되면 main에서 변경됨), index는 값이 넘어오는것(여기서 수정되도 main에 변경안됌 따라서 return필요)
    print('고객정보 입력')
    customer = { 'name':'', 'gender': '', 'email': '', 'year': 0 }

    #이름 입력 3글자 이상 체크(람다식)
    customer['name'] = check('이름을 입력하세요 : ', lambda x: True if len(x) > 2 else False, upper=True)

    #성별 M, F 입력
    customer['gender'] = check('성별 (M/F)를 입력하세요 : ', lambda x: True if x in ('M', 'F') else False)

    #이메일 입력
    customer['email'] = check('이메일 주소를 입력하세요 : ', lambda x: True if '@' in x else False, upper=False)

    #출생연도 입력
    customer['year'] = check('출생년도 4자리 입력하세요 : ', lambda x: True if len(x) == 4 and x.isdigit() else False)

    customers.append(customer)
    index = len(customers) - 1
    return index

※ do_I는 고객 정보 입력 모듈이므로  'from cust.ver1.common import chk_input_data as check' 으로 import 해주었다.

 

 

 

  • do_P.py (cust.read폴더에 생성)
def do_P(customers, index):
    print('이전 고객 정보 조회')
    if index <= 0:
        print('이전 데이터로 이동 불가.')
        print(index)
    else:
        index -= 1
        print(f'{index}번째 고객 정보 입니다.')
        print(customers[index])
    return index

 

 

 

 

  • do_C.py (cust.read폴더에 생성)
def do_C(customers, index):
    print('현재 고객 정보 조회')
    print('>>>>>', index)
    if index >= -1:
        print(f'{index}번째 고객 정보 입니다.')
        print(customers[index])
    else:
        print('입력된 정보가 없습니다. 정보 입력은 I를 선택하세요.')

 

 

 

 

  • do_N.py (cust.read폴더에 생성)
def do_N(customers, index):
    print('다음 고객 정보 조회')
    if index >= (len(customers) - 1):
        print('이후 데이터 이동 불가')
        print(index)
    else:
        index += 1
        print(f'{index}번째 고객 정보 입니다.')
        print(customers[index])
    return index

 

 

 

 

  • do_U.py (cust.update폴더에 생성)
from cust.ver1.common import chk_input_data
def do_U(customers, index):
    print('현재 고객 정보 수정')
    customer = { 'name':'', 'gender': '', 'email': '', 'year': 0 }

    # 수정 내용이 없는 항목은 이전 값 유지 하도록.
    #이름 입력 3글자 이상 체크(람다식)
    customer['name'] = chk_input_data('수정할 이름을 입력하세요 : ', lambda x: True if len(x) > 2 else False)

    #성별 M, F 입력
    customer['gender'] = chk_input_data('수정할 성별 (M/F)를 입력하세요 : ', lambda x: True if x in ('M', 'F') else False)

    #이메일 입력
    customer['email'] = chk_input_data('수정할 이메일 주소를 입력하세요 : ', lambda x: True if '@' in x else False)

    #출생연도 입력
    customer['year'] = chk_input_data('수정할 출생년도 4자리 입력하세요 : ', lambda x: True if len(x) == 4 and x.isdigit() else False)

    print(customer)
    customers[index] = customer

※ do_U도 고객 정보를 입력받는 모듈이므로  'from cust.ver1.common import chk_input_data' 으로 import 해주었다.

 

 

 

 

  • do_D.py (cust.delete폴더에 생성)
def do_D(customers, index):
    if not customers:
        print("고객 정보가 없습니다.")
    else:
        print(f'현재 고객 정보 {customers[index]["name"]} 삭제')
        print('index : ',index)
        del customers[index]
        if index >= len(customers):
            index = len(customers) - 1  # 마지막 고객 정보를 가리키도록 설정
    return index

※ 고객 정보가 없을 때 D를 누르면 error가 생겨서 조건문을 넣어 주었다.※ 고객 정보가 삭제되었을 때 index 정보도 같이 변화되도록 설정 했다.

 

 


3. main에 각 module을 import하기

4. main 간소화 하기

from cust.ver1.common import print_menu
from cust.insert.do_I import do_I as I
from cust.read.do_C import do_C as C
from cust.read.do_P import do_P as P
from cust.read.do_N import do_N as N
from cust.update.do_U import do_U as U
from cust.delete.do_D import do_D as D

#START
def main():
    customers = list()
    index = -1
    
    while True:
        menu = print_menu()
        if menu == 'I':
            index = I(customers, index)

        elif menu == 'P':
            index = P(customers, index)

        elif menu == 'C':
            C(customers, index)

        elif menu == 'N':
            index = N(customers, index)

        elif menu == 'U':
            U(customers, index)

        elif menu == 'D':
            index = D(customers, index)

        elif menu == 'Q':
            print('안녕히가세요~')
            break
        else:
            print('잘못 입력하셨습니다. 다시 입력 해주세요')


if __name__ == '__main__':
    main()

※ from으로 import하여 각 함수만 main으로 불러왔다.

※ 각 메뉴들은 alias 로 정해준 별명을 main에 입력해주었다.

※ 앞에 index = OOO 써진 함수들은 각 모듈에서 index 값이 변화되면 그 값을 return해주고,
     main에서 return된 index 값을 가져오기 위해서 써주었다. 

 


 

6. global 변수를 main 안에 넣고 각 module의 변수 연결하기

customers = list()
index = -1

 

  • main()
def main():
    customers = list()
    index = -1

    while True:
        menu = print_menu()
        if menu == 'I':
            index = I(customers, index)
        elif menu == 'P':
            index = P(customers, index)
        elif menu == 'C':
            C(customers, index)
        elif menu == 'N':
            index = N(customers, index)
        elif menu == 'U':
            U(customers, index)
        elif menu == 'D':
            index = D(customers, index)
        elif menu == 'S':
            S(customers)

 

 

맨 위에 써진 global변수들을 main() 안에 넣어 준다.

각 module에 customers와 index값을 넘기기 위해 I(customers, index) 이런식으로 코드를 써주었다.

 

  • do_I 모듈
def do_I(customers, index):
    print('고객정보 입력')
    customer = { 'name':'', 'gender': '', 'email': '', 'year': 0 }
    customer['name'] = check('이름을 입력하세요 : ', lambda x: True if len(x) > 2 else False, upper=True)
    customer['gender'] = check('성별 (M/F)를 입력하세요 : ', lambda x: True if x in ('M', 'F') else False)
    customer['email'] = check('이메일 주소를 입력하세요 : ', lambda x: True if '@' in x else False, upper=False)
    customer['year'] = check('출생년도 4자리 입력하세요 : ', lambda x: True if len(x) == 4 and x.isdigit() else False)

    customers.append(customer)
    index = len(customers) - 1
    
    return index

※do_I(customers, index)

  : customers참조변수, 주소값이 넘어옴 (여기서 수정되면 main에서도 변경이 적용됨)

    index값변수, 값이 넘어옴(여기서 수정되도 main에 변경안됨 따라서 return 필요)

※ 여기서 변경된 index값이 main에서도 적용되야 하므로 return index 해줌

728x90