책에 있는 예제 코드를 가지고 내 입맛에 맞게 이리저리 수정하던 도중, for 루프를 돌 때마다 프린트되는 warning 메세지가 신경쓰여서 찾아보았다.
FutureWarning: In a future version of pandas all arguments of concat except for the argument 'objs' will be keyword-only.
라는 경고 메세지였는데 처음 보는 것이어서 의아해했다. 찾아보니 함수의 positional argument와 keywork argument를 혼동해서 사용하는게 문제더라. 파이썬 코어 단에서 경고하는건 아니고, 파이썬의 써드파티인 pandas 패키지에서 추후 이런 식으로 arguments를 혼용하는 것을 허용치 않을 것이기에 이런 식으로 표시해주는 것 같다.
내가 작성했던 기존 코드는
df = pd.concat([df, temp], 0)
이었는데, 아래 코드로 바꿔주니까 더 이상 경고 메세지를 뿜지 않았다.
df = pd.concat([df, temp], axis=0)
이에 대해 조금만 더 자세히 알아보자.
위치 인자와 키워드 인자
아래와 같은 함수가 있다고 하자
def foo(a, b, c):
pass
위치 인자(positional arguments)를 사용하여 함수를 호출하려면 다음과 같이 할 수 있다.
foo(1, 2, 3)
키워드 인자(keywork arguments)를 사용하려면 이렇게 될테고
foo(a=1, b=2, c=3)
또 이 두 가지 방식을 혼용해서 사용하려면 다음과 같이 할 수 있다.
foo(a=1, 2, c=3)
/ 와 * 을 이용하여 구분
이건 나도 블로그 글을 쓰려고 조사하면서 알게 된 내용이다. 파이썬에서 함수 인자 사이에 / 나 * 을 사용하기도 하는데 이들 사이에 있는 인자들의 위치에 따라 위치 인자인지, 키워드 인자인지 정할 수 있다.
/ 앞에 있는 함수 인자들은 위치 인자로만 사용 가능하고, * 이후에 있는 인자들은 키워드 인자로만 사용이 가능하다. 그리고 이 둘 사이에 있는 인자는 위치 인자와 키워드 인자 모두로 사용이 가능하다.
코드를 예로 들어보자.
def foo(a, /, b, *, c)
foo 함수에서 a는 위치 인자로만 사용이 가능하다. 슬래시(/) 앞에 위치해있기 때문이다. c는 키워드 인자로만 사용이 가능하고, b는 위치 인자와 키워드 인자 둘 모두 사용 가능하다.
그렇기 때문에 아래 코드는 에러가 발생하게 된다.
foo(1, 2, 3) # will fail
foo(a=1, b=2, c=3) # will fail
# 에러 예시
TypeError: foo() takes 2 positional arguments but 3 were given
다음 코드는 b가 위치와 키워드 인자 둘 모두 사용 가능하기 때문에 정상적으로 동작한다.
foo(1, 2, c=3) # fine
foo(1, b=2, c=3) # fine
자, 그럼 원점으로 돌아와보자. 'FutureWarning'은 무엇을 의미하는 것일까.
당장 지금은 문제될 것도 없고 정상적으로 동작할 수 있다. 그러나 지금 내가 사용 중인 pandas 패키지에서 추후 obj 매개변수를 제외한 나머지 것들에는 키워드 인자를 의무적으로 붙이도록 계획 중이기 때문에 위와 같은 메세지가 뜨는 것이다. 그렇기 때문에 두 번째 인자 앞에 'axis='만 붙여줘도 문제가 해결되었던 것이고.
물론 이건 파이썬 자체에서 계획 중인게 아니라 써드파티인 pandas 패키지의 정책이기긴 하지만, 앞으로 코드를 작성할 때 위와 같은 부분이 혼동되지 않도록 주의하도록 하자.
참고링크
Why do I get a 'FutureWarning' with pandas.concat?
What does the slash (/) in the parameter list of a function mean in Python?
'파이썬' 카테고리의 다른 글
selenium chrome webdriver 버전 자동관리 패키지 (0) | 2022.05.31 |
---|---|
PyCharm 'Too broad exception clause' warning (0) | 2022.05.31 |
아나콘다 환경에서 사용할 배치파일 만들기 (0) | 2022.05.31 |
Pycharm + 아나콘다 + jupyter notebook 연동하기 (0) | 2022.05.20 |