배경
이번에 rainflow 라는 라이브러리가 업무에 필요하다고 하여 소스코드를 미리 분석하고자하였다.
지금까지 사용했던 파이썬 라이브러리들은 많은 사람들이 사용하는 유명한 라이브러리들이었기에 , 간단한 구글링만으로도 그 사용법과 옵션에 대해 알 수 있었다.
하지만, rainflow의 경우 그 사용 용도가 플랜트 엔지니어링 쪽이다 보니, 관련 정보나 포스팅을 찾기가 어려웠다.
따라서 직접 라이브러리의 소스코드를 읽으면서 사용법을 익히고자 하였다.
물론, 공식 깃허브 레파지토리를 통해서 코드를 공부하는 게 더 효율적이다..ㅎㅎ
과정
dir 과 help
우선 라이브러리 및 내장 모듈의 기본적인 정보를 파악할 수 있는 방법이 있다.
dir( ) 함수는 주어진 객체가 가지고 있는 속성과 메서드의 이름 리스트를 반환해준다.
dir(rainflow)
help( ) 함수는 주어진 객체의 도움말 문서를 보여준다. 객체가 모듈, 함수, 클래스, 메서드 등인 경우 해당 객체의 설명을 출력해준다.
help(rainflow.count_cycles)
inspect 라이브러리
inspect의 getsource 메서드를 사용해서 원하는 함수의 코드를 살펴볼 수 있다.
import inspect
print(inspect.getsource(rainflow.cycle_counts))
## 출력 결과
def count_cycles(series, ndigits=None, nbins=None, binsize=None):
"""Count cycles in the series.
Parameters
----------
series : iterable sequence of numbers
ndigits : int, optional
Round cycle magnitudes to the given number of digits before counting.
Use a negative value to round to tens, hundreds, etc.
nbins : int, optional
Specifies the number of cycle-counting bins.
binsize : int, optional
Specifies the width of each cycle-counting bin
Arguments ndigits, nbins and binsize are mutually exclusive.
Returns
-------
A sorted list containing pairs of range and cycle count.
The counts may not be whole numbers because the rainflow counting
algorithm may produce half-cycles. If binning is used then ranges
correspond to the right (high) edge of a bin.
"""
if sum(value is not None for value in (ndigits, nbins, binsize)) > 1:
raise ValueError(
"Arguments ndigits, nbins and binsize are mutually exclusive"
)
counts = defaultdict(float)
cycles = (
(rng, count)
for rng, mean, count, i_start, i_end in extract_cycles(series)
)
if nbins is not None:
binsize = (max(series) - min(series)) / nbins
if binsize is not None:
nmax = 0
for rng, count in cycles:
quotient = rng / binsize
n = int(math.ceil(quotient)) # using int for Python 2 compatibility
if nbins and n > nbins:
# Due to floating point accuracy we may get n > nbins,
# in which case we move rng to the preceeding bin.
if (quotient % 1) > 1e-6:
raise Exception("Unexpected error")
n = n - 1
counts[n * binsize] += count
nmax = max(n, nmax)
for i in range(1, nmax):
counts.setdefault(i * binsize, 0.0)
elif ndigits is not None:
round_ = _get_round_function(ndigits)
for rng, count in cycles:
counts[round_(rng)] += count
else:
for rng, count in cycles:
counts[rng] += count
return sorted(counts.items())
getsource를 사용하면 소스코드 전체를 보여주기 때문에 help에서 보여주던 문서설명도 같이 볼 수 있다.
'🏷️CS > Python' 카테고리의 다른 글
파이썬의 부동 소수점 연산 (0) | 2023.10.12 |
---|---|
던더 메서드 #1 (0) | 2023.08.24 |
f-string 응용하기 (0) | 2023.08.05 |
[for 와 else 를 같이 사용] (0) | 2023.07.31 |
[정규표현식] re 모듈 (0) | 2023.07.14 |