Python에서의 상수(Constant) 관리

pengooseDev·2022년 12월 31일
0
post-custom-banner


Python의 상수(constant) 관리?

python의 변수는 너무나도 쉽게 변한다.
우리의 선대 개발자들은 하드코딩으로 인한 오류를 피하기 위해, 상수를 선언하고 이를 따로 관리하는 방법을 선호해왔다.

그렇다면 python에선 어떻게 관리할 것인가?


예시 코드

import requests
from bs4 import BeautifulSoup

#CONSTANTS
REQ = {
    'KEY': 'User-Agent',
    'VALUE': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
    'URL': 'https://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20210701',
}

PARSER = {
    'TYPE': 'html.parser',
    'TITLE': ".title",
    'ARTIST': ".artist",
    'IMG_URL': ".cover > img",
    'RANK': ".number",
    'SRC': 'src',
    'LIST': '.list-wrap > tbody > tr',
    'RANK_LENGTH': 2,
}

DATA = {
    'TITLE': "title",
    'ARTIST': "artist",
    'IMG_URL': "img_url",
    'RANK': "rank",
}




#Modules
def getHTMLData():
    data = requests.get(REQ['URL'], headers={REQ['KEY']: REQ['VALUE']})
    soup = BeautifulSoup(data.text, PARSER['TYPE'])
    return soup

def parseData(musics):
    result = [];
    for music in musics:
        title = music.select_one(PARSER['TITLE']).text.strip()
        artist = music.select_one(PARSER['ARTIST']).text.strip()
        img_url = music.select_one(PARSER['IMG_URL'])[PARSER['SRC']]
        rank = music.select_one(PARSER['RANK']).text.strip()[:PARSER['RANK_LENGTH']]

        music_information = {
            DATA['TITLE']: title,
            DATA['ARTIST']: artist,
            DATA['IMG_URL'] : img_url,
            DATA['RANK']: rank
        }

        result.append(music_information)
    return result

def printer(data):
    for i in data:
        print(f"{i[DATA['RANK']]}위 : {i[DATA['TITLE']]} | {i[DATA['ARTIST']]}")





#Controller
HTMLData = getHTMLData()
musicsList = HTMLData.select(PARSER['LIST'])
parsedData = parseData(musicsList)
printer(parsedData)

문제점

데이터 크롤링 예제를 작성하며 몇 가지 문제에 봉착했다.

  1. Type의 부재
  2. Dictionary타입의 value 접근방법

python에서 상수를 관리하기 위해 Object와 비슷한 Dictionary를 이용해, 상수 관리를 시도하였다.

허나 JS와 달리, python은 Object의 속성 접근자를 제공하지 않는다. dictionary['key']이 보편적으로 value에 대한 접근 방식이었으며, 다른 방식또한 필연적으로 'key'의 하드코딩이 필수불가결한 방식이었다.

이러한 문제점은 리팩터링을 진행한다 하더라도, 하드코딩의 문제점이 필연적으로 잔존하게 된다. 어떻게 해결할 것인가?

Class getter

Python에서 상수를 만드는 방법은 없다.

다만, class를 선언해 getter를 사용한다면 값이 변하는 걸 방지할 수 있다는 답변 정도는 찾을 수 있었다.

python에서 상수를 최대한 건드리지 않으며, setter가 없는 클래스로 getter를 이용해 값을 관리하는 것이 최선이다.


ref

python에서 상수 만드는 법

post-custom-banner

0개의 댓글