python 정리

OpenStack 2015. 1. 29. 17:43
반응형

[ 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

반응형
Posted by seungkyua@gmail.com
,