학사

https://www.notion.so/9W-f3b1e3aeb4c54c7bb74f2fc90a9d855a?pvs=4

 

9W 녹화 강의

Module / Packages

www.notion.so

9W 녹화 강의

Module / Packages

Module

  • 작은 Program 조각
  • 서로 연결해 어떤 목적을 가진 Program을 만드는 작은 Program
  • 각 Module의 역할이 있고, 서로 다른 Module과 Interface만 연결되면 사용 가능
  • Module화된 Program을 사용하면, 다른 개발자가 만든 Program이나 본인이 만든 Program을 쉽게 사용하거나 제공 가
import random
print(random.randint(1,10))
# 8
# randint() 함수를 사용하기 위해서는 interface, 즉 paramter 설정을 알아야

Package

  • Module의 묶음
  • Directory처럼 하나의 Package 안에 여러 개의 Module이 있고, 서로 포함 관계를 가짐
# main.py
import converter

print("Enter a value:")
value = float(input())
result = converter.convert(value)
print(f"Result is {result}")

# converter.py
def convert(value):
    return value * 9.0 / 5 + 32

# Enter a value:
# 15
# Result is 59.0

Name Space

  • Module 호출의 범위 지정
  1. Module 이름에 Alias를 생성하여 Module 안으로 Code를 호출
# import module as alias
import converter as cv

print(cv.convert(float(input("Enter a valve: "))))

# Enter a valve: 15
# 59.0
  1. from 구문을 사용하여 Module에서 특정 함수 또는 Class만 호출

: from은 Package를 호출하고 해당 Package 안에 있는 Module을 호출할 때도 사용 가능

# from module import function(or class)
from converter import convert

print(convert(float(input("Enter a value:"))))
# function name으로 바로 사용 가

# Enter a value:15
# 59.0

  1. Module 내의 모든 Function, Class, Variable을 가져오는 (*) Asterisk 사용
from converter import *

print(convert(float(input("Enter a value:"))))

# Enter a value:15
# 59.0

내장 Module 사용

random Module

: 난수 생성, 정수 난수를 생성하는 randint()와 임의의 난수를 생성하는 random() Function 있음

time Module

: 시간을 변경하거나 현재 시각을 출력

urllib Module

: Web 주소의 정보를 불러옴, urllib.request.urlopen()에 Web 주소를 입력하면 HTML 정보를 가져옴

from time import localtime
import urllib.request

print(rd.randint(0,100))
print(localtime())
response = urllib.request.urlopen("<https://seuke.github.io/Web_1/>")
print(response.read())

# 40
# time.struct_time(tm_year=2023, tm_mon=4, tm_mday=29, tm_hour=21, tm_min=12, tm_sec=3, tm_wday=5, tm_yday=119, tm_isdst=0)
# b'\\r\\n\\r\\n\\r\\n

Package의 구성

  • Package는 하나의 대형 Project를 수행하기 위한 Module의 묶음
  • Module은 하나의 File이고, Package는 File이 포함된 Directory로 구성, 즉 여러 .py File이 하나의 Directory에 들어가 있는 것이 Package
  • 다른 사람이 만든 Program을 불러 사용하는 것을 Library라고 하는데, Python에서는 Package를 하나의 Library로 이해
  • Package에도 예약어 있음, Package에서는 File명 자체가 예약어를 반드시 지켜야 실행되는 경우가 있음, Package의 몇몇 File에는 __init__, __main__ 등의 Keyword File명이 사용

Package 만들기 실습

1. Directory 구성하기

: Package 이름은 “roboadvisor”, 아래 세가지 기능

Crawling 주식 관련 Data를 인터넷에서 가져옴
Database 가져온 Data를 Database에 저장
Analysis 해당 정보를 분석하여 의미 있는 값을 도출

Crawling 주식 관련 Data를 인터넷에서 가져옴

: 각 Package의 세부 Package에 맞춰 Directory를 구성 → cmd 창에 다음 명령을 입력하여 Directory 생성

Microsoft Windows [Version 10.0.22621.1555]
(c) Microsoft Corporation. All rights reserved.

C:\\Users\\kakao>cd C:\\Users\\kakao\\PycharmProjects

C:\\Users\\kakao\\PycharmProjects>mkdir crawling

C:\\Users\\kakao\\PycharmProjects>mkdir database

C:\\Users\\kakao\\PycharmProjects>mkdir analysis

: 경로 잘못 설정함, 9w_Module\roboadvisor Folder 만들어서 수정

2. Directory별로 필요한 Module 만들기

: 만들어진 Directory에 필요한 Module 생성

: 하나의 Package는 중첩된 구조로 만들 수 있으므로 Package 안에 또 하나의 Package가 포함될 수 있음

: 이렇게 각각의 Directory를 하나의 Package로 선언하기 위해서는 예약된 File init.py 을 만들어야함

: 3개의 Directory 아래에 .py File 생성

: crawling Directory 아래 .py에 code 입력

# series.py
def series_test():
    print("This is series test)")

# statics.py
def statics_test():
    print("This is statics test")

: roboadvisor의 상위 Directory에 있는 .py File에서 아래 code 실행 가능

from roboadvisor.analysis import series

series.series_test()

# This is series test

3. Directory 별로 init.py 구성

: __init__은 해당 Directory가 Python의 Package라고 선언하는 초기화 Script

(Python Machine Learning Library “scikit-learn”의 경우, 상위 Directory부터 init.py이 있음)

Package Name Space: 절대 참조

절대 참조의 예시

from roboadvisor.analysis import series

: from은 roboadvisor에서부터 시작함

: Package 이름부터 시작하여 series까지 모든 경로를 입력

: ‘from 전체_Package.Sub_Package import Module’ 형식

→ 절대 참조: 전체 경로를 모두 입력

: init.py File을 만들 때도 절대 참조로 Module을 호출하는 것이 좋음

  • 주의할 점: 가장 상위에 있는 init.py도 상위 Directiory roboadvisor를 넣는 것이 좋음
# __init__.py
__all__ = ['analysis','crawling','database']

from roboadvisor import analysis
from roboadvisor import crawling
from roboadvisor import database

Package Name Space: 상대 참조

: 현재의 Directory 기준으로 Module을 호출

from .series import series_test
from ..crawling.parser import parser_test

roboadvisor\analysis\test.py에서 해당 code error 발생

Traceback (most recent call last):
  File "C:\\Users\\kakao\\PycharmProjects\\9w_Module\\roboadvisor\\analysis\\test.py", line 1, in <module>
    from .series import series_test
ImportError: attempted relative import with no known parent package

Package 설치

Module / Packages 실습

Create New Project

Library Root Directory에 Main.py, f_convert.py 생성

# f_convert.py
def convert_cf(c_value):
    f_value = c_value * 9.0 / 5 + 32
    print(f"convert value: {f_value}")
    return f_value

def convert_fc(f_value):
    c_value = (f_value - 32) / 9.0 * 5
    print(f"convert value: {c_value}")
    return c_value
# main.py
import f_convert

c_value = float(input("Enter Celsius degree: "))
f_value = f_convert.convert_cf(c_value)

f_value = float(input("Enter Fahrenheit degree: "))
c_value = f_convert.convert_fc(f_value)

# Enter Celsius degree: 15
# convert value: 59.0
# Enter Fahrenheit degree: 59
# convert value: 15.0

+ Recent posts