[ Software Architecture ]
1. Rest API & Queue
2. Source Directory Structure
[ package ]
1. SQLAlchemy : The Python SQL Toolkit and Object Relational Mapper
[ Programming ]
1. Dynamically importing modules
# import os
def import_module(import_str):
__import__(import_str) # ImportError
return sys.modules[import_str] # KeyError
os = import_module("os")
os.getcwd()
# import versioned_submodule
module = 'mymodule.%s' % version
module = '.'.join((module, submodule))
import_module(module)
# import class
import_value = "nova.db.sqlalchemy.models.NovaBase"
mod_str, _sep, class_str = import_value.rpartition('.')
novabase_class = getattr(sys.modules[mod_str], class_str)
novabase_class()
2. Data Access Object (DAO)
nova.db.base.Base
def __init__(...)
self.db import_module(db_driver)
# 사용 예
Manager(base.Base)
...
self.db.instance_update(...)
self.db 는 Base
db_driver 는 "nova.db" 패키지
nova.db 패키지의 __init__ 은 from nova.db.api import *
그러므로 self.db = nova.db.api
nova.db.api
IMPL = nova.db.sqlalchemy.api
def instance_update(...)
IMPL.instance_update(...)
3. Configuration 활용
nova.db.sqlalchemy.api 에서 Configration 사용
CONF = cfg.CONF
CONF.compute_topic 과 같이 사용
oslo.config.cfg 패키지
CONF = ConfigOpts()
Opt
name = 이름
type = StrOpt, IntOpt, FloatOpt, BoolOpt, List, DictOpt, IPOpt, MultiOpt, MultiStrOpt
dest : ConfigOpts property 와 대응대는 이름
default : 기본값
ConfigOpts(collections.Mapping)
def __init__(self):
self._opts = {} # dict of dicts of (opt:, override:, default: )
def __getattr__(self.name): # property 가 실제 존재하지 않으면 호출됨
return self._get(name)
4. Decorator 패턴
def require_admin_context(f):
def wrapper(*args, **kwargs):
nova.context.require_admin_context(args[0])
return f(*args, **kwargs)
retrun wrapper
@require_admin_context
def service_get_by_compute_host(context, host):
...
* Class로 Decorator를 정의할려면 Class를 함수처럼 호출되게 __call()__ 멤버 함수를 정의
GoF 의 Decorator 와는 조금 다름.
GoF Decorator : 상속을 받으면서 Decorate 를 추가하는 방법 (객체지향적)
GoF 의 Template method pattern 과 오히려 더 유사 (하지만 이것 역시 객체지향적으로 좀 다름)
ApectJ 혹은 Spring AOP (Apspect Oriented Programming) 와 유사 (사용법은 python 이 더 간단)
P7YQ9-DJFPK-DTCYM-X6KW2-CGCGT
YTYK3-6JKXT-6HQRG-YRKKP-7RDMF