Language/Python

라이브러리 함수의 내부 정의 코드 확인하기

Bicentennial 2023. 10. 5. 13:14

라이브러리를 가져다 쓰면서 함수 내부는 보통 에러가 발생했을 때, 함수의 어느 부분에서 에러가 발생했다는 메시지를 통해 함수 내부 코드를 확인하면서 종종 들여다보게 됩니다.

 

어떻게 동작하는 건지 에러 코드가 가져다 주기 전에 먼저 공부해보고 싶다면 inspect 모듈로 확인이 가능합니다.

 

import tensorflow as tf
import inspect

print(inspect.getsource(tf.keras.preprocessing.image.img_to_array))

지금 작성하던 코드에서 아무 함수나 긁어왔습니다. 불러온 img 파일을 편집할 수 있게 array로 바꿔주는 케라스 함수네요.

 

실행하면 상태창에 바로 출력이 됩니다.

 

@keras_export(
    "keras.utils.img_to_array", "keras.preprocessing.image.img_to_array"
)
def img_to_array(img, data_format=None, dtype=None):
    """Converts a PIL Image instance to a Numpy array.

    Usage:

    ```python
    from PIL import Image
    img_data = np.random.random(size=(100, 100, 3))
    img = tf.keras.utils.array_to_img(img_data)
    array = tf.keras.utils.image.img_to_array(img)
    ```


    Args:
        img: Input PIL Image instance.
        data_format: Image data format, can be either `"channels_first"` or
          `"channels_last"`. Defaults to `None`, in which case the global
          setting `tf.keras.backend.image_data_format()` is used (unless you
          changed it, it defaults to `"channels_last"`).
        dtype: Dtype to use. Default to `None`, in which case the global setting
          `tf.keras.backend.floatx()` is used (unless you changed it, it
          defaults to `"float32"`).

    Returns:
        A 3D Numpy array.

    Raises:
        ValueError: if invalid `img` or `data_format` is passed.
    """

    if data_format is None:
        data_format = backend.image_data_format()
    if dtype is None:
        dtype = backend.floatx()
    if data_format not in {"channels_first", "channels_last"}:
        raise ValueError(f"Unknown data_format: {data_format}")
    # Numpy array x has format (height, width, channel)
    # or (channel, height, width)
    # but original PIL image has format (width, height, channel)
    x = np.asarray(img, dtype=dtype)
    if len(x.shape) == 3:
        if data_format == "channels_first":
            x = x.transpose(2, 0, 1)
    elif len(x.shape) == 2:
        if data_format == "channels_first":
            x = x.reshape((1, x.shape[0], x.shape[1]))
        else:
            x = x.reshape((x.shape[0], x.shape[1], 1))
    else:
        raise ValueError(f"Unsupported image shape: {x.shape}")
    return x


Process finished with exit code 0

활용예시, 인자, 반환값, 에러 케이스등을 설명하고 있습니다.

 

결과물을 빠르게 만들려 함수들을 바쁘게 가져다 쓰다 보면 내부는 들여다볼 생각을 못하게 되는데, 틈틈이 보면서 원리를 이해하며 넘어가면 좋을 것 같습니다.

 

도움이 됐으면 좋겠습니다.

 

감사합니다.