-
카테고리
-
세부 분야
풀스택
-
해결 여부
해결됨
동적함수생성 질문드립니다.
23.10.23 00:02 작성 조회수 365
1
안녕하세요 선생님!
감사히 잘 듣고 있는 수강생입니다.
맨 마지막 도전과제 질문이 있어 문의드립니다.
하나의 태그에 대해서만 만드는게 아니라
나온 html 태그들을 각 함수에 할당하는 for 문으로 한번 돌려보고 싶어서... 이런식으로 했더니 err가 납니다.
def 함수 <--- 이 함수부분을 동적으로 할당할 수 있는 방법이 있을까요....?
print_center 라고 되어있는부분은 계속 덮어씌워지는걸 확인했습니다.
가장 빠른 풀스택: 파이썬 백엔드와 웹기술 부트캠프 (flask/플라스크와 백엔드 기본) [풀스택 Part1-1]
flask 깊은 이해를 위한 파이썬 중급 문법: 파이썬 데코레이터2
강의실 바로가기
답변을 작성해보세요.
1
잔재미코딩 DaveLee
지식공유자2023.10.24
안녕하세요. 답변 도우미입니다.
Python에서 함수 이름을 동적으로 생성하는 것은 좀 복잡할 수 있습니다. globals()
함수를 사용하여 전역 변수 및 함수 이름을 동적으로 할당하는 것이 가능하기는 하지만, 일반적인 방법은 아닙니다. 그렇지만, 여기서는 당신의 문제를 해결하기 위해 이 방법을 사용해볼 수 있겠습니다.
먼저, 코드에서 문제가 되는 부분을 수정해보겠습니다:
html_list = ['b','i','h1','h5','h6','center']
func_list = ["print_1","print_2","print_3","print_4","print_5","print_6","print_7","print_8","print_9"]
def mark_html(tag):
def outer_wrapper(function):
def inner_wrapper(*args, **kwargs):
return f"<{tag}>{function(*args, **kwargs)}</{tag}>"
return inner_wrapper
return outer_wrapper
for tag, func_name in zip(html_list, func_list):
@mark_html(tag)
def generated_function(title, tag=tag): # tag의 기본값을 설정하여 closure 문제를 해결
return title
globals()[func_name] = generated_function
# 예시 사용 방법:
print(print_1("Hello!"))
print(print_2("How are you?"))
여기서 사용한 핵심 아이디어는:
1. mark_html
데코레이터를 수정하여 원하는 태그를 입력받을 수 있게 했습니다.
2. for
루프 내에서 함수를 정의하고, 그 함수를 globals()
를 사용하여 원하는 함수 이름으로 할당했습니다.
3. generated_function
함수 정의에서 tag=tag
로 기본값을 설정함으로써 함수 정의 내부에서 tag
변수에 접근할 수 있게 했습니다.
이렇게 하면, 원하시는 대로 동적으로 함수를 생성하고 그 이름을 할당할 수 있습니다.
감사합니다.
0
cookies poo
질문자2023.10.25
오... 함수를 만들때 선언하는게 아니라 공통으로 generated_function을 미리 만들고 그걸 함수에 할당하면 되네요..!!! 감사합니다!
답변 2