Изменить код функции в функции-обертке - PullRequest
1 голос
/ 28 октября 2019

Можно ли заменить действительный код функции на функцию, которая его оборачивает? Здесь я пытаюсь заменить операторы print на операторы log:

import logging
import re

def print_to_log(func):
    def wrapper_print_to_log(*args, **kwargs):
        # how to do something like this?
        re.sub(r'print\s*\(',  'logging.info(', **function_code**)
        return func(*args, **wargs)
    return wrapper_print_to_log


@print_to_log
def greet(name='bob'):
    print ("Hello, %s" % name)
    print ("How are you sir?")

Можно ли заменить код или сделать что-то похожее на приведенное выше?

1 Ответ

0 голосов
/ 28 октября 2019

Возможно, вы можете временно заменить sys.stdout?

import logging
import re
import sys
import io

def print_to_log(func):
    def wrapper_print_to_log(*args, **kwargs):
        stdout = sys.stdout
        b = io.StringIO()
        sys.stdout = b
        try:
            return func(*args, **kwargs)
        finally:
            sys.stdout = stdout
            print(b.getvalue().upper())

    return wrapper_print_to_log

@print_to_log
def greet(name='bob'):
    print("Hello, %s" % name)
    print("How are you sir?")

greet('justin')
...