Home [Python] Advanced Techniques
Post
Cancel

[Python] Advanced Techniques


기술

  • 문서 테크닉
  • 코딩 테크닉
  • 테스팅 테크닉
  • Verification 테크닉
  • Continuous Integration (CI) 테크닉

기술 1

버전관리를 1.1.0 과 같이 minor, subversion, sub-subversion으로 나누어서 관리, minor는 아키텍쳐의 변화가 있거나 코드에서 많은 변화가 있을때, subversion은 major보다 아래, sub-subversion은 bug fixes

git branch로 버전관리, git status를 통해 해당 버전에서 무엇이 수정되었는지

기술 2

코드에서 documentation #

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@staticmethod
def load_json(photon_package: str) -> Any:
    """
    load_json Loads JSON file.
The class init PipelineElement('name',...)
    stores the element metadata in a json file.
The JSON files are stored in the framework folder
    by the name convention 'photon_<package>.json'.
    (example:$HOME/PROJECTS/photon/photonai/base/registry/PhotonCore.json)
The file is of format
    { name-1: ['import-pkg-class-path-1', class-path-1)],
      name-2: ['import-pkg-class-path-2', class-path-2)],
     ....}
Parameters
    ----------
        photon_package:  The name of the photonai package of element metadata
    Returns
    -------
        [file_content, file_name]
    Notes
    -------
    if  JSON file does not exist, then create blank one.
    """

기술 3

  • 코멘트는 최대한 자세하기 남겨라

기술 7

PEP-8 naming conventions을 적용

  • global constant는 ELEMENT_TYPE uppercase
  • variable machine_learning_type: lowercase

기술 8

  • type hitting을 모든 function, class method에 추가
  • python 3.5 보다 높은 버전에서는 PEP484의 enable type hints를 허용
1
def is_maching_learning_type(ml_type: str) -> bool:

기술 12

코드를 작성하기 전에 다른 코드를 살펴보자. 어떻게 구성되어 있는지!

기술 16

encapsulate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@staticmethod
def is_machine_learning_type(ml_type: str) -> bool:
    """
    :raises
    if not known machine_learning_type
:param machine_learning_type
    :return: True
    """
    if ml_type in Scorer.ML_TYPES:
        return True
    else:
        logger.error(
            "Specify valid ml_type to choose best config: {}".format(ml_type)
        )
    raise NameError(becomes

기술 19

faut handler를 사용해서 stack tracebacks을 표시

기술 20

globals()를 통해 패키지내의 모든 글로벌들을 확인

기술 21

locals()를 통해 unused local variablse을 제거

기술 22

Python 3.7+ @dataclass decorator를 class definition 전에 적용

  • 자동으로 생성되는 double dunder methods
    • __init__()
    • __repr__()
    • __str__
    • __eq()__
    • __hash()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class PhotonRegistry:
    """
    Helper class to manage the PHOTON Element Register
    ...
    """
base_PHOTON_REGISTRIES = ['PhotonCore', 'PhotonNeuro']
PHOTON_REGISTRIES = ['PhotonCore', 'PhotonNeuro']
def __init__(self, custom_elements_folder: str = None):
    if custom_elements_folder:
        self._load_custom_folder(custom_elements_folder)
    else:
        self.custom_elements = None
        self.custom_elements_folder = None
        self.custom_elements_file = None

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@dataclass
class PhotonRegistry:
    """
    Helper class to manage the PHOTON Element Register
    ...
    """
    custom_elements_folder: str = None
    custom_elements: str = None
    custom_elements_file: str = None
    base_PHOTON_REGISTRIES: ClassVar[List[str]] =/
   ["PhotonCore", "PhotonNeuro"]
    PHOTON_REGISTRIES: ClassVar[List[str]] =/
   ["PhotonCore", "PhotonNeuro"]
def __post_init__(self):
    if self.custom_elements_folder:
        self._load_custom_folder(self.custom_elements_folder)

Testing Techniques

기술 23

  • pytest를 사용해

기술 24

기술 25

  • integration tests는 모든 외부 (API) functions, classes, class attributes, and class methods를 100%를 커버해야 한다.

기술 27, 28, 29 Testing 관련한

  • Code type hinting checking
  • Test coverage
  • Performance profiling
  • Check security
  • Code reliability

Verification Techniques

기술 30

Code review, Codacy 툴을 이용해 코드 리뷰

DevOps for Your Sandbox

참고

  • https://betterprogramming.pub/thirty-two-advanced-techniques-for-better-python-code-6717226eb611
This post is licensed under CC BY 4.0 by the author.

Kubernetes Overview

[Python] EDA 대신 Pandas Profiling