Python - 상수 목록 또는 사전을 정의하는 최상의/최소한의 방법
처음으로 스택에 있는 사용자가 오버플로를 일으켰고 저는 여기에 오게 되어 기쁩니다.
인트로: 저는 최근에 파이썬 프로그래밍의 세계로 들어가는 마법의 모험을 시작했습니다 - 저는 그것을 좋아합니다.이제 C에서 어색한 전환 과정에서 모든 것이 순조롭게 진행되었지만 HEADER 파일(.h)과 동의어가 되는 것을 만드는 데 어려움을 겪고 있습니다.
문제:중간 크기의 사전과 목록(약 1,000개의 요소), 긴 열거형 및 '#defines'(별로 그렇지 않음)을 가지고 있지만 모두 정리할 수 있는 깨끗한 방법을 찾을 수 없습니다.C에서는 모든 것을 헤더 파일에 넣고 다시는 생각하지 않을 것이지만, 파이썬에서는 불가능하다고 생각합니다.
현재 더티 솔루션:MODULT 또는 FUNCTION(여러 함수가 필요한 경우 모듈)의 상단에 있는 모든 CONSTANT 변수를 초기화하고 있습니다.
결론:만약 누군가가 상수 변수를 깨끗하게 정리할 수 있는 방법을 생각해 냈다면 저는 영원히 감사할 것입니다.
정말 감사합니다!
상수를 자체 모듈에 넣습니다.
# constants.py
RED = 1
BLUE = 2
GREEN = 3
그런 다음 해당 모듈을 가져오고 상수를 사용합니다.
import constants
print "RED is", constants.RED
정수는 원하는 값이 될 수 있습니다. 여기서는 정수를 표시했지만 목록과 딕트는 동일하게 작동합니다.
보통 저는 이렇게 합니다.
파일: 상수.파이의
CONSTANT1 = 'asd'
CONSTANT_FOO = 123
CONSTANT_BAR = [1, 2, 5]
파일: your_script.파이의
from constants import CONSTANT1, CONSTANT_FOO
# or if you want *all* of them
# from constants import *
...
이제 상수를 하나의 파일에 저장하여 쉽게 가져와서 사용할 수 있습니다.
별도의 파일 만들기constants.py전 세계적으로 측정된 모든 상수를 거기에 넣습니다.그러면 할 수 있습니다.import constants그들을 로 지칭하는 것은constants.SPAM또는 (의심스러운) 것을 합니다.from constants import *간단히 말해서SPAM또는EGGS.
여기에 있는 동안 Python은 상수를 지원하지 않습니다.그 회의는 단지 그들을 지명하는 것입니다.ALL_CAPS그들에게 돌연변이를 일으키지 않겠다고요
허용된 답변은 괜찮습니다. 한 단계 더 나아가 상수를 정의할 때 입력을 사용할 수 있습니다. Final을 지정하거나 Final[type]을 지정하면 됩니다. 예를 들어 다음과 같습니다.
from typing import Final, List
CONSTANT1: Final = 'asd'
CONSTANT_FOO: Final[int] = 123
ADLS_ENVIRONMENTS: Final[List[str]] = ["sandbox", "dev", "uat", "prod"]
# etc.
https://www.python.org/dev/peps/pep-0591/ #최종 설명 참조
만약 여러분이 중첩된 상수로 엉망진창이 되고 딕트를 좋아하지 않는다면, 저는 다음과 같은 재미있는 해결책을 생각해 냈습니다.
# Recursively transform a dict to instances of the desired class
import json
from collections import namedtuple
class DictTransformer():
@classmethod
def constantize(self, d):
return self.transform(d, klass=namedtuple, klassname='namedtuple')
@classmethod
def transform(self, d, klass, klassname):
return self._from_json(self._to_json(d), klass=klass, klassname=klassname)
@classmethod
def _to_json(self, d, access_method='__dict__'):
return json.dumps(d, default=lambda o: getattr(o, access_method, str(o)))
@classmethod
def _from_json(self, jsonstr, klass, klassname):
return json.loads(jsonstr, object_hook=lambda d: klass(klassname, d.keys())(*d.values()))
예:
constants = {
'A': {
'B': {
'C': 'D'
}
}
}
CONSTANTS = DictTransformer.transform(d, klass=namedtuple, klassname='namedtuple')
CONSTANTS.A.B.C == 'D'
찬성:
- 중첩된 딕트 처리
- 잠재적으로 다른 유형의 딕트/디렉트를 생성할 수 있습니다.
- 명명된 튜플은 상수에 대해 불변성을 제공합니다.
단점:
- 클래스에 .key 및 .values가 제공되지 않으면 응답하지 않을 수 있습니다(가끔 ._fields 및 list(A.B)로 모방할 수도 있음).C))
생각은?
h/t to @hlzr 그리고 당신들은 원래의 수업 아이디어입니다.
언급URL : https://stackoverflow.com/questions/11111632/python-best-cleanest-way-to-define-constant-lists-or-dictionarys
'programing' 카테고리의 다른 글
| Spring Data에서 클래스에 대한 MongoDb 컬렉션 이름을 구성하는 방법 (0) | 2023.07.08 |
|---|---|
| Spring boot WebClient를 사용하여 페이지화된 API 응답을 수집하는 방법은 무엇입니까? (0) | 2023.07.08 |
| 유형 스크립트 클래스: "오버로드 서명이 함수 구현과 호환되지 않습니다." (0) | 2023.07.03 |
| ORA-12705: NLS 데이터 파일 또는 잘못된 환경에 액세스할 수 없습니다. (0) | 2023.07.03 |
| 스프링 예약 작업과 스프링 배치 작업의 차이점은 무엇입니까? (0) | 2023.07.03 |