no image
[PEP] 함수 Docstring과 Type Hint 작성 방법
파이썬에서 유명한 라이브러리 코드를 보게 되면 무언가 많이 작성되어 있는 것을 볼 수가 있다. def generate_identified_filename(filename: Path, identifier: str) -> Path: """ Append a string-identifier at the end (before the extension, if any) to the provided filepath Args: filename: pathlib.Path The actual path object we would like to add an identifier suffix identifier: The suffix to add Returns: String with c..
2024.06.11
no image
[PEP] Pythonic한 Name Convention에 대해 알아보자
파이썬에서 사용하는 PEP(Program Enhance Proposal) 에서 Name Convention에 대해 알아보려고 한다. PEP는 파이썬 개발자들 간의 관습을 적어놓은 것이라고 생깍하면 된다. 파이썬 유저라면 파이썬 코드를 작성할 때 PEP-8을 이용해서 쓰는 것을 추천한다.목차피해야 할 이름Package and Module Names (패키지 모듈 이름)Class Name (클래스 이름)Type Variable Names (타입 변수 이름)Exception Names (예외 이름)Global Variable Names (전역 변수 이름)Function and Variable Names (함수, 변수 이름)Method Names and Instance Variables (메소드와 인스턴스 변수..
2024.06.10
no image
[Clean Code] 프로그래밍 명명 규칙인 Camel Case, Snake Case, Pascal Case, Kebab Case에 대해 알아보자
프로그래밍을 하다 보면 변수, 함수, 클래스 등을 정의할 때 대문자를 쓰거나 언더바('_')를 쓰는 경우를 볼 수 있는데 이에 대해 자세하게 알아보려고 한다. 요약명명 규칙설명예시Snake_case모든 글자를 소문자로 하며, 단어는 밑줄로 구분한다. new_object, my_website_name, user_profile camelCasePascalCase와 유사하지만 첫 글자는 소문자이며, 공백은 없다. newObject, myWebsiteName, userProfile PascalCase각 단어의 첫 글자를 대문자로 이며, 공백은 없다 NewObject, MyWebsiteName, UserProfile Kebab-case모든 글자를 소문자로 하며, 단어는 하이픈( '-' )으로 구분한다. new-o..
2024.06.09
728x90

파이썬에서 유명한 라이브러리 코드를 보게 되면 무언가 많이 작성되어 있는 것을 볼 수가 있다. 

def generate_identified_filename(filename: Path, identifier: str) -> Path:
    """
    Append a string-identifier at the end (before the extension, if any) to the provided filepath

    Args:
        filename: pathlib.Path The actual path object we would like to add an identifier suffix
        identifier: The suffix to add

    Returns: String with concatenated identifier at the end of the filename
    """
    return filename.parent.joinpath(filename.stem + identifier).with_suffix(filename.suffix)

* transformers 의 코드 중 하나

 

이런 식으로 함수 아래에  """ 따옴표를 이용하여 무언가가 많이 적혀 있는데 이것을 Docstring이라고 하는데 이것에 대해 알아보려고 한다. 

Docstring이란?


쉽게 말해서 소스 코드에 포함된 문서라고 말할 수 있다. docstring은 문자열이며, fucntion logic을 문서화하기 위해 작성한다. Docstring은 주석과는 다르게 Python의 첫 번째 실행 가능한 문장으로 작성되며, Python 인터프리터에 의해 처리되어 해당 객체의 __doc__ 특수 속성에 저장됩니다. 이를 통해 프로그램 실행 중에도 해당 정보에 접근할 수 있다.

 

Docstring 작성 방법


  1. 함수 정의와 타입 힌트 적용: 함수 정의에서 매개변수와 반환 값에 타입 힌트를 적용
  2. 문자열 시작: 함수 정의 바로 아래에 삼중 따옴표 (""")를 사용해 docstring을 시작
  3. 요약 설명: 함수가 수행하는 작업에 대한 간결하고 명확한 한 줄 요약을 포함
  4. 상세 설명 (선택 사항): 요약 설명 다음에 빈 줄을 두고 필요한 경우 함수의 동작을 보다 상세히 설명
  5. 매개변수 설명: Parameters 섹션에서 각 매개변수의 이름, 타입, 그리고 설명을 제공
  6. 반환 값 설명: Returns 섹션에서 함수가 반환하는 값의 타입과 그 의미를 설명
  7. 예외 설명: Raises 섹션에서 함수 실행 중 발생할 수 있는 예외와 그 상황을 나열하고 설명
  8. 예시 설명: Examples 섹션에서 함수의 실행 예시와 결과 값에 대해 나열하고 설명

 

타입 힌트 작성


타입 힌트는 typing 모듈과 pydantic 모듈을 사용합니다. typing은 3.5 버전부터 일반적으로 사용하고 3.10 버전부터는 pydantic 모듈을 사용한다. 특히 pydantic은 FastAPI와 같은 API에서 많이 사용하고 그 외에는 거의 typing 모듈을 사용한다고 보면 된다. 

 

예시


typing 모듈을 사용하지 않았을 때

def add(a: int, b: int) -> int:
    """
    두 정수의 합을 계산하여 반환합니다.

    Parameters:
    a (int): 첫 번째 정수. 정수가 아닐 경우 TypeError 발생.
    b (int): 두 번째 정수. 정수가 아닐 경우 TypeError 발생.

    Returns:
    int: 두 수의 합

    Raises:
    TypeError: `a` 또는 `b`가 정수가 아닐 때 발생

    Examples:
    >>> add(10, 20)
    30

    >>> add("ten", 20)
    TypeError: Both arguments must be integers
    """
    if not isinstance(a, int) or not isinstance(b, int):
        raise TypeError("Both arguments must be integers")
    return a + b

 

typing 모듈을 사용했을 때

from typing import Union

def add_numbers(x: Union[int, float], y: Union[int, float]) -> float:
    """
    두 숫자의 합을 계산하여 반환합니다.

    Parameters:
    x (Union[int, float]): 첫 번째 숫자. 정수 또는 부동소수점 수가 될 수 있습니다.
    y (Union[int, float]): 두 번째 숫자. 정수 또는 부동소수점 수가 될 수 있습니다.

    Returns:
    float: `x`와 `y`의 합.

    Examples:
    >>> add_numbers(1, 2)
    3
    >>> add_numbers(1.5, 2.3)
    3.8

    Notes:
    이 함수는 `int` 또는 `float` 타입의 두 입력값을 받아 그 합을 `float`로 반환합니다.
    """
    return x + y

 

 

728x90

파이썬에서 사용하는 PEP(Program Enhance Proposal) 에서 Name Convention에 대해 알아보려고 한다. PE
P는 파이썬 개발자들 간의 관습을 적어놓은 것이라고 생깍하면 된다. 파이썬 유저라면 파이썬 코드를 작성할 때 PEP-8을 이용해서 쓰는 것을 추천한다.

목차

  1. 피해야 할 이름
  2. Package and Module Names (패키지 모듈 이름)
  3. Class Name (클래스 이름)
  4. Type Variable Names (타입 변수 이름)
  5. Exception Names (예외 이름)
  6. Global Variable Names (전역 변수 이름)
  7. Function and Variable Names (함수, 변수 이름)
  8. Method Names and Instance Variables (메소드와 인스턴스 변수 이름)
  9. Constants (상수) 

 

피해야 할 이름


‘l’ (소문자 엘), ‘O’ (대문자 오), 또는 ‘I’ (대문자 아이)와 같은 문자를 단일 문자 변수 이름으로 사용하지 말아햐 한다. 그 이유는 특정 글꼴에서는 숫자 일(1)과 숫자 영(0)이 알파벳과 구분이 가지 않기 때문이다. 대문자 아이 ('I') 대신에 대문자 엘 ('L')을 사용 할 것을 권장한다.

# Wrong
I = 3 
O = 'a'

# Correct
L = 5

 

패키지, 모듈 이름


모듈은 짧고 모두 소문자로 된 이름을 가져야 한다. 가독성을 향상시키면 모듈 이름에 밑줄을 사용할 수 있다. 파이썬 패키지도 짧고 모두 소문자로 된 이름을 가져야 하며, 밑줄 사용은 권장되지 않는다.

 

  • 모듈 이름이 짧고 소문자로 구성된 예시: numpy, requests, flask
  • 가독성을 위해 밑줄이 포함된 모듈 이름 예시: date_utils, file_parser

 

 

클래스 이름


클래스 이름은 일반적으로 Pascal Case 규칙을 사용한다. 

  • Pascal Case를 사용한 클래스 이름 예시 : DataLoader, GameCharacter

 

타입 변수 이름


 PEP 484에서 일반적으로 Pascal Case를 사용하며 짧은 이름을 사용하도록 권장한다. 

짧은 이름 + Pascal Case를 사용한 예시

T = TypeVar('T')
AnyStr = TypeVar('AnyStr')
Num = TypeVar('Num')

 

예외 이름


예외 클래스 이름은 클래스 + "Error"의 접미사를 붙여서 작성한다.

예시

  • ConnectionError
  • validationError
  • TimeoutError

 

전역 변수 이름


모든 문자를 대문자로 사용하며, 단어간의 구분은 하이픈( '-' )을 이용하여 작성합니다.

예시

  • MAX_SIZE
  • DEFAULT_TIMEOUT

 

함수, 변수 이름


함수 이름은 소문자로 해야하며, 필요에 따라 단어 사이의 밑줄을 사용한다. 이것은 Snake Case라고 생각하면 된다. 

예시

  • 함수 이름 예시 : calculate_tax., send_message
  • 변수 이름 예시 : item_count, database_connection

 

메소드 이름 및 인스턴스 변수


필요에 따라 단어를 구분하기 위해 밑줄을 사용하여 소문자로 작성해야 한다. 비공개 메소드와 인스턴스 변수에는 하이픈을 하나만 사용한다. 그리고 외부에서 접근을 못하게 하기 위해서는 언더바 2개를 사용한다. 두개 모두 Snake Case를 사용한다.

예시

  • 메소드 : calculate_total
  • 인스턴스 변수
    • user_id: 사용자의 ID를 저장하는 변수
    • _password: 비밀번호를 비공개로 저장하는 변수
    • __internal_cache: 클래스 내부에서만 사용되고 하위 클래스에서 이름 충돌을 방지하기 위한 비공개 변수

언더바 하나의 예시

class Account:
    def __init__(self, owner):
        self._balance = 0  # 내부 사용을 위한 변수로, 외부에서 직접 접근을 권장하지 않음
        self.owner = owner

    def deposit(self, amount):
        if amount > 0:
            self._balance += amount
            self._update_ledger(amount)  # 내부 메소드 호출

    def _update_ledger(self, amount):
        print(f"{amount}가 입금됐습니다.")

언더바 두 개의 예시

class Account:
    def __init__(self, owner):
        self.__balance = 0  # 이름 변경을 통해 클래스 외부에서 접근하기 어려운 변수
        self.owner = owner

    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount
            self.__update_ledger(amount)  # 이름 변경을 통해 클래스 외부에서 접근하기 어려운 메소드

    def __update_ledger(self, amount):
        print(f"{amount}가 입금됐습니다.")

# 외부에서 접근 시도
account = Account("John")
print(account.__balance)  # AttributeError 발생

 

상수


전역 변수와 동일하게 모든 문자를 대문자로 사용하며, 단어간의 구분은 하이픈( '-' )을 이용하여 작성합니다.

예시

  • MAX_SIZE
  • DEFAULT_TIMEOUT

 

출처 : https://peps.python.org/pep-0008/#naming-conventions

728x90

Snake, Camel

프로그래밍을 하다 보면 변수, 함수, 클래스 등을 정의할 때 대문자를 쓰거나 언더바('_')를 쓰는 경우를 볼 수 있는데 이에 대해 자세하게 알아보려고 한다. 

요약

명명 규칙 설명 예시
Snake_case 모든 글자를 소문자로 하며, 단어는 밑줄로 구분한다. new_object, my_website_name, user_profile
camelCase PascalCase와 유사하지만 첫 글자는 소문자이며, 공백은 없다. newObject, myWebsiteName, userProfile
PascalCase 각 단어의 첫 글자를 대문자로 이며, 공백은 없다 NewObject, MyWebsiteName, UserProfile
Kebab-case 모든 글자를 소문자로 하며, 단어는 하이픈( '-' )으로 구분한다. new-object, my-website-name, user-profile

 

각각 언어가 선호하는 Case

언어 선호하는 케이스 예시
Python Snake Case Class: Pascal Case (MyClass)

Others: snake case (my_variable)
Java Camel Case Class, Interface : Pascal Case

Others: Camel Case
JavaScript Camel Case Class: Pascal Case (MyComponent)

Others: Camel Case (myFunction, myVariable)
C Snake Case Functions and Variables: Snake Case (my_variable, calculate_value)
C++ Mixed Class, Struct: Pascal Case (MyClass, MyStruct)

Functions and Variables: Camel Case (myFunction, myVariable)
C# Camel Case Class, Interface: Pascal Case (MyClass, IMyInterface)

Others: Camel Case (myVariable, CalculateValue)
Ruby Snake Case Class, Module: Pascal Case (MyClass, MyModule)

Others: snake case (my_variable, calculate_value)
React Camel Case Components: Pascal Case (MyComponent)

Others: Camel Case (myVariable, handleEvent)
Go Camel Case Struct, Interface: Pascal Case (MyStruct, MyInterface)

Others: Camel Case (myVariable, ProcessData)
Swift Camel Case Class, Enum, Struct,: Pascal Case (MyClass, MyEnum, MyStruct)

Others: Camel Full (myVariable, calculateValue)
  • * Exception, Class를 지원하는 언어의 경우는 Pascal Case를 사용한다.
  • * 상수(Constant)의 경우 대문자와 밑줄로 작성한다. (MAX_NUM)

 

Snake_case


Snake case는 모든 단어를 소문자로 쓰고, 단어 사이를 밑줄('_')로 연결하는 명명 방식이다. 이 스타일은 주로 파이썬과 같은 프로그래밍 언어에서 변수와 함수 이름에 사용된다. 변수의 형태가 뱀과 같다는 뜻에서 이름이 붙었다. 주로 파이썬과 같은 프로그래밍 언어에서 사용되는 규칙이다. 장점은 가독성이 좋아진다. 

예시

  • my_variable_name
  • calculate_total_sum()

 

camelCase


Camel case는 단어의 첫 글자를 제외하고 각 단어의 첫 글자를 대문자로 표기하여 단어를 구분하는 명명 방식이다. 이 방식은  낙타의 등과 비슷하다고 해서 Camel Case라고 불린다.

Camel Case는 크게 두 가지 유형으로 나뉜다: Upper Camel Case (Pascal Case)와 Lower Camel Case. 여기서 보통 Camel Case라고 하면, Lower Camel Case를 의미하며 Upper Cemel Case는 Pascal Case로 불리게 된다.

예시

  • Upper Camel Case(Pascal Case) : ClassName
  • Lower Camel Case : methodName

 

PascalCase


Pascal Case는 단어의 첫 글자를 대문자로 시작하고, 나머지 글자를 소문자로 표기하는 명명 방식이다. 이 방식은 Pascal 언어에서 사용해서 이름이 붙여졌다. 이 규칙은 공백, 밑줄과 하이픈을 사용하지 않는다. 그래서 대분자로 단어를 구분한다. 특히 자바에서 많이 사용한다.

* 언어를 고사하고 Class 정의는 Pascal Case를 사용한다.

예시

  • CustomerService

 

Kebab-case


Kebab Case는 모든 글자를 소문자로 쓰고 각 단어를 하이픈으로 표기하는 명명 방식이다. 특히 HTML, CSS, URL, 파일 이름 등 웹 기술에서 자주 사용되는 언어이다.

예시

  • URL : https://example.com/my-page
  • CSS : menu-item
  • File Name : my-document.txt