• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

동적함수생성 질문드립니다.

23.10.23 00:02 작성 조회수 365

1

안녕하세요 선생님!

감사히 잘 듣고 있는 수강생입니다.

맨 마지막 도전과제 질문이 있어 문의드립니다.

하나의 태그에 대해서만 만드는게 아니라

나온 html 태그들을 각 함수에 할당하는 for 문으로 한번 돌려보고 싶어서... 이런식으로 했더니 err가 납니다.

def 함수 <--- 이 함수부분을 동적으로 할당할 수 있는 방법이 있을까요....?

 

print_center 라고 되어있는부분은 계속 덮어씌워지는걸 확인했습니다.

답변 2

·

답변을 작성해보세요.

1

안녕하세요. 답변 도우미입니다.

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

오... 함수를 만들때 선언하는게 아니라 공통으로 generated_function을 미리 만들고 그걸 함수에 할당하면 되네요..!!! 감사합니다!