본문 바로가기
데이터분석과 AI/빅데이터 분석기사

[빅데이터분석기사 실기][작업형1] 모듈, 함수 이름과 사용법이 생각나지 않을 때, dir, help, __all__

by 우공80 2023. 6. 18.
728x90

help, dir, __all__

빅데이터분석기사 등 실기 시험을 볼 때, 모듈이나, 메서드, 속성 등이 생각나지 않을 때가 있습니다. 자주 사용하지만, 복사 & 붙여 넣기 해서 사용했던 코드들은 이런 경우가 많지요.

평상시에는 구글링을 하면 되는데, 시험 보러 가서는 구글링이 안되니, 확인할 방법이 필요합니다. 그럴 때 유용하게 사용할 수 있는 함수가 dir, help입니다. 그리고 __all__ 속성에 대해서도 확인해 보겠습니다.

 

1. dir

dir 함수는 모듈 또는 객체 내에서 사용할 수 있는 속성, 메서드 및 하위 모듈의 이름을 나타내는 문자열 목록을 반환합니다. 모듈이나 객체의 내용을 탐색하는 데 유용하게 사용할 수 있습니다. dir을 사용하기 위해서는 (1) 확인하고자 하는 모듈을 import 하고 (2) dir()에 담아서 확인이 가능합니다.

 

아래와 같이 예시를 들어보겠습니다.

import pandas as pd
print(dir(pd))

Output:

['BooleanDtype', 'Categorical', 'CategoricalDtype', 'CategoricalIndex', 'DataFrame', 
'DateOffset', 'DatetimeIndex', 'DatetimeTZDtype', 'ExcelFile', 'ExcelWriter', 'Float64Index', 
'Grouper', 'HDFStore', 'Index', 'IndexSlice', 'Int16Dtype', 'Int32Dtype', 'Int64Dtype', 
'Int64Index', 'Int8Dtype', 'Interval', 'IntervalDtype', 'IntervalIndex', 'MultiIndex', 
'NA', 'NaT', 'NamedAgg', 'Period', 'PeriodDtype', 'PeriodIndex', 'RangeIndex', 'Series', 
...(중략)...
'pivot_table', 'plotting', 'qcut', 'read_clipboard', 'read_csv', 'read_excel', 'read_feather',
'read_fwf', 'read_gbq', 'read_hdf', 'read_html', 'read_json', 'read_orc', 'read_parquet',
'read_pickle', 'read_sas', 'read_spss', 'read_sql', 'read_sql_query', 'read_sql_table',
'read_stata', 'read_table', 'reset_option', 'set_eng_float_format', 'set_option',
'show_versions', 'test', 'testing', 'timedelta_range', 'to_datetime', 'to_numeric',
'to_pickle', 'to_timedelta', 'tseries', 'unique', 'util', 'value_counts', 'wide_to_long']

보시는 것처럼, pandas의 속성과 함수들이 출력이 됩니다. 한 가지 주의할 점은 import 할 때, alias를 지정한 경우에는 지정한 alias를 사용해야 합니다. 아래와 같이 실행하면 오류가 발생합니다.

 

import pandas as pd
print(dir(pandas))

Output:

NameError                                 Traceback (most recent call last)
<ipython-input-21-4eb0ccbb092a> in <module>
      1 import pandas as pd
      2 
----> 3 print(dir(pandas))

NameError: name 'pandas' is not defined

2. help

help 함수는 모듈, 함수, 클래스, 메서드 또는 파이썬의 다른 객체에 대한 문서나 정보를 표시하는 데 사용됩니다.

아래와 같이 예시를 보겠습니다. 이때, python 내장 함수는 함수명만 쓰면 되지만, 모듈을 import 한 경우에는 모듈명을 붙여주어야 오류가 나지 않습니다.

print(help(pd.qcut))

Output: 

Help on function qcut in module pandas.core.reshape.tile:

qcut(x, q, labels=None, retbins: bool = False, precision: int = 3, duplicates: str = 'raise')
    Quantile-based discretization function.
    
    Discretize variable into equal-sized buckets based on rank or based
    on sample quantiles. For example 1000 values for 10 quantiles would
    produce a Categorical object indicating quantile membership for each data point.
    
    Parameters
    ----------
    x : 1d ndarray or Series
    q : int or list-like of int
        Number of quantiles. 10 for deciles, 4 for quartiles, etc. Alternately
        array of quantiles, e.g. [0, .25, .5, .75, 1.] for quartiles.
    labels : array or False, default None
        Used as labels for the resulting bins. Must be of the same length as
        the resulting bins. If False, return only integer indicators of the
        bins. If True, raises an error.
    retbins : bool, optional
        Whether to return the (bins, labels) or not. Can be useful if bins
        is given as a scalar.
    precision : int, optional
        The precision at which to store and display the bins labels.
    duplicates : {default 'raise', 'drop'}, optional
        If bin edges are not unique, raise ValueError or drop non-uniques.
    
    Returns
    -------
    out : Categorical or Series or array of integers if labels is False
        The return type (Categorical or Series) depends on the input: a Series
        of type category if input is a Series else Categorical. Bins are
        represented as categories when categorical data is returned.
    bins : ndarray of floats
        Returned only if `retbins` is True.
    
    Notes
    -----
    Out of bounds values will be NA in the resulting Categorical object
    
    Examples
    --------
    >>> pd.qcut(range(5), 4)
    ... # doctest: +ELLIPSIS
    [(-0.001, 1.0], (-0.001, 1.0], (1.0, 2.0], (2.0, 3.0], (3.0, 4.0]]
    Categories (4, interval[float64]): [(-0.001, 1.0] < (1.0, 2.0] ...
    
    >>> pd.qcut(range(5), 3, labels=["good", "medium", "bad"])
    ... # doctest: +SKIP
    [good, good, medium, bad, bad]
    Categories (3, object): [good < medium < bad]
    
    >>> pd.qcut(range(5), 4, labels=False)
    array([0, 0, 1, 2, 3])

일반적으로 사용하는 IDE에서 표시되는 tooltip의 내용이 표시됩니다.(docstring)

 

3. __all__

dir과 반환값이 비슷해서 __all__도 비교 설명합니다. dir과 __all__은 용도가 다릅니다.  __all__은 from module import *로 가져온 이름을 제어하고 모듈의 공개 API를 명시적으로 정의하는 데 사용됩니다. 반면에 dir은 공개 및 비공개 이름을 모두 포함하여 개체 내에서 사용할 수 있는 포괄적인 이름 목록을 제공하는 기능입니다. 

 

말로 하면 어려우니, 아래 예시를 보겠습니다.  

import sklearn

print('1. dir의 경우: ',dir(sklearn.model_selection))

print('2. __all__의 경우:',sklearn.model_selection.__all__)

Output:

1. dir의 경우:  ['BaseCrossValidator', 'GridSearchCV', 'GroupKFold', 'GroupShuffleSplit', 
'KFold', 'LeaveOneGroupOut', 'LeaveOneOut', 'LeavePGroupsOut', 'LeavePOut', 'ParameterGrid', 
'ParameterSampler', 'PredefinedSplit', 'RandomizedSearchCV', 'RepeatedKFold', 
'RepeatedStratifiedKFold', 'ShuffleSplit', 'StratifiedKFold', 'StratifiedShuffleSplit', 
'TimeSeriesSplit', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__',
'__name__', '__package__', '__path__', '__spec__', '_search', '_split', '_validation', 
'check_cv', 'cross_val_predict', 'cross_val_score', 'cross_validate', 'fit_grid_point', 
'learning_curve', 'permutation_test_score', 'train_test_split', 'validation_curve']

2. __all__의 경우: ('BaseCrossValidator', 'GridSearchCV', 'TimeSeriesSplit', 'KFold', 
'GroupKFold', 'GroupShuffleSplit', 'LeaveOneGroupOut', 'LeaveOneOut', 'LeavePGroupsOut',
'LeavePOut', 'RepeatedKFold', 'RepeatedStratifiedKFold', 'ParameterGrid', 'ParameterSampler', 
'PredefinedSplit', 'RandomizedSearchCV', 'ShuffleSplit', 'StratifiedKFold', 
'StratifiedShuffleSplit', 'check_cv', 'cross_val_predict', 'cross_val_score', 'cross_validate',
'fit_grid_point', 'learning_curve', 'permutation_test_score', 'train_test_split',
'validation_curve')

위의 결과처럼 dir은 해당 모듈의 하위모듈, 속성이 모두 표시가 되고, __all__의 경우에는 from module import * 로 불러올 수 있는 모듈이나 함수만 표시됩니다.

따라서  dir의 결과가 __all__의 결과를 모두 포함하고, 우리가 사용하고자 하는 함수는 __all__에 다 포함되어 있을 테니, __all__을 보아도 무방합니다. 대신 __all__은 모듈 내에 정의되어 있는 변수로서, 해당 변수가 정의되지 않은 모듈은 사용이 불가능한 경우가 있습니다.

print(pd.__all__)

Output: __all__이 정의되어있지 않으면 아래와 같이 오류가 발생합니다.

AttributeError                            Traceback (most recent call last)
<ipython-input-43-30685f78c384> in <module>
----> 1 print(pd.__all__)

~\anaconda3\lib\site-packages\pandas\__init__.py in __getattr__(name)
    261             return _SparseArray
    262 
--> 263         raise AttributeError(f"module 'pandas' has no attribute '{name}'")
    264 
    265 

AttributeError: module 'pandas' has no attribute '__all__'

 

※ 위 내용은 "빅데이터 분석기사 실기 준비를 위한 캐글 놀이터"를 따라가며 공부한 내용입니다.

https://www.kaggle.com/datasets/agileteam/bigdatacertificationkr

 

Big Data Certification KR

빅데이터 분석기사 실기 (Python, R tutorial code)

www.kaggle.com

 

728x90

댓글