Magic Method

__getitem__(index)

def __getitem__(self, index):
	pass
# indexλŠ” [] μ•ˆμ— 값이
  • 객체의 [] μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 쑰회 ν•  λ•Œ μž‘λ™ν•˜λŠ” λ©”μ†Œλ“œ
  • numpy의 [3,4] 이런 μŠ¬λΌμ΄μ‹± 방식이 이걸둜 κ΅¬ν˜„λ˜μ–΄μžˆλ‹€
  • list[10] == list.__getitem__(10)

__setitem__(index, key)

def __setitem__(self, index, key):
	pass
# indexλŠ” [] μ•ˆμ— κ°’, keyλŠ” λŒ€μž… κ°’
  • 객체의 [] μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄μ„œ λ³€μˆ˜λ₯Ό μ§€μ •ν•  λ•Œ
  • list[10] = 1 == list.__setitem__(10, 1)

__str__()

  • 객체의 직접 print λ₯Ό μ€„μ‹œ λ‚˜μ˜€λŠ” 좜λ ₯ ꡬ문 μ»€μŠ€ν…€

__call__()

  • 객체λ₯Ό ν•¨μˆ˜μ²˜λŸΌ ν˜ΈμΆœν•  수 있게 ν•΄μ£ΌλŠ” λ©”μ†Œλ“œ
obj = Object() 
obj()
# __call__() ν•¨μˆ˜κ°€ ν˜ΈμΆœλœλ‹€

enumerate

for index, item in enumerate(arr):
  • 리슀트 ν–‰λͺ©λ“€λ‘œ for λŒλ¦΄μ‹œ μΈλ±μŠ€λ„ 같이 μ–»λŠ” 객체

typing

Literal

a: Literal["이거", "μ €κ±°"] = "이거"
  • νƒ€μž…μ„ β€œμ΄κ±°β€ β€œμ €κ±°β€λ‘œ 만 λͺ…μ‹œ ν•˜λŠ”
  • νŠΉμ • Literal 따라 νƒ€μž…μ΄ λ™μ μœΌλ‘œ λ³€ν•΄μ•Ό ν•˜λŠ”κ²½μš°λŠ” λͺ…μ‹œ λΆˆκ°€

λ”•μ…”λ„ˆλ¦¬ μ•ˆμ— λ”•μ…”λ„ˆλ¦¬ typing

λ”•μ…”λ„ˆλ¦¬ = {
	"ν‚€1": dict[Literal["ν•­λͺ©1", "ν•­λͺ©2"], int](
		{
			"ν•­λͺ©1": 1,
			"ν•­λͺ©2": 2,
		}
	),
}
  • μ΄λ•ŒλŠ” dict 의 μƒμ„±μžλ₯Ό μ‚¬μš©ν•΄ typing κ°€λŠ₯ν•˜λ‹€
  • 그러면 λ”•μ…”λ„ˆλ¦¬["ν‚€1"]["ν•­λͺ©1"] κΉŒμ§€ typing λœλ‹€

Sequence

  • 이건 list 와 tuple 같은 μ—΄κ±°ν˜• μžλ£Œν˜•μ„ 의미
a: Sequence[int] = [1, 2]

GIL (Global Interpreter Lock) 문제

Python에 제일 큰 λ¬Έμ œλŠ” 1μ½”μ–΄ 1μ“°λ ˆλ“œλ‘œ 밖에 λ™μž‘ν•˜μ§€ λͺ»ν•œλ‹€

  • λ§Œμ•½ threading API둜 μ—¬λŸ¬ μ“°λ ˆλ“œλ‘œ μž‘μ—…ν•œλ‹€κ³  해도
    GIL λ•œμ— 사싀상 λ™μ‹œμ— μ‹€ν–‰λœλ‹€λŠ” μ „μ œλŠ” μ•„λ‹ˆλ‹€
  • λ‹€λ§Œ μ™„μ „ν•˜κ²Œ μ˜λ―ΈλŠ” μ—†λŠ”κ²Œ μ•„λ‹Œκ²Œ I/O μž‘μ—…κ°™μ΄ Windows API 같은
    OS API 의 μ˜μ‘΄ν•˜κ±°λ‚˜, 라이브러리 μžμ²΄κ°€ C, C++둜 κ΅¬ν˜„λ˜μžˆλŠ” 경우
    GIL이 κ΄€μ—¬ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λ©€ν‹°μ“°λ ˆλ”© μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€
  • ν•˜μ§€λ§Œ 순수 Python μ½”λ“œλ‘œ λ˜μ–΄μžˆλŠ” CPU μ—°μ‚°μž‘μ—…μ—λŠ” λ³„λ‘œ 큰 μ˜λ―Έκ°€ μ—†μ–΄μ§„λ‹€
    • μ΄λ–„λŠ” 사싀상 비동기와 큰 차이가 μ—†μ–΄μ§€λŠ” 것이닀.
      단지 ꡬ쑰적인 차이와, 비동기 관리λ₯Ό μ–Έμ–΄ μˆ˜μ€€μ—μ„œ ν•˜λƒ, OS μˆ˜μ€€μ—μ„œ ν•˜λƒ 정도
  • Python 3.13 μ΄ν›„μ—λŠ” 이게 μ„ νƒμœΌλ‘œ λ°”λ€λ‹€λŠ”λ° μ•„μ§κΉŒμ§€ μ œλŒ€λ‘œλœ 정보λ₯Ό 잘 λͺ¨λ₯΄κ² λ‹€

multiprocessing

νŒŒμ΄μ¬μ—μ„œ λ©€ν‹°ν”„λ‘œμ„Έμ‹±μ„ μˆ˜ν–‰ν•˜λŠ” 객체

from multiprocessing import Pool
 
def f(x):
    return x * x
 
if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(f, [1, 2, 3, 4, 5]))
  • Python μ—μ„œλŠ” 이런 GIL 문제λ₯Ό μš°νšŒν•˜κ³ μž λ©€ν‹°ν”„λ‘œμ„Έμ‹±μ„ 많이 μ“°λŠ”κ±° κ°™λ‹€
  • λ‹€λ§Œ Frozen Start 문제 λ•Œλ¬Έμ— λ³„λ‘œ 였래 μ•ˆκ±Έλ¦¬λŠ” μž‘μ—…μ—λŠ” λ©€ν‹°μ“°λ ˆλ”©μ΄ λͺ‡λ°°λŠ”λ” λΉ λ₯΄λ‹€

μ„€λͺ…

  • f() ν•¨μˆ˜λ₯Ό 각각 1, 2, 3, 4, 5의 인자λ₯Ό 전달받아 μ—°μ‚°ν•œλ‹€λŠ” κ°œλ…
  • λ§Œμ•½ Pool 을 3으둜 λ³€κ²½ν•˜λ©΄ 3개의 ν”„λ‘œμ„ΈμŠ€λ₯Ό 1, 2, 3에 ν• λ‹Ήν•˜μ—¬ μ—°μ‚° μ‹œν‚€κ³ , κ°€μž₯ 빨리 λλ‚œ 순으둜 λ‚˜λ¨Έμ§€ 4, 5λ₯Ό μ—°μ‚°

λ©€ν‹°ν”„λ‘œμ„Έμ‹±μ˜ νŠΉμ§•

  • ν˜„μž¬ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μ™€ μ™„μ „νžˆ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•˜λŠ”κ²ƒ
  • λ…λ¦½λœ Memory-Map κ³Ό, μžμ›μ„ ν• λ‹Ήλ°›μŒ
  • 같은 Memory-Map을 μ“°μ§€ μ•ŠμœΌλ―€λ‘œ 각각의 ν”„λ‘œμ„ΈμŠ€ κ°„ 톡신은 IPC둜 이루어짐

리슀트 μ»΄ν”„λ¦¬μ…˜ (list comprehension)

x2 = [ n*2 for n in x ]
x2
# μ—°μ‚° for λ³€μˆ˜ in μ°Έμ‘°κ°’ 

Asterisk

Python μ—μ„œμ˜ *

Unpacking (*)

일반 μ½”λ“œμ—μ„œμ˜ μ‚¬μš©

list_data = [1,2,3,4,5]
 
print(*list_data)
-> 1 2 3 4 5
  • 마치 JS 의 ... μ—°μ‚°μž 처럼 λ¦¬μŠ€νŠΈλ‚˜, νŠœν”Œμ„ ν’€μ–΄μ£ΌλŠ” μ—­ν• μ„ν•œλ‹€
def fuc(a: int, b: int, c: int):
	pass
 
list_data = [1,2,3]
# λ˜λŠ” (1,2,3)
 
fuc(*list_data)
  • μ΄λ ‡κ²Œ μ—¬λŸ¬κ°œμ˜ 인자λ₯Ό 전달해야 ν•˜λŠ”κ²½μš° listλ‚˜ tuple을 λ§Œλ“€μ–΄μ„œ 전달도 κ°€λŠ₯ν•΄μ§„λ‹€
dict_data = {1: "name", 2: "age", 3: "height", 4: "weight"}
print(*dict_data)
-> 1 2 3 4
  • λ”•μ…”λ„ˆλ¦¬μ˜ 경우 킀값이 Unpacking λœλ‹€

positional argument (*)

ν•¨μˆ˜μ—μ„œ μ‚¬μš©

def test(*args):
Β  Β  print(args)
 
test(1 ,2, "ν•˜μ΄")
-> (1, 2, "ν•˜μ΄")
  • ν•¨μˆ˜ 인자λ₯Ό νŠœν”Œ ν˜•νƒœλ‘œ λ°›λŠ”λ‹€
  • μ•„λž˜ keyword arguements 와 λ‹€λ₯΄κ²Œ 킀값이 ν•„μš”ν•˜μ§€ μ•Šμ•„ κ·Έλƒ₯ λ¬΄μž‘μœ„ 값을 마음데둜 넣을 수 μžˆλ‹€
  • λͺ¨ν˜Έμ„± 문제둜 positional argument을 λ‘λ²ˆ μ“°λŠ”κ±΄ ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€

keyword arguements (**)

ν•¨μˆ˜μ—μ„œ μ‚¬μš©

def test(tes, **kwargs):
Β  Β  print(kwargs["key"])
 
test(1 ,key=10)
-> {'key': 10}
  • ν•¨μˆ˜ 인자λ₯Ό 동적 λ”•μ…”λ„ˆλ¦¬λ‘œ λ°›λŠ”λ‹€
  • ν•¨μˆ˜ 호좜 μ‹œ kwargs μ—λŠ” λ°˜λ“œμ‹œ key-value ν˜•νƒœλ‘œ 전달해야 함
  • λͺ¨ν˜Έμ„± 문제둜 keyword arguements을 λ‘λ²ˆ μ“°λŠ”κ±΄ ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€

subprocess

subprocess.run

  • λͺ…λ Ήμ–΄λ₯Ό λ™κΈ°μ μœΌλ‘œ μ‹€ν–‰
try:
# check=True둜 μ„€μ •ν•˜μ—¬ μ‹€νŒ¨ν•œ ν”„λ‘œμ„ΈμŠ€λ₯Ό 감지
result = subprocess.run(
    ["bash" "-c", "echo", "ν…ŒμŠ€νŠΈ" ], 
    check=True, 
    capture_output=True, 
    text=True
)
except subprocess.CalledProcessError as e:
    # μ‹€νŒ¨ μ‹œ μ˜ˆμ™Έ 처리
	print("μ˜ˆμ™Έλ°œμƒ")

subprocess.Popen

  • λͺ…λ Ήμ–΄λ₯Ό λΉ„λ™κΈ°λ‘œ μ‹€ν–‰
# λͺ…령을 λΉ„λ™κΈ°λ‘œ μ‹€ν–‰
subprocess.Popen(
	["bash" "-c", "echo", "ν…ŒμŠ€νŠΈ" ],
	stdout=subprocess.PIPE,
	stderr=subprocess.PIPE,
	text=True,
)
 
# 비동기 μ‹€ν–‰ λŒ€κΈ°
stderr, stdout = pr.communicate()
 
# μ˜ˆμ™Έμ²˜λ¦¬
if pr.returncode != 0:
	print("μ‹€νŒ¨")

argparse

파이썬 μ‹€ν–‰ 인자 μ£ΌκΈ°

parser.add_argument('--args', required=True, help='μ„€λͺ…')
 
# cliμ—μ„œ λ‹¨μˆœ μ˜΅μ…˜ ν™œμ„±ν™” μ‹œ
parser.add_argument('--enable', required=True, action="store_true")
args = parser.parse_args()
 
# μ•„μ˜ˆ λ³€μˆ˜λͺ…이 - 땐 model 이게 λœλ‹€ 
print(args.model)
# ν•΄λ‹Ή μΈμžκ°€ 있으면(μ„€μ •λ˜μžˆμœΌλ©΄) True, μ—†μœΌλ©΄ False
print(args.enable)

CLI μ‚¬μš©

python train/cardDict_train.py --args κ°’μž…λ ₯

νŒ¨ν‚€μ§€ ꡬ쑰

  • Python μ—μ„œλŠ” 각 νŒ¨ν‚€μ§€ κ°„ importκ°€ μ‹€ν–‰μ‹œν‚¨ ν™ˆ 기쀀이닀

μ„€λͺ…

main.pyλ₯Ό μ‹€ν–‰ 파일이라고 κ°€μ •

lib:
	lib.py
src:
	sub.py
	sub2.py
main.py
test.py
  • sub.pyκ°€ lib.py λ₯Ό import ν•˜κ³  μ‹Άλ‹€λ©΄ μ΄λ ‡κ²Œ ν•΄μ•Όν•œλ‹€

    import src.sub.py
  • 이런 μ›λ¦¬λ‘œ 같은 νŒ¨ν‚€μ§€λ”λΌλ„ λ‹¨μˆœ import κ°€ μ•ˆλœλ‹€

    #sub.py
    import sub2 #이거 μ•ˆλ¨
     
    ===μ˜¬λ°”λ₯Έ 예제===
    import src.sub2
  • λŒ€μ‹  sub.py κ°€ test.py λ₯Ό import ν•  λ•ŒλŠ” κ°€λŠ₯ν•˜λ‹€

    # sub.py
    import test

import μœ„μΉ˜λ₯Ό ν•΄κ²°ν•˜λŠ” 방법

  • sytem pathλ₯Ό μΆ”κ°€ν•˜μž

    import sys
    sys.path.append("./λ°”κΏ€κ²½λ‘œ")

μ˜ˆμ™Έμ²˜λ¦¬

μ˜ˆμ™Έ λ°œμƒμ‹œν‚€κΈ°

raise Exception("μ˜ˆμ™Έ λ°œμƒγ…Žγ…Ž")

bool νƒ€μž… λ³€ν™˜ 문제

  • python μ—μ„œ string bool λ¬Έμžμ—΄(false, true)을 μ‹€μ œ bool νƒ€μž…μœΌλ‘œ λ³€ν™˜ ν•˜λ €λ©΄ μ•„λž˜ μ½”λ“œλ₯Ό μ“Έ 수 μžˆλ‹€

    bool("true")
  • κ·Όλ°λ¬Έμ œλŠ” false λ¬Έμžμ—΄λ„ True둜 λ°˜ν™˜ν•œλ‹€

  • 이게 빈 λ¬Έμžμ—΄ μ΄κ±°λ‚˜, 0 μ΄κ±°λ‚˜ ν• λ•Œ false만 false둜 λ°˜ν™˜λœλ‹€

  • κ·Έλž˜μ„œ bool λ¬Έμžμ—΄μ€ a=="true" b=="false" μ΄λŸ°μ‹μœΌλ‘œ μ²˜λ¦¬ν•˜μž