Development/Python3..x

[Python3.x] 파일내 함수이름/라인번호/파일 번호 프린트 하기

louky 2021. 9. 30. 17:20
반응형

파이썬내 소스코드 위치를 파악하기 위해 해당 위치의 라인 번호  또는 함수 이름을 출력이 필요할 때 있다. 

초보자인 필자의 경우 debug용으로 좀더 쉽게 찾고자 출력시 파일 이름 또는 함수 이름 , 라인 위치가 필요 할 때가 있다. 

 

사용법은 아주 간단하다.

필요한 부분만 별도로 함수를 만들어 사용해도 무방하다. 

 

테스트 환경 : 

     - os : Centos 7 

     - python version : 3.7.10

def line_info(return_type=None):
    import inspect
    
    ### line number
    '''
      여기를 호출한 곳의 라인위치(라인번호)를 리턴한다.
    '''  
    cf = inspect.currentframe()
    linenumber = cf.f_back.f_lineno


    ### Call to Function name
    '''
      여기를 호출한 곳의 함수이름(function name(def))를 리턴한다.
    '''  
    func_name = cf.f_back.f_code.co_name


    ### file name
    '''
      여기를 호출한 파일 이름을 리턴한다.
    '''  
    frame = inspect.stack()[1]
    module = inspect.getmodule(frame[0])
    filename = module.__file__
    get_filename = filename.split('/')[-1]


    if return_type == 'filename':
        result_info = f'{get_filename}'
    elif return_type == 'function' or return_type == 'func_name' or return_type == 'f_name':
        result_info = f'{func_name}'
    elif return_type == 'lineinfo' or return_type == 'linenum' or return_type == 'lineno':
        result_info = f'{linenumber}'
    elif return_type == 'info_all' or return_type is None:
        result_info = f'{get_filename}({func_name}.{linenumber})'
    else:
        result_info = f'{get_filename}({func_name}.{linenumber})'
    return result_info

 

테스트 코드는 아래와 같다. 

from termcolor import cprint

def line_info(return_type=None):
    import inspect

    ### line number
    '''
      여기를 호출한 곳의 라인위치(라인번호)를 리턴한다.
    '''
    cf = inspect.currentframe()
    linenumber = cf.f_back.f_lineno


    ### Call to Function name
    '''
      여기를 호출한 곳의 함수이름(function name(def))를 리턴한다.
    '''
    func_name = cf.f_back.f_code.co_name


    ### file name
    '''
      여기를 호출한 파일 이름을 리턴한다.
    '''
    frame = inspect.stack()[1]
    module = inspect.getmodule(frame[0])
    filename = module.__file__
    get_filename = filename.split('/')[-1]


    if return_type == 'filename':
        result_info = f'{get_filename}'
    elif return_type == 'function' or return_type == 'func_name' or return_type == 'f_name':
        result_info = f'{func_name}'
    elif return_type == 'lineinfo' or return_type == 'linenum' or return_type == 'lineno':
        result_info = f'{linenumber}'
    elif return_type == 'info_all' or return_type is None:
        result_info = f'{get_filename}({func_name}.{linenumber})'
    else:
        result_info = f'{get_filename}({func_name}.{linenumber})'
    return result_info

################################################################################

### test code


def get_line_info_all():
    cprint(f'get_line_info_all : {line_info(return_type="info_all")}','green')
def get_line_number():
    cprint(f'get_line_number : {line_info(return_type="lineno")}','yellow')
def get_filename():
    cprint(f'get_filename : {line_info(return_type="filename")}','blue')
def get_function_name():
    cprint(f'get_function_name : {line_info(return_type="f_name")}','red')
def get_arg_null():
    cprint(f'get_arg_null : {line_info()}')


### 화면 출력을 위한 함수 호출
get_line_info_all()
get_line_number()
get_filename()
get_function_name()
get_arg_null()

 

반응형