티스토리 뷰
[Python] eval과 실제 사용 예(ultralytics/ultralytics YOLOv8 Project)
developer0hye 2023. 2. 7. 23:29python의 Built-in Functions 중 eval 이라는 함수가 있다.
eval 은 문자열을 입력으로 받는다.
eval 의 출력은 입력받은 문자열이 Python interpreter로 해독가능하다면 그 문자열을 "코드"로 보고 실행한다. 그렇지 않은 경우는 예외가 발생한다.
eval('1+2') # 3
eval("'1'+'2'") # "12"
이런것도 가능하다.
class Foo:
def __init__(self, x):
self.x = x
pass
foo = eval("Foo(x=5)")
print(foo.x) # 5
too = eval("Foo")(15)
print(too.x) # 15
활용 방법은 무궁무진하다.
실제 사용 예
YOLOv8 의 경우 모델 아키텍쳐가 컨피그 파일에 정의돼있다. 아래는 실제 예시로 레이어의 이름(Conv, C2f, ..., nn.Upsample 등)이 작성돼있는 것을 확인할 수 있다.
실제로 위에 적힌 레이어의 이름과 동일한 이름을 갖는 클래스가 그대로 구현돼있다.
https://github.com/ultralytics/ultralytics/blob/main/ultralytics/nn/modules.py
YOLOv8 프로젝트에서는 위 컨피그 파일을 읽고 레이어 이름을 파싱한뒤 그 레이어를 eval()에 넣고 그대로 Class로 변환해버린다.
https://github.com/ultralytics/ultralytics/blob/main/ultralytics/nn/tasks.py#L427
eval을 몰랐다면
if 파싱된_레이어_이름 == "땡땡 레이어":
layer = 땡땡 레이어 클래스 이름(args)
나는 일일이 위와 같이 조건문을 써서 한 번더 파싱된 스트링을 클래스로 변환하는 동작을 수행한다거나,
키를 파싱된 스트링, 밸류를 클래스로 저장하는 dictionary를 썼다거나 했을 거 같다.
'Python' 카테고리의 다른 글
[Python] pdb 전용 명령어(n, q, ...) 무시 방법 (0) | 2023.02.08 |
---|---|
[Python] 파이썬 클래스의 해괴한 멤버변수 정의 방법과 실제 사용 예 (0) | 2023.02.07 |
[Python] static 멤버 변수 (0) | 2023.02.06 |
[conda] conda 업데이트 (0) | 2023.01.09 |
[Python] Dict 예쁘게 출력하기 (0) | 2022.12.04 |
- Total
- Today
- Yesterday
- C++ Deploy
- 백트래킹
- 백준 11437
- Lowest Common Ancestor
- ㅂ
- 가장 긴 증가하는 부분 수열
- LCA
- 이분탐색
- PyCharm
- 인공지능을 위한 선형대수
- 자료구조
- MOT
- FairMOT
- 백준
- 조합
- 위상 정렬 알고리즘
- 순열
- 파이참
- 백준 11053
- 문제집
- cosine
- 단축키
- 백준 1766
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |